diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 69b5f38..f04863e 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -19,6 +19,19 @@ reference: paths: - build/** +bullseye-jdk11: + image: debian:bullseye-backports + script: + - apt-get update + - apt-get -y install openjdk-11-jdk-headless gradle sdkmanager + - yes | sdkmanager --licenses >/dev/null || true + - gradle build --stacktrace + - gradle --version + artifacts: + name: oeffi-$CI_JOB_NAME-$CI_COMMIT_REF_SLUG-$CI_COMMIT_SHORT_SHA + paths: + - oeffi/build/outputs/apk/**/*.apk + bookworm-jdk17: image: debian:bookworm-slim script: @@ -31,3 +44,29 @@ bookworm-jdk17: name: oeffi-$CI_JOB_NAME-$CI_COMMIT_REF_SLUG-$CI_COMMIT_SHORT_SHA paths: - oeffi/build/outputs/apk/**/*.apk + +jammy-jdk11: + image: ubuntu:jammy + script: + - apt-get update + - apt-get -y install openjdk-11-jdk-headless gradle sdkmanager + - yes | sdkmanager --licenses >/dev/null || true + - gradle build --stacktrace + - gradle --version + artifacts: + name: oeffi-$CI_JOB_NAME-$CI_COMMIT_REF_SLUG-$CI_COMMIT_SHORT_SHA + paths: + - oeffi/build/outputs/apk/**/*.apk + +lunar-jdk17: + image: ubuntu:lunar + script: + - apt-get update + - apt-get -y install openjdk-17-jdk-headless gradle sdkmanager + - yes | sdkmanager --licenses >/dev/null || true + - gradle build --stacktrace + - gradle --version + artifacts: + name: oeffi-$CI_JOB_NAME-$CI_COMMIT_REF_SLUG-$CI_COMMIT_SHORT_SHA + paths: + - oeffi/build/outputs/apk/**/*.apk diff --git a/build.Containerfile b/build.Containerfile index a52d6b8..0774630 100644 --- a/build.Containerfile +++ b/build.Containerfile @@ -14,15 +14,12 @@ # directory. Use `apksigner` to sign before installing via `adb install`. # -FROM debian:bookworm-slim AS build-stage +FROM debian:bullseye-backports AS build-stage # install debian packages ENV DEBIAN_FRONTEND noninteractive -RUN --mount=target=/var/lib/apt/lists,type=cache,sharing=locked \ - --mount=target=/var/cache/apt,type=cache,sharing=locked \ - /bin/rm -f /etc/apt/apt.conf.d/docker-clean && \ - /usr/bin/apt-get update && \ - /usr/bin/apt-get --yes --no-install-recommends install disorderfs openjdk-17-jdk-headless gradle sdkmanager && \ +RUN /usr/bin/apt-get update && \ + /usr/bin/apt-get --yes install disorderfs openjdk-11-jdk-headless gradle sdkmanager && \ /bin/ln -fs /usr/share/zoneinfo/CET /etc/localtime && \ /usr/sbin/dpkg-reconfigure --frontend noninteractive tzdata && \ /bin/ln -s /proc/self/mounts /etc/mtab && \ @@ -37,13 +34,10 @@ COPY --chown=builder / project/ # accept SDK licenses ENV ANDROID_HOME /home/builder/android-sdk -RUN --mount=target=/home/builder/android-sdk,type=cache,uid=1000,gid=1000,sharing=locked \ - yes | /usr/bin/sdkmanager --licenses >/dev/null +RUN yes | /usr/bin/sdkmanager --licenses >/dev/null # build project -RUN --mount=target=/home/builder/android-sdk,type=cache,uid=1000,gid=1000,sharing=locked \ - --mount=target=/home/builder/.gradle,type=cache,uid=1000,gid=1000,sharing=locked \ - if [ -e /dev/fuse ] ; \ +RUN if [ -e /dev/fuse ] ; \ then /bin/mv project project.u && /bin/mkdir project && \ /usr/bin/disorderfs --sort-dirents=yes --reverse-dirents=no project.u project ; \ fi && \ @@ -54,4 +48,4 @@ RUN --mount=target=/home/builder/android-sdk,type=cache,uid=1000,gid=1000,sharin # export build output FROM scratch AS export-stage -COPY --from=build-stage /home/builder/project/oeffi/build/outputs/apk/release/oeffi-release-unsigned.apk / +COPY --from=build-stage /home/builder/project/oeffi/build/outputs/apk/*/release/oeffi-*-release-unsigned.apk / diff --git a/oeffi/AndroidManifest.xml b/oeffi/AndroidManifest.xml index b68ae87..da34bed 100644 --- a/oeffi/AndroidManifest.xml +++ b/oeffi/AndroidManifest.xml @@ -20,12 +20,12 @@ xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" package="de.schildbach.oeffi" - android:versionCode="130011" - android:versionName="13.0.11"> + android:versionCode="120117" + android:versionName="12.1.17"> + android:minSdkVersion="21" + android:targetSdkVersion="34" /> @@ -116,8 +116,8 @@ android:exported="true" android:configChanges="keyboard|keyboardHidden" android:label="@string/station_details_activity_title" - android:taskAffinity="de.schildbach.oeffi.stations" - android:showWhenLocked="true" /> + android:taskAffinity="de.schildbach.oeffi.stations"> + + android:taskAffinity="de.schildbach.oeffi.directions" /> + android:theme="@style/My.Theme.Fullscreen"> diff --git a/oeffi/CHANGES b/oeffi/CHANGES index 7b8aec2..0c93ee2 100644 --- a/oeffi/CHANGES +++ b/oeffi/CHANGES @@ -1,30 +1,3 @@ -v13.0.11 - -* Add region again: Poland (PKP) - -v13.0.4-v13.0.10 - -* Target Android 15. - -v13.0.3 - -* Remove regions: Czech Republic, Italy, Paris, Spain, Nicaragua - -v13.0.2 - -* Remove region: Finland - -v13.0-v13.0.1 - -* Running the app now requires Android 7.0 (Nougat) or higher. -* Building the app now requires OpenJDK 17. -* Remove `google` flavor. -* Git: rename `master` to `main` branch. - -v12.1.18-v12.1.21 - -* Remove region: Belgium (SNCB) - v12.1.15-v12.1.17 * Migrate region Augsburg from EFA to Hafas diff --git a/oeffi/assets/networks.txt b/oeffi/assets/networks.txt index 367e768..d13c8b3 100644 --- a/oeffi/assets/networks.txt +++ b/oeffi/assets/networks.txt @@ -45,10 +45,25 @@ VVT|de-AT|Tirol|disabled SVV|de-AT|Salzburg|disabled VMOBIL|de-AT|Vorarlberg;Bregenz|disabled +# CZ +CZECH_REPUBLIC|cs-CZ|Tschechien;Praha;Prag|beta + # CH VBL|de-CH|Luzern ZVV|de-CH|Zürich +# IT +IT|it-IT|IT|alpha + +# FR +PARIS|fr-FR|FR|alpha + +# ES +SPAIN|es-ES|ES|alpha + +# BE +SNCB|be-BE|BE|alpha + # LU LU|lb-LU|LU;Luxemburg @@ -61,13 +76,13 @@ DSB|da-DK|DK;København # SE SE|sv-SE|SE;Stockholm +# FI +FINLAND|fi-FI|FI;Helsinki|beta + # GB TLEM|en-UK|GB;Greater London;Derbyshire;Leicestershire;Rutland;Northamptonshire;Nottinghamshire;Lincolnshire;Berkshire;Buckinghamshire;East Sussex;Hampshire;Isle of Wight;Kent;Oxfordshire;Surrey;West Sussex;Essex;Hertfordshire;Bedfordshire;Cambridgeshire;Norfolk;Suffolk;Somerset;Gloucestershire;Wiltshire;Dorset;Devon;Cornwall;West Devon;Stowford;Eastleigh;Swindon;Gloucester;Plymouth;Torbay;Bournemouth;Poole;Birmingham MERSEY|en-UK|GB;Liverpool|beta -# PL -PL|pl-PL|PL;Warschau - # AE DUB|ae-AE|AE;Dubai|beta @@ -79,3 +94,6 @@ CMTA|us-US|US;Texas;Austin|beta # AU SYDNEY|en-AU|AU;New South Wales;Sydney MET|en-AU|AU;Victoria;Melbourne|disabled + +# NI +NICARAGUA|es-NI|NI;Managua|beta diff --git a/oeffi/assets/plans-index.txt b/oeffi/assets/plans-index.txt index c4bb1a5..43f896d 100644 --- a/oeffi/assets/plans-index.txt +++ b/oeffi/assets/plans-index.txt @@ -3,11 +3,11 @@ # de -berlin_bsu_ab|52.520134,13.388018|2022-12-11|Berlin S+U-Bahn-Netz (AB)|Berliner Verkehrsbetriebe||BVG -berlin_bsu_abc|52.520134,13.388018|2022-12-11|Berlin S+U-Bahn-Netz (ABC)|Berliner Verkehrsbetriebe||BVG -berlin_tram|52.521152,13.412832|2022-12-16|Berlin Tram-Netz|Berliner Verkehrsbetriebe||BVG -berlin_bus|52.5071378,13.3318680|2022-12-09|Berlin Bus-Netz|Berliner Verkehrsbetriebe||BVG -berlin_nacht|52.520134,13.388018|2022-12-09|Berlin Nachtverkehr (geografisch)|Berliner Verkehrsbetriebe||BVG +berlin_bsu_ab|52.520134,13.388018|2020-10-31|Berlin S+U-Bahn-Netz (AB)|Berliner Verkehrsbetriebe||BVG +berlin_bsu_abc|52.520134,13.388018|2019-10-31|Berlin S+U-Bahn-Netz (ABC)|Berliner Verkehrsbetriebe||BVG +berlin_tram|52.521152,13.412832|2020-04-14|Berlin Tram-Netz|Berliner Verkehrsbetriebe||BVG +berlin_bus|52.5071378,13.3318680|2019-12-15|Berlin Bus-Netz|Berliner Verkehrsbetriebe||BVG +berlin_nacht|52.520134,13.388018|2020-10-31|Berlin Nachtverkehr (geografisch)|Berliner Verkehrsbetriebe||BVG berlin_transitmap|52.520134,13.388018|2018-12-09|New Berlin rapid transit route map|berlintransitmap.de berlin_anbindung_ber|52.363127,13.50498|2020-11|BER (Flughafen Berlin Brandenburg) Anbindung|Robert Aehnelt, Creative Commons|https://upload.wikimedia.org/wikipedia/commons/e/e0/BER_Anbindung_2020.jpg brandenburg_regionalverkehr|52.525578,13.369523|2019-12-15|Brandenburg Regionalverkehr|Verkehrsverbund Berlin-Brandenburg||VBB @@ -32,7 +32,6 @@ leipzig_tag|51.345476,12.379382|2020-11-18|Leipzig Linien Tag|Leipziger Verkehrs leipzig_nacht|51.345476,12.379382|2020-11-18|Leipzig Linien Nacht|Leipziger Verkehrsbetriebe GmbH halle_tag|51.477347,11.985263|2020-08-27|Halle Linien Tag|SWH/HAVAG halle_nacht|51.477347,11.985263|2020-08-27|Halle Linien Nacht|SWH/HAVAG -jena|50.9248984,11.587666|2024|Jena|Jenaer Nahverkehr GmbH muenchen_schnellbahn|48.140377,11.560643|2019-12|München Schnellbahn|MVV muenchen_tram_metrobus|48.140377,11.560643|2019-12-15|München Tram/MetroBus|MVV/MVG muenchen_nacht|48.140377,11.560643|2019-12-15|München Nachtnetz|MVG @@ -43,10 +42,10 @@ augsburg|48.364936,10.893713|2018-12|Augsburg Innenraum|AVV GmbH augsburg_nachtbus|48.364936,10.893713|2018-12|Augsburg Nachtbus|AVV GmbH ulm_stadt|48.398610,9.983322|2018-12|Ulm / Neu-Ulm Stadtnetz|Donau-Iller-Nahverkehrsverbund GmbH ulm_regional|48.398610,9.983322|2018-11-02|Ulm Regionalnetz|Donau-Iller-Nahverkehrsverbund GmbH -nuernberg_gesamtraum|49.445719,11.082618|2024-01-01|Nürnberg Schienennetz Gesamtraum|Verkehrsverbund Großraum Nürnberg||VGN -nuernberg_verkehrsnetz|49.445719,11.082618|2023-12-10|Nürnberg-Fürth Liniennetz|Verkehrsverbund Großraum Nürnberg||VGN -nuernberg_schiene|49.445719,11.082618|2023-12-10|Nürnberg-Fürth Schienennetz|Verkehrsverbund Großraum Nürnberg||VGN -nuernberg_nightliner|49.445719,11.082618|2023-12|Nürnberg-Fürth Nightliner|Verkehrsverbund Großraum Nürnberg||VGN +nuernberg_gesamtraum|49.445719,11.082618|2018-01-01|Nürnberg Schienennetz Gesamtraum|Verkehrsverbund Großraum Nürnberg||VGN +nuernberg_verkehrsnetz|49.445719,11.082618|2019-12-01|Nürnberg, Fürth, Stein Verkehrsnetz|Verkehrsverbund Großraum Nürnberg||VGN +nuernberg_schiene|49.445719,11.082618|2019-12-01|Nürnberg, Fürth Schienennetz|Verkehrsverbund Großraum Nürnberg||VGN +nuernberg_nightliner|49.445719,11.082618|2019-12-01|Nürnberg, Fürth Nightliner|Verkehrsverbund Großraum Nürnberg||VGN fuerth_verkehrsnetz|49.469832,10.990178|2019-12-01|Fürth Verkehrsnetz|Verkehrsverbund Großraum Nürnberg||VGN fuerth_nightliner|49.469832,10.990178|2016-12-11|Fürth Nightliner|Verkehrsverbund Großraum Nürnberg||VGN erlangen_verkehrsnetz|49.595851,11.001701|2019-12-01|Erlangen Verkehrsnetz|Verkehrsverbund Großraum Nürnberg||VGN @@ -60,26 +59,26 @@ regensburg_nacht|49.011489,12.09971|2018-04-14|Regensburg Nachtbus|Regensburger bremen|53.08319,8.81360|2020-03|Bremen Liniennetz|BSAG bremen_nacht|53.08319,8.81360||Bremen Nachtnetz|BSAG bremen_stadt|53.08319,8.81360|2020-02|Bremen Stadtnetz (geografisch)|BSAG -hamburg_usar|53.552946,10.006782|2023-12-10|Hamburg Schnellbahn/Regional|HVV -hamburg_metrobus_gross|53.552946,10.006782|2023-12-10|Hamburg MetroBus Liniennetz|HVV -hamburg_region|53.552946,10.006782|2023-12-10|Hamburg Regionalverkehr|HVV -hamburg_weiss_bus|53.552946,10.006782|2024-01-08|Hamburg Busliniennetz|Lucas Weiss -kiel_liniennetz|54.313282,10.132341|2023-12|Kiel Liniennetz|KVG -kiel_nacht|54.313282,10.132341|2022-12|Kiel Nachtliniennetz|KVG +hamburg_usar|53.552946,10.006782|2022-01-01|Hamburg Schnellbahn/Regional|HVV +hamburg_metrobus_gross|53.552946,10.006782|2021-12-12|Hamburg MetroBus Liniennetz|HVV +hamburg_region|53.552946,10.006782|2022-01-01|Hamburg Regionalverkehr|HVV +hamburg_weiss_bus|53.552946,10.006782|2021-12-12|Hamburg Busliniennetz|Lucas Weiss +kiel_liniennetz|54.313282,10.132341|2019-12|Kiel Liniennetz|KVG +kiel_nacht|54.313282,10.132341|2019-12|Kiel Nachtliniennetz|KVG luebeck_region|53.858795,10.664646|2018-12-09|Lübeck Liniennetz Region|LVG, nah.sh, Stadtverkehr Lübeck||SH -rostock_vvw_liniennetz|54.078139,12.131724|2023-08-28|Rostock Liniennetz|Verkehrsverbund Warnow -rostock_vvw_region|54.078139,12.131724|2023-08-28|Rostock Region|Verkehrsverbund Warnow -rostock_region|54.078139,12.131724|2023-12-10|Rostock und Umgebung|Lucas Weiss, CC-BY-NC-SA 4.0 +rostock_vvw_liniennetz|54.078139,12.131724|2022-08-05|Rostock Liniennetz|Verkehrsverbund Warnow +rostock_vvw_region|54.078139,12.131724|2022-01-01|Rostock Region|Verkehrsverbund Warnow +rostock_region|54.078139,12.131724|2022-08-15|Rostock und Umgebung|Lucas Weiss, CC-BY-NC-SA 4.0 wismar|53.903943,11.391928||Wismar Stadtverkehr|NAHBUS Nordwestmecklenburg GmbH nordwestmecklenburg|53.903943,11.391928|2016-03-14|Nordwestmecklenburg Busnetz|NAHBUS Nordwestmecklenburg GmbH osnabrueck|52.272832,8.061726|2018-08-09|Osnabrück Liniennetz|Stadtwerke Osnabrück osnabrueck_nacht|52.272832,8.061726|2018-08-09|Osnabrück NachtBus-Netz|Stadtwerke Osnabrück -stuttgart_verbund|48.784068,9.181713|2023-12|Stuttgart Verbund-Liniennetz|Verkehrs- und Tarifverbund Stuttgart GmbH -stuttgart_nacht|48.77861,9.179803|2023-12|Stuttgart Nachtverkehr|Verkehrs- und Tarifverbund Stuttgart GmbH +stuttgart_verbund|48.784068,9.181713|2018-12|Stuttgart Verbund-Liniennetz|Verkehrs- und Tarifverbund Stuttgart GmbH +stuttgart_nacht|48.77861,9.179803|2018-12|Stuttgart Nachtverkehr|Verkehrs- und Tarifverbund Stuttgart GmbH ringzug|48.113621,8.660603|2013-08|Ringzug|Zweckverband Ringzug -hannover_stadtbahn|52.376715,9.741168|2023-12-10|Hannover Stadtbahnnetz|GVH -hannover_bus|52.376715,9.741168|2023-12-10|Hannover Busnetz|GVH -hannover_regional|52.376715,9.741168|2023-12-10|Hannover Regional- und S-Bahn-Linien|GVH +hannover_stadtbahn|52.376715,9.741168|2021-12|Hannover Stadtbahnnetz|GVH +hannover_bus|52.376715,9.741168|2021-12|Hannover Busnetz|GVH +hannover_regional|52.376715,9.741168|2021-12|Hannover Regional- und S-Bahn-Linien|GVH celle_stadt|52.620411,10.059814|2019-01|Celle Liniennetz Stadt|CeBus celle_region|52.620411,10.059814|2018-01|Celle Liniennetz Region|CeBus goettingen|51.536290,9.926981|2019-12-15|Göttingen Liniennetz|Göttinger Verkehrsbetriebe GmbH @@ -90,24 +89,16 @@ bielefeld_netz|52.029241,8.532835|2018-06|Bielefeld Netzplan (geografisch)|moBie essen_schiene|51.451355,7.014793|2015-06-14|Essen SchienenNetz|EVAG essen_tag|51.451355,7.014793|2015-06-14|Essen TagNetz|EVAG essen_nacht|51.451355,7.014793|2013-06-09|Essen NachtNetz|EVAG -dortmund_schiene|51.517843,7.459272|2023-01|Dortmund Schienennetz|DSW21 -dortmund_tag|51.517843,7.459272|2023-12|Dortmund Netzplan Tag|DSW21 -dortmund_nacht|51.517843,7.459272|2021-01|Dortmund Netzplan Nacht|DSW21 -krefeld_stadt|51.323714,6.565800|2021-05|Krefeld Liniennetz Stadt|SWK/VRR -krefeld_stadt_nacht|51.323714,6.565800|2021-05|Krefeld Nachtnetz|SWK/VRR +krefeld_stadt|51.323714,6.565800|2013-06|Krefeld Liniennetz Stadt|SWK/VRR +krefeld_stadt_nacht|51.323714,6.565800|2013-06|Krefeld Nachtnetz|SWK/VRR frankfurt_liniennetz|50.106318,8.662139|2020-12-13|Frankfurt am Main Liniennetz|traffiQ frankfurt_flughafen_bus|50.037936,8.559958|2020-12-13|Frankfurt Flughafen Buslinien|traffiQ -gelsenkirchen_linienplan_tag|51.504768,7.102298|2023-01|Gelsenkirchen Linienplan Tag|Vestische -gelsenkirchen_linienplan_nacht|51.504768,7.102298|2023-01|Gelsenkirchen Linienplan Nacht|Vestische -recklinghausen_linienplan|51.616096,7.203273|2023-06|Recklinghausen Linienplan|Vestische -waltrop_linienplan|51.622799,7.390409|2022-08|Waltrop Linienplan|Vestische rmv_schnellbahn|50.106318,8.662139|2020-12-13|Rhein-Main Schnellbahn|RMV rmv_regional|50.106318,8.662139|2020-12-13|Rhein-Main Regional|RMV rmv_nacht|50.106318,8.662139|2020-12-13|Rhein-Main Nachtnetz|RMV mainz|50.001395,8.258818|2019-12-15|Mainz Tag|Mainzer Verkehrsgesellschaft mbH mainz_nacht|50.001395,8.258818|2019-12-15|Mainz Nacht|Mainzer Verkehrsgesellschaft mbH koeln_schnellverkehr|50.943579,6.95796|2019-12-15|Köln Schnellverkehr|Verkehrsverbund Rhein-Sieg GmbH -koeln_stadtbahn|50.943579,6.95796|2024-04-02|Köln Stadtbahn|Kölner Verkehrs-Betriebe AG koeln_bus|50.943579,6.95796|2019-12-15|Köln Busnetz|Verkehrsverbund Rhein-Sieg GmbH bonn_schnellverkehr|50.732784,7.096447|2019-12-15|Bonn Schnellverkehr|Verkehrsverbund Rhein-Sieg GmbH bonn_bus|50.732784,7.096447|2019-12-15|Bonn Busnetz|Verkehrsverbund Rhein-Sieg GmbH @@ -115,29 +106,29 @@ leverkusen_bus|51.036197,6.994385|2019-12-15|Leverkusen Busnetz|Verkehrsverbund nrw_regio|51.429807,6.775253|2016-12|NRW Busse & Bahnen|VRS aachen_schnellverkehr|50.768399,6.090705|2018-12|Aachen Schnellverkehr|Aachener Verkehrsverbund GmbH||AVV_AACHEN aachen_region|50.768399,6.090705|2018-12|Aachen Region, Bus und Bahn|Aachener Verkehrsverbund GmbH||AVV_AACHEN -darmstadt|49.872582,8.630916|2023-12-10|Darmstadt Stadt|Darmstadt-Dieburger Nahverkehrsorganisation -darmstadt_nacht|49.872582,8.630916|2023-12-10|Darmstadt NightLiner|Darmstadt-Dieburger Nahverkehrsorganisation -darmstadt_region|49.872582,8.630916|2023-12-10|Darmstadt-Dieburg Region|Darmstadt-Dieburger Nahverkehrsorganisation -duesseldorf|51.230794,6.769025|2024-01-07|Düsseldorf Liniennetz|Rheinbahn -duesseldorf_nacht|51.230794,6.769025|2024-01-07|Düsseldorf Nachtlinien|Rheinbahn +darmstadt|49.872582,8.630916|2021-12-12|Darmstadt Stadt|Darmstadt-Dieburger Nahverkehrsorganisation +darmstadt_nacht|49.872582,8.630916|2021-12-12|Darmstadt NightLiner|Darmstadt-Dieburger Nahverkehrsorganisation +darmstadt_region|49.872582,8.630916|2021-12-12|Darmstadt-Dieburg Region|Darmstadt-Dieburger Nahverkehrsorganisation +duesseldorf|51.230794,6.769025|2018-08-29|Düsseldorf Liniennetz|Rheinbahn +duesseldorf_nacht|51.230794,6.769025|2018-08-29|Düsseldorf Nachtlinien|Rheinbahn duisburg|51.428813,6.772554|2018-03-01|Duisburg Liniennetz|DVG/VRR schwerin|53.634476,11.407313|2018-07|Schwerin Liniennetz|Nahverkehr Schwerin GmbH magdeburg_tag|52.130783,11.627347|2021-12-24|Magdeburg Liniennetz|Magdeburger Verkehrsbetriebe GmbH & Co. KG magdeburg_nacht|52.130783,11.627347|2021-12-24|Magdeburg Nacht-Liniennetz|Magdeburger Verkehrsbetriebe GmbH & Co. KG magdeburg_verbund|52.130783,11.627347|2020-12|Magdeburg Verbund-Liniennetz|Nahverkehrsservice Sachsen-Anhalt GmbH -hagen|51.362675,7.461087|2024-01-08|Hagen Liniennetz|Hagener Straßenbahn AG -hagen_nacht|51.362675,7.461087|2024-01-08|Hagen Nachtnetz|Hagener Straßenbahn AG -braunschweig_gesamt|52.252187,10.539705|2024-03-18|Braunschweig Liniennetz|Braunschweiger Verkehrs-GmbH -braunschweig_nacht|52.252187,10.539705|2024-03-18|Braunschweig Nachtnetz|Braunschweiger Verkehrs-GmbH +hagen|51.362675,7.461087|2022-06-12|Hagen Liniennetz|Hagener Straßenbahn AG +hagen_nacht|51.362675,7.461087|2022-06-12|Hagen Nachtnetz|Hagener Straßenbahn AG +braunschweig_gesamt|52.252187,10.539705|2021-04-11|Braunschweig Liniennetz|Braunschweiger Verkehrs-GmbH +braunschweig_nacht|52.252187,10.539705|2021-04-11|Braunschweig Nachtnetz|Braunschweiger Verkehrs-GmbH salzgitter|52.15116,10.332488|2017-12|Salzgitter Liniennetz|KVG Braunschweig wolfenbuettel|52.15898,10.532012|2021-10|Wolfenbüttel Liniennetz|KVG Braunschweig helmstedt|52.222331,11.010690|2015-12|Helmstedt Liniennetz|KVG Braunschweig harz|51.888518,10.554843|2018-06|Harz Liniennetz|KVG Braunschweig wolfsburg|52.429484,10.788249|2018-08-09|Wolfsburg Liniennetz|WVG -karlsruhe_liniennetz|48.993988,8.400328|2022-12-11|Karlsruhe Liniennetz|Karlsruher Verkehrsverbund||KVV +karlsruhe_liniennetz|48.993988,8.400328|2021-12-12|Karlsruhe Liniennetz|Karlsruher Verkehrsverbund||KVV karlsruhe_rolli|48.993988,8.400328|2021-12-12|Karlsruhe für mobilitätseingeschränkte Personen|Karlsruher Verkehrsverbund||KVV karlsruhe_regio|48.993988,8.400328|2020-12-13|Karlsruhe Regionalverkehr|Karlsruher Verkehrsverbund||KVV -karlsruhe_bus|49.009498,8.404073|2022-12-11|Karlsruhe Busnetz|Karlsruher Verkehrsverbund||KVV +karlsruhe_bus|49.009498,8.404073|2021-12-12|Karlsruhe Busnetz|Karlsruher Verkehrsverbund||KVV karlsruhe_nightliner|49.009498,8.404073|2020-11-28|Karlsruhe Nightliner|Karlsruher Verkehrsverbund||KVV badenbaden_busnetz|48.79014,8.19126|2021-02-18|Rastatt (Südlicher Landkreis) und Baden-Baden Busnetz|Karlsruher Verkehrsverbund||KVV rastatt_busnetz|48.86065,8.21525|2021-02-18|Karlsruhe (Südlicher Landkreis) und Rastatt (Nördlicher Landkreis) Busnetz|Karlsruher Verkehrsverbund||KVV @@ -157,8 +148,8 @@ rhein_neckar_regio|49.481844,8.459115|2019-11|Rhein-Neckar Regionalverkehr|RNV G # at -linz|48.290893,14.291965|2024-01|Linz Verkehrslinienplan|Linz AG -linz_nacht|48.290893,14.291965|2024-01|Linz Nachtverkehr|Linz AG +linz|48.290893,14.291965|2018-10|Linz Verkehrslinienplan|Linz AG +linz_nacht|48.290893,14.291965|2016-12|Linz Nachtverkehr|Linz AG innsbruck_liniennetz|47.26332,11.400951|2021|Innsbruck Liniennetz|Innsbrucker Verkehrsbetriebe GmbH innsbruck_tram|47.26332,11.400951|2012-12-15|Innsbruck Straßenbahn|Steve Stipsits|http://www.public-transport.at/netzplan_innsbruck_gross_aktuell.gif graz|47.073371,15.416154|2018-09-08|Graz Liniennetz|Verbund Linie @@ -233,7 +224,7 @@ istanbul_rail|41.011939,28.984308|2015-09|Istanbul Rail Transit|Maximilian Dörr # uk -london_tube|51.513507,-0.110264|2023-05|London Tube|TfL +london_tube|51.513507,-0.110264|2016-06|London Tube|TfL london_overground|51.513507,-0.110264|2016-05|London Overground|TfL london_rail|51.513507,-0.110264|2016-05|London Rail & Tube Services|TfL london_bus|51.513507,-0.110264|2016|London Bus (geographical)|TfL @@ -253,7 +244,7 @@ napoli_region|40.852780,14.271692||Napoli Region|Unico Campania # fr -paris_metro_ratp|48.855414,2.34488|2022-12|Paris Metro|RATP +paris_metro_ratp|48.855414,2.34488|2014-01|Paris Metro|RATP paris_metro|48.855414,2.34488|2012-12|Paris Metro|Nathan Kaufmann, Creative Commons # po @@ -289,7 +280,7 @@ losangeles_system|34.05427,-118.246715|2016-06|Los Angeles System|metro.net losangeles_downtown|34.05427,-118.246715|2016-06|Los Angeles Downtown|metro.net losangeles_metro|34.05427,-118.246715|2016-05|Los Angeles Metro|metro.net|https://media.metro.net/riding_metro/maps/images/rail_map.gif losangeles_metro_metrolink|34.05427,-118.246715|2016-11|Los Angeles Metro & Rail|metro.net|https://media.metro.net/riding_metro/maps/images/metro_regionalrail_map.gif -newyork_subway|40.738452,-73.991919|2023-02|New York Subway (geographical)|MTA +newyork_subway|40.738452,-73.991919|2010-12|New York Subway (geographical)|MTA philadelphia_regional|39.957386,-75.180488|2012-06|Philadelphia Regional Train & Rail Transit|SEPTA chicago_downtown|41.878674,-87.640333|2016-02|Chicago Downtown|RTA Chicago chicago_trains|41.878674,-87.640333|2015-03|Chicago Train Connections|RTA Chicago diff --git a/oeffi/build.gradle b/oeffi/build.gradle index 2356b7b..ebb28f1 100644 --- a/oeffi/build.gradle +++ b/oeffi/build.gradle @@ -12,22 +12,19 @@ configurations { } dependencies { - implementation(project(':public-transport-enabler')) { - exclude group: 'org.slf4j', module: 'slf4j-api' - } - implementation 'androidx.annotation:annotation:1.8.2' + implementation project(':public-transport-enabler') + implementation 'androidx.annotation:annotation:1.7.1' implementation 'androidx.recyclerview:recyclerview:1.3.2' implementation 'androidx.coordinatorlayout:coordinatorlayout:1.2.0' implementation 'androidx.drawerlayout:drawerlayout:1.2.0' - implementation 'androidx.core:core:1.13.1' - implementation 'androidx.activity:activity:1.9.3' + implementation 'androidx.core:core:1.12.0' + implementation 'androidx.activity:activity:1.8.2' //noinspection GradleDependency implementation 'com.squareup.okhttp3:okhttp:3.12.13' //noinspection GradleDependency implementation 'com.squareup.okhttp3:logging-interceptor:3.12.13' - implementation 'com.google.guava:guava:33.4.0-android' - implementation 'org.osmdroid:osmdroid-android:6.1.20' - //noinspection GradleDependency + implementation 'com.google.guava:guava:32.1.3-android' + implementation 'org.osmdroid:osmdroid-android:6.1.17' implementation 'org.slf4j:slf4j-api:2.0.9' implementation 'com.github.tony19:logback-android:3.0.0' testImplementation 'junit:junit:4.13.2' @@ -35,7 +32,7 @@ dependencies { android { compileSdkVersion 'android-34' - buildToolsVersion '35.0.0' + buildToolsVersion '34.0.0' defaultConfig { generatedDensities = ['hdpi', 'xhdpi'] @@ -53,6 +50,18 @@ android { } } + flavorDimensions 'flavor' + productFlavors { + aosp { + dimension 'flavor' + versionNameSuffix '-aosp' + } + google { + dimension 'flavor' + versionNameSuffix '-google' + } + } + sourceSets { main { manifest.srcFile 'AndroidManifest.xml' @@ -63,6 +72,12 @@ android { test { java.srcDirs = ['test'] } + aosp { + java.srcDirs = ['src-aosp'] + } + google { + java.srcDirs = ['src-google'] + } } compileOptions { diff --git a/oeffi/proguard.cfg b/oeffi/proguard.cfg index 8df31dd..8253ee2 100644 --- a/oeffi/proguard.cfg +++ b/oeffi/proguard.cfg @@ -55,7 +55,6 @@ -dontwarn androidx.lifecycle.SavedStateHandle -dontwarn androidx.activity.Api34Impl -dontwarn androidx.activity.BackEventCompat --dontnote androidx.activity.ImmLeaksCleaner$Companion$** -dontwarn androidx.core.view.accessibility.AccessibilityNodeInfoCompat$AccessibilityActionCompat -dontwarn androidx.**$Api34Impl,androidx.**$Api34Impl$** diff --git a/oeffi/res/drawable-xhdpi/network_nri_icon.png b/oeffi/res/drawable-xhdpi/network_nri_icon.png new file mode 100644 index 0000000..0b5115b Binary files /dev/null and b/oeffi/res/drawable-xhdpi/network_nri_icon.png differ diff --git a/oeffi/res/drawable-xhdpi/network_pl_icon.png b/oeffi/res/drawable-xhdpi/network_pl_icon.png new file mode 100644 index 0000000..58f18d4 Binary files /dev/null and b/oeffi/res/drawable-xhdpi/network_pl_icon.png differ diff --git a/oeffi/res/drawable-xhdpi/network_sncb_icon.png b/oeffi/res/drawable-xhdpi/network_sncb_icon.png new file mode 100644 index 0000000..67edda3 Binary files /dev/null and b/oeffi/res/drawable-xhdpi/network_sncb_icon.png differ diff --git a/oeffi/res/drawable-xhdpi/network_tfi_icon.png b/oeffi/res/drawable-xhdpi/network_tfi_icon.png new file mode 100644 index 0000000..fac162c Binary files /dev/null and b/oeffi/res/drawable-xhdpi/network_tfi_icon.png differ diff --git a/oeffi/res/layout/plans_content.xml b/oeffi/res/layout/plans_content.xml index 58d2e48..cf96dae 100644 --- a/oeffi/res/layout/plans_content.xml +++ b/oeffi/res/layout/plans_content.xml @@ -4,7 +4,6 @@ android:id="@+id/plans_layout" android:layout_width="match_parent" android:layout_height="match_parent" - android:background="@color/bg_plan" android:inAnimation="@android:anim/fade_in" android:outAnimation="@android:anim/fade_out"> @@ -25,7 +24,7 @@ android:layout_height="wrap_content" android:paddingTop="8dp" android:text="@string/plan_progress_loading" - android:textColor="@color/fg_significant_on_light" + android:textColor="@color/fg_significant_on_dark" android:textStyle="bold" /> diff --git a/oeffi/res/values-de/networks.xml b/oeffi/res/values-de/networks.xml index af68f7f..750b7e3 100644 --- a/oeffi/res/values-de/networks.xml +++ b/oeffi/res/values-de/networks.xml @@ -81,10 +81,20 @@ Lokal- und Regionalverkehr Bregenz & Vorarlberg Nicht verfügbar, weil der VVV ausdrücklich darum gebeten hat, nicht in Öffi enthalten zu sein. Du kannst stattdessen die ÖBB verwenden, das funktioniert für Vorarlberg auch gut. + Prag + Lokal- und Regionalverkehr Luzern nur Tram und Bus Zürich Lokal- und Regionalverkehr + Italien + Fern-, Regional und Lokalverkehr (z.B. Mailand, Rom, Neapel) + Paris + Lokal- und Regionalverkehr + Spanien + Lokal- und Regionalverkehr (z.B. Barcelona) + Belgien + Fern-, Regional und Lokalverkehr (z.B. Antwerpen, Gent, Charleroi, Brüssel) Luxemburg Lokal- und Regionalverkehr Niederlande @@ -93,12 +103,12 @@ Fern-, Regional und Lokalverkehr (z.B. Kopenhagen) Schweden Fern-, Regional und Lokalverkehr (z.B. Stockholm) + Finnland + Fern-, Regional und Lokalverkehr (z.B. Helsinki) England, Schottland & Wales. Lokal- und Regionalverkehr (z.B. London, Birmingham) Liverpool Lokal- und Regionalverkehr - Polen - Fern-, Regional und Lokalverkehr (z.B. Warschau) Dubai Lokalverkehr San Francisco @@ -109,6 +119,8 @@ Lokal- und Regionalverkehr Sydney Lokal- und Regionalverkehr + Nicaragua + nationale und städtische Buslinien Melbourne Nicht mehr verfügbar, da der PTV keine EFA-API mehr anbietet. diff --git a/oeffi/res/values-night-v29/colors.xml b/oeffi/res/values-night-v29/colors.xml new file mode 100644 index 0000000..1734f89 --- /dev/null +++ b/oeffi/res/values-night-v29/colors.xml @@ -0,0 +1,9 @@ + + + + + @android:color/transparent + @android:color/transparent + @android:color/transparent + + diff --git a/oeffi/res/values-night/colors.xml b/oeffi/res/values-night/colors.xml index 179b8b9..a0653fd 100644 --- a/oeffi/res/values-night/colors.xml +++ b/oeffi/res/values-night/colors.xml @@ -23,6 +23,7 @@ #444444 #ffff00 #bbbbbb + #44000000 0.8 diff --git a/oeffi/res/values-night/styles.xml b/oeffi/res/values-night/styles.xml index f80397d..4ef9f8d 100644 --- a/oeffi/res/values-night/styles.xml +++ b/oeffi/res/values-night/styles.xml @@ -5,6 +5,8 @@ diff --git a/oeffi/res/values-notnight-v29/styes.xml b/oeffi/res/values-notnight-v29/styes.xml index 92f8177..6cf7297 100644 --- a/oeffi/res/values-notnight-v29/styes.xml +++ b/oeffi/res/values-notnight-v29/styes.xml @@ -4,6 +4,8 @@ diff --git a/oeffi/res/values-v29/colors.xml b/oeffi/res/values-v29/colors.xml new file mode 100644 index 0000000..1734f89 --- /dev/null +++ b/oeffi/res/values-v29/colors.xml @@ -0,0 +1,9 @@ + + + + + @android:color/transparent + @android:color/transparent + @android:color/transparent + + diff --git a/oeffi/res/values/colors.xml b/oeffi/res/values/colors.xml index 5f9c7e5..dd27815 100644 --- a/oeffi/res/values/colors.xml +++ b/oeffi/res/values/colors.xml @@ -37,7 +37,9 @@ #757575 #bbbbbb #ff4444 - #ffd8d8d8 + #44000000 + @android:color/black + #44000000 1 diff --git a/oeffi/res/values/networks.xml b/oeffi/res/values/networks.xml index 936d8db..c4202a5 100644 --- a/oeffi/res/values/networks.xml +++ b/oeffi/res/values/networks.xml @@ -81,10 +81,20 @@ local and regional Bregenz & Vorarlberg Not available, because the VVV explicitly desires not to be included in Offi. You can use the ÖBB instead, it works well for Vorarlberg too. + Prague + local and regional Lucerne tram and bus only Zurich local and regional + Italy + long-distance, regional and local (e.g. Milan, Rome, Naples) + Paris + local and regional + Spain + local and regional (e.g. Barcelona) + Belgium + long-distance, regional and local (e.g. Antwerp, Ghent, Charleroi, Brussels) Luxembourg local and regional Netherlands @@ -93,12 +103,12 @@ long-distance, regional and local (e.g. Copenhagen) Sweden long-distance, regional and local (e.g. Stockholm) + Finland + long-distance, regional and local (e.g. Helsinki) England, Scotland & Wales local and regional (e.g. London, Birmingham) Liverpool local and regional - Poland - long-distance, regional and local (e.g. Warsaw) Dubai local San Francisco @@ -109,6 +119,8 @@ local and regional Sydney local and regional + Nicaragua + national and urban buses Melbourne Not available, because the PTV does not offer an EFA API any more. diff --git a/oeffi/res/values/strings.xml b/oeffi/res/values/strings.xml index 6720387..4e41937 100644 --- a/oeffi/res/values/strings.xml +++ b/oeffi/res/values/strings.xml @@ -46,7 +46,7 @@ About Offi Copyright - © 2010-2025, the Öffi developers + © 2010-2023, the Öffi developers License Privacy Policy https://oeffi.schildbach.de/privacy_policy.txt diff --git a/oeffi/res/values/styles.xml b/oeffi/res/values/styles.xml index 8a913e7..727a1f6 100644 --- a/oeffi/res/values/styles.xml +++ b/oeffi/res/values/styles.xml @@ -5,6 +5,8 @@ @@ -23,10 +27,13 @@ diff --git a/oeffi/res/xml/network_security_config.xml b/oeffi/res/xml/network_security_config.xml index 0bd486a..c3d91c4 100644 --- a/oeffi/res/xml/network_security_config.xml +++ b/oeffi/res/xml/network_security_config.xml @@ -10,12 +10,12 @@ + www.belgianrail.be android.vrsinfo.de wojhati.rta.ae appefa10.verbundlinie.at railteam.hafas.eu mobil.vbl.ch - mobil.rozklad-pkp.pl diff --git a/oeffi/src-aosp/de/schildbach/oeffi/Variants.java b/oeffi/src-aosp/de/schildbach/oeffi/Variants.java new file mode 100644 index 0000000..8f26f91 --- /dev/null +++ b/oeffi/src-aosp/de/schildbach/oeffi/Variants.java @@ -0,0 +1,22 @@ +/* + * Copyright the original author or authors. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package de.schildbach.oeffi; + +public class Variants { + public static final boolean ENABLE_DONATE = true; +} diff --git a/oeffi/src-google/de/schildbach/oeffi/Variants.java b/oeffi/src-google/de/schildbach/oeffi/Variants.java new file mode 100644 index 0000000..3fe9f90 --- /dev/null +++ b/oeffi/src-google/de/schildbach/oeffi/Variants.java @@ -0,0 +1,22 @@ +/* + * Copyright the original author or authors. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package de.schildbach.oeffi; + +public class Variants { + public static final boolean ENABLE_DONATE = false; +} diff --git a/oeffi/src/de/schildbach/oeffi/Application.java b/oeffi/src/de/schildbach/oeffi/Application.java index 1b00c67..c64db6e 100644 --- a/oeffi/src/de/schildbach/oeffi/Application.java +++ b/oeffi/src/de/schildbach/oeffi/Application.java @@ -91,6 +91,18 @@ public class Application extends android.app.Application { for (final File file : getFilesDir().listFiles(filter)) file.delete(); + // 2021-09-18: migrate SBB to use RT + final String SBB = "SBB"; + migrateSelectedNetwork(SBB, NetworkId.RT); + FavoriteStationsProvider.deleteFavoriteStations(this, SBB); + QueryHistoryProvider.deleteQueryHistory(this, SBB); + + // 2022-09-12: migrate PL to use RT + final String PL = "PL"; + migrateSelectedNetwork(PL, NetworkId.RT); + FavoriteStationsProvider.deleteFavoriteStations(this, PL); + QueryHistoryProvider.deleteQueryHistory(this, PL); + // 2023-01-09: migrate VMS to use VVO final String VMS = "VMS"; migrateSelectedNetwork(VMS, NetworkId.VVO); @@ -109,52 +121,6 @@ public class Application extends android.app.Application { FavoriteStationsProvider.deleteFavoriteStations(this, AVV); QueryHistoryProvider.deleteQueryHistory(this, AVV); - // 2023-12-17: migrate SNCB to use RT - final String SNCB = "SNCB"; - migrateSelectedNetwork(SNCB, NetworkId.RT); - FavoriteStationsProvider.deleteFavoriteStations(this, SNCB); - QueryHistoryProvider.deleteQueryHistory(this, SNCB); - - // 2024-04-27: EFA-ID migration of MVV - FavoriteStationsProvider.migrateFavoriteStationIds(this, NetworkId.MVV, "0", "10000", 91000000); - QueryHistoryProvider.migrateQueryHistoryIds(this, NetworkId.MVV, "0", "10000", 91000000); - - // 2024-08-09: migrate Finland to use RT - final String FINLAND = "FINLAND"; - migrateSelectedNetwork(FINLAND, NetworkId.RT); - FavoriteStationsProvider.deleteFavoriteStations(this, FINLAND); - QueryHistoryProvider.deleteQueryHistory(this, FINLAND); - - // 2024-08-30: migrate Czech Republic to use RT - final String CZECH_REPUBLIC = "CZECH_REPUBLIC"; - migrateSelectedNetwork(CZECH_REPUBLIC, NetworkId.RT); - FavoriteStationsProvider.deleteFavoriteStations(this, CZECH_REPUBLIC); - QueryHistoryProvider.deleteQueryHistory(this, CZECH_REPUBLIC); - - // 2024-08-30: migrate Italy to use RT - final String IT = "IT"; - migrateSelectedNetwork(IT, NetworkId.RT); - FavoriteStationsProvider.deleteFavoriteStations(this, IT); - QueryHistoryProvider.deleteQueryHistory(this, IT); - - // 2024-08-30: migrate Paris to use RT - final String PARIS = "PARIS"; - migrateSelectedNetwork(PARIS, NetworkId.RT); - FavoriteStationsProvider.deleteFavoriteStations(this, PARIS); - QueryHistoryProvider.deleteQueryHistory(this, PARIS); - - // 2024-08-30: migrate Spain to use RT - final String SPAIN = "SPAIN"; - migrateSelectedNetwork(SPAIN, NetworkId.RT); - FavoriteStationsProvider.deleteFavoriteStations(this, SPAIN); - QueryHistoryProvider.deleteQueryHistory(this, SPAIN); - - // 2024-08-30: migrate Nicaragua to use RT - final String NICARAGUA = "NICARAGUA"; - migrateSelectedNetwork(NICARAGUA, NetworkId.RT); - FavoriteStationsProvider.deleteFavoriteStations(this, NICARAGUA); - QueryHistoryProvider.deleteQueryHistory(this, NICARAGUA); - log.info("Migrations took {}", watch); } @@ -233,4 +199,13 @@ public class Application extends android.app.Application { public static final int versionCode(final Application application) { return application.packageInfo().versionCode; } + + public static final String versionFlavor(final Application application) { + final String applicationVersion = versionName(application); + final int applicationVersionSplit = applicationVersion.indexOf('-'); + if (applicationVersionSplit >= 0) + return applicationVersion.substring(applicationVersionSplit + 1); + else + return null; + } } diff --git a/oeffi/src/de/schildbach/oeffi/Constants.java b/oeffi/src/de/schildbach/oeffi/Constants.java index 3394e43..203d40f 100644 --- a/oeffi/src/de/schildbach/oeffi/Constants.java +++ b/oeffi/src/de/schildbach/oeffi/Constants.java @@ -17,9 +17,7 @@ package de.schildbach.oeffi; -import android.graphics.Color; import android.text.format.DateUtils; -import androidx.activity.SystemBarStyle; import okhttp3.HttpUrl; import java.util.Locale; @@ -67,6 +65,4 @@ public class Constants { public static final String DESTINATION_ARROW_PREFIX = Character.toString(Constants.CHAR_RIGHTWARDS_ARROW) + Constants.CHAR_THIN_SPACE; public static final String DESTINATION_ARROW_INVISIBLE_PREFIX = " "; - - public static final SystemBarStyle STATUS_BAR_STYLE = SystemBarStyle.dark(Color.TRANSPARENT); } diff --git a/oeffi/src/de/schildbach/oeffi/OeffiActivity.java b/oeffi/src/de/schildbach/oeffi/OeffiActivity.java index 5b66bc6..8ab20f5 100644 --- a/oeffi/src/de/schildbach/oeffi/OeffiActivity.java +++ b/oeffi/src/de/schildbach/oeffi/OeffiActivity.java @@ -17,11 +17,12 @@ package de.schildbach.oeffi; +import android.annotation.TargetApi; import android.app.ActivityManager.TaskDescription; import android.content.SharedPreferences; import android.content.res.Resources; -import android.graphics.Color; import android.graphics.drawable.Drawable; +import android.os.Build; import android.os.Bundle; import android.preference.PreferenceManager; import android.text.format.DateUtils; @@ -30,7 +31,6 @@ import android.view.ViewGroup; import android.widget.LinearLayout; import android.widget.TextView; import androidx.activity.ComponentActivity; -import androidx.activity.EdgeToEdge; import de.schildbach.oeffi.network.NetworkResources; import de.schildbach.oeffi.util.ErrorReporter; import de.schildbach.pte.NetworkId; @@ -46,12 +46,12 @@ public abstract class OeffiActivity extends ComponentActivity { @Override protected void onCreate(final Bundle savedInstanceState) { - EdgeToEdge.enable(this, Constants.STATUS_BAR_STYLE); super.onCreate(savedInstanceState); this.application = (Application) getApplication(); this.prefs = PreferenceManager.getDefaultSharedPreferences(this); - ErrorReporter.getInstance().check(this, applicationVersionCode(), application.okHttpClient()); + ErrorReporter.getInstance().check(this, applicationVersionCode(), applicationVersionFlavor(), + application.okHttpClient()); } protected void updateFragments(final int listFrameResId, final int mapFrameResId) { @@ -100,6 +100,10 @@ public abstract class OeffiActivity extends ComponentActivity { return Application.versionCode(application); } + protected final String applicationVersionFlavor() { + return Application.versionFlavor(application); + } + protected final long applicationFirstInstallTime() { return application.packageInfo().firstInstallTime; } @@ -153,4 +157,10 @@ public abstract class OeffiActivity extends ComponentActivity { return str; } + + @TargetApi(24) + @Override + public boolean isInMultiWindowMode() { + return Build.VERSION.SDK_INT >= Build.VERSION_CODES.N && super.isInMultiWindowMode(); + } } diff --git a/oeffi/src/de/schildbach/oeffi/OeffiMainActivity.java b/oeffi/src/de/schildbach/oeffi/OeffiMainActivity.java index 1d3bba0..fbab782 100644 --- a/oeffi/src/de/schildbach/oeffi/OeffiMainActivity.java +++ b/oeffi/src/de/schildbach/oeffi/OeffiMainActivity.java @@ -130,6 +130,8 @@ public abstract class OeffiMainActivity extends OeffiActivity { directionsItem.setChecked(OeffiMainActivity.this instanceof DirectionsActivity); final MenuItem plansItem = menu.findItem(R.id.global_options_plans); plansItem.setChecked(OeffiMainActivity.this instanceof PlansPickerActivity); + final MenuItem donateItem = menu.findItem(R.id.global_options_donate); + donateItem.setVisible(Variants.ENABLE_DONATE); } @Override @@ -172,7 +174,8 @@ public abstract class OeffiMainActivity extends OeffiActivity { } case R.id.global_options_donate: { - PreferenceActivity.start(OeffiMainActivity.this, DonateFragment.class.getName()); + if (Variants.ENABLE_DONATE) + PreferenceActivity.start(OeffiMainActivity.this, DonateFragment.class.getName()); return true; } @@ -341,11 +344,18 @@ public abstract class OeffiMainActivity extends OeffiActivity { private void downloadAndProcessMessages(final String network) { final HttpUrl.Builder remoteUrl = Constants.MESSAGES_BASE_URL.newBuilder(); - remoteUrl.addPathSegment("messages.txt"); + final StringBuilder remoteFileName = new StringBuilder("messages"); + final String flavor = applicationVersionFlavor(); + if (flavor != null) + remoteFileName.append('-').append(flavor); + remoteFileName.append(".txt"); + remoteUrl.addPathSegment(remoteFileName.toString()); final String installerPackageName = Installer.installerPackageName(this); if (installerPackageName != null) remoteUrl.addEncodedQueryParameter("installer", installerPackageName); remoteUrl.addQueryParameter("version", Integer.toString(versionCode)); + if (flavor != null) + remoteUrl.addQueryParameter("flavor", flavor); remoteUrl.addQueryParameter("sdk", Integer.toString(Build.VERSION.SDK_INT)); remoteUrl.addQueryParameter("task", taskName()); final File localFile = new File(getFilesDir(), "messages.txt"); diff --git a/oeffi/src/de/schildbach/oeffi/directions/DirectionsActivity.java b/oeffi/src/de/schildbach/oeffi/directions/DirectionsActivity.java index 1da216c..7d1b8a8 100644 --- a/oeffi/src/de/schildbach/oeffi/directions/DirectionsActivity.java +++ b/oeffi/src/de/schildbach/oeffi/directions/DirectionsActivity.java @@ -63,9 +63,7 @@ import androidx.activity.result.contract.ActivityResultContract; import androidx.activity.result.contract.ActivityResultContracts; import androidx.coordinatorlayout.widget.CoordinatorLayout; import androidx.core.content.ContextCompat; -import androidx.core.graphics.Insets; import androidx.core.view.ViewCompat; -import androidx.core.view.WindowInsetsCompat; import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.RecyclerView; import com.google.common.base.Throwables; @@ -309,11 +307,10 @@ public class DirectionsActivity extends OeffiMainActivity implements QueryHistor backgroundHandler = new Handler(backgroundThread.getLooper()); setContentView(R.layout.directions_content); - final View contentView = findViewById(android.R.id.content); - ViewCompat.setOnApplyWindowInsetsListener(contentView, (v, windowInsets) -> { - final Insets insets = windowInsets.getInsets(WindowInsetsCompat.Type.systemBars()); - v.setPadding(insets.left, 0, insets.right, 0); - return windowInsets; + getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION); + findViewById(android.R.id.content).setOnApplyWindowInsetsListener((v, insets) -> { + v.setPadding(insets.getSystemWindowInsetLeft(), 0, insets.getSystemWindowInsetRight(), 0); + return insets; }); final MyActionBar actionBar = getMyActionBar(); @@ -459,11 +456,10 @@ public class DirectionsActivity extends OeffiMainActivity implements QueryHistor viewQueryHistoryList.addItemDecoration(new DividerItemDecoration(this, DividerItemDecoration.VERTICAL_LIST)); queryHistoryListAdapter = new QueryHistoryAdapter(this, network, this, this); viewQueryHistoryList.setAdapter(queryHistoryListAdapter); - ViewCompat.setOnApplyWindowInsetsListener(viewQueryHistoryList, (v, windowInsets) -> { - final Insets insets = windowInsets.getInsets(WindowInsetsCompat.Type.systemBars()); + viewQueryHistoryList.setOnApplyWindowInsetsListener((v, insets) -> { v.setPadding(v.getPaddingLeft(), v.getPaddingTop(), v.getPaddingRight(), - insets.bottom); - return windowInsets; + insets.getSystemWindowInsetBottom()); + return insets; }); viewQueryHistoryEmpty = findViewById(R.id.directions_query_history_empty); @@ -550,17 +546,15 @@ public class DirectionsActivity extends OeffiMainActivity implements QueryHistor }); final TextView mapDisclaimerView = findViewById(R.id.directions_map_disclaimer); mapDisclaimerView.setText(mapView.getTileProvider().getTileSource().getCopyrightNotice()); - ViewCompat.setOnApplyWindowInsetsListener(mapDisclaimerView, (v, windowInsets) -> { - final Insets insets = windowInsets.getInsets(WindowInsetsCompat.Type.systemBars()); - v.setPadding(0, 0, 0, insets.bottom); - return windowInsets; + mapDisclaimerView.setOnApplyWindowInsetsListener((v, insets) -> { + v.setPadding(0,0,0, insets.getSystemWindowInsetBottom()); + return insets; }); final ZoomControls zoom = findViewById(R.id.directions_map_zoom); - ViewCompat.setOnApplyWindowInsetsListener(zoom, (v, windowInsets) -> { - final Insets insets = windowInsets.getInsets(WindowInsetsCompat.Type.systemBars()); - v.setPadding(0, 0, 0, insets.bottom); - return windowInsets; + zoom.setOnApplyWindowInsetsListener((v, insets) -> { + v.setPadding(0, 0, 0, insets.getSystemWindowInsetBottom()); + return insets; }); mapView.setZoomControls(zoom); diff --git a/oeffi/src/de/schildbach/oeffi/directions/TripDetailsActivity.java b/oeffi/src/de/schildbach/oeffi/directions/TripDetailsActivity.java index 8372c16..10b5f51 100644 --- a/oeffi/src/de/schildbach/oeffi/directions/TripDetailsActivity.java +++ b/oeffi/src/de/schildbach/oeffi/directions/TripDetailsActivity.java @@ -44,15 +44,13 @@ import android.util.DisplayMetrics; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; +import android.view.WindowManager; import android.widget.ImageButton; import android.widget.LinearLayout; import android.widget.PopupMenu; import android.widget.TableLayout; import android.widget.TextView; import androidx.core.content.ContextCompat; -import androidx.core.graphics.Insets; -import androidx.core.view.ViewCompat; -import androidx.core.view.WindowInsetsCompat; import com.google.common.base.MoreObjects; import de.schildbach.oeffi.Constants; import de.schildbach.oeffi.LocationAware; @@ -189,11 +187,10 @@ public class TripDetailsActivity extends OeffiActivity implements LocationListen scheduleTripIntent = scheduleTripIntent(trip); setContentView(R.layout.directions_trip_details_content); - final View contentView = findViewById(android.R.id.content); - ViewCompat.setOnApplyWindowInsetsListener(contentView, (v, windowInsets) -> { - final Insets insets = windowInsets.getInsets(WindowInsetsCompat.Type.systemBars()); - v.setPadding(insets.left, 0, insets.right, 0); - return windowInsets; + getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION); + findViewById(android.R.id.content).setOnApplyWindowInsetsListener((v, insets) -> { + v.setPadding(insets.getSystemWindowInsetLeft(), 0, insets.getSystemWindowInsetRight(), 0); + return insets; }); final MyActionBar actionBar = getMyActionBar(); @@ -286,11 +283,9 @@ public class TripDetailsActivity extends OeffiActivity implements LocationListen ((TextView) findViewById(R.id.directions_trip_details_footer)) .setText(Html.fromHtml(getString(R.string.directions_trip_details_realtime))); - final View disclaimerView = findViewById(R.id.directions_trip_details_disclaimer_group); - ViewCompat.setOnApplyWindowInsetsListener(disclaimerView, (v, windowInsets) -> { - final Insets insets = windowInsets.getInsets(WindowInsetsCompat.Type.systemBars()); - v.setPadding(0, 0, 0, insets.bottom); - return windowInsets; + findViewById(R.id.directions_trip_details_disclaimer_group).setOnApplyWindowInsetsListener((v, insets) -> { + v.setPadding(0, 0, 0, insets.getSystemWindowInsetBottom()); + return insets; }); final TextView disclaimerSourceView = findViewById(R.id.directions_trip_details_disclaimer_source); updateDisclaimerSource(disclaimerSourceView, network.name(), null); @@ -319,10 +314,9 @@ public class TripDetailsActivity extends OeffiActivity implements LocationListen }); final TextView mapDisclaimerView = findViewById(R.id.directions_trip_details_map_disclaimer); mapDisclaimerView.setText(mapView.getTileProvider().getTileSource().getCopyrightNotice()); - ViewCompat.setOnApplyWindowInsetsListener(mapDisclaimerView, (v, windowInsets) -> { - final Insets insets = windowInsets.getInsets(WindowInsetsCompat.Type.systemBars()); - v.setPadding(0, 0, 0, insets.bottom); - return windowInsets; + mapDisclaimerView.setOnApplyWindowInsetsListener((v, insets) -> { + v.setPadding(0,0,0, insets.getSystemWindowInsetBottom()); + return insets; }); } @@ -372,6 +366,11 @@ public class TripDetailsActivity extends OeffiActivity implements LocationListen super.onDestroy(); } + @Override + public void onAttachedToWindow() { + getWindow().addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED); + } + @Override public void onConfigurationChanged(final Configuration config) { super.onConfigurationChanged(config); diff --git a/oeffi/src/de/schildbach/oeffi/directions/TripsOverviewActivity.java b/oeffi/src/de/schildbach/oeffi/directions/TripsOverviewActivity.java index b0f8247..ad62ea8 100644 --- a/oeffi/src/de/schildbach/oeffi/directions/TripsOverviewActivity.java +++ b/oeffi/src/de/schildbach/oeffi/directions/TripsOverviewActivity.java @@ -31,9 +31,6 @@ import android.text.format.DateUtils; import android.view.View; import android.widget.AdapterView; import android.widget.TextView; -import androidx.core.graphics.Insets; -import androidx.core.view.ViewCompat; -import androidx.core.view.WindowInsetsCompat; import com.google.common.collect.ComparisonChain; import com.google.common.collect.Ordering; import com.google.common.util.concurrent.Uninterruptibles; @@ -133,11 +130,10 @@ public class TripsOverviewActivity extends OeffiActivity { final Uri historyUri = historyUriStr != null ? Uri.parse(historyUriStr) : null; setContentView(R.layout.directions_trip_overview_content); - final View contentView = findViewById(android.R.id.content); - ViewCompat.setOnApplyWindowInsetsListener(contentView, (v, windowInsets) -> { - final Insets insets = windowInsets.getInsets(WindowInsetsCompat.Type.systemBars()); - v.setPadding(insets.left, 0, insets.right, 0); - return windowInsets; + getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION); + findViewById(android.R.id.content).setOnApplyWindowInsetsListener((v, insets) -> { + v.setPadding(insets.getSystemWindowInsetLeft(), 0, insets.getSystemWindowInsetRight(), 0); + return insets; }); final MyActionBar actionBar = getMyActionBar(); @@ -168,11 +164,9 @@ public class TripsOverviewActivity extends OeffiActivity { }); barView.setOnScrollListener(() -> handler.post(checkMoreRunnable)); - final View disclaimerView = findViewById(R.id.directions_trip_overview_disclaimer_group); - ViewCompat.setOnApplyWindowInsetsListener(disclaimerView, (v, windowInsets) -> { - final Insets insets = windowInsets.getInsets(WindowInsetsCompat.Type.systemBars()); - v.setPadding(0, 0, 0, insets.bottom); - return windowInsets; + findViewById(R.id.directions_trip_overview_disclaimer_group).setOnApplyWindowInsetsListener((v, insets) -> { + v.setPadding(0, 0, 0, insets.getSystemWindowInsetBottom()); + return insets; }); processResult(result, dep); diff --git a/oeffi/src/de/schildbach/oeffi/network/NetworkPickerActivity.java b/oeffi/src/de/schildbach/oeffi/network/NetworkPickerActivity.java index e5e49fc..f18c129 100644 --- a/oeffi/src/de/schildbach/oeffi/network/NetworkPickerActivity.java +++ b/oeffi/src/de/schildbach/oeffi/network/NetworkPickerActivity.java @@ -18,6 +18,7 @@ package de.schildbach.oeffi.network; import android.Manifest; +import android.annotation.TargetApi; import android.app.ActivityManager.TaskDescription; import android.content.Context; import android.content.Intent; @@ -25,10 +26,10 @@ import android.content.SharedPreferences; import android.content.pm.PackageManager; import android.content.res.Configuration; import android.content.res.Resources; -import android.graphics.Color; import android.location.Address; import android.location.Criteria; import android.location.LocationManager; +import android.os.Build; import android.os.Bundle; import android.os.Handler; import android.os.HandlerThread; @@ -39,13 +40,9 @@ import android.view.View; import android.widget.LinearLayout; import android.widget.TextView; import androidx.activity.ComponentActivity; -import androidx.activity.EdgeToEdge; import androidx.activity.result.ActivityResultLauncher; import androidx.activity.result.contract.ActivityResultContracts; import androidx.core.content.ContextCompat; -import androidx.core.graphics.Insets; -import androidx.core.view.ViewCompat; -import androidx.core.view.WindowInsetsCompat; import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.RecyclerView; import de.schildbach.oeffi.AreaAware; @@ -61,6 +58,7 @@ import de.schildbach.oeffi.network.list.NetworksAdapter; import de.schildbach.oeffi.util.DividerItemDecoration; import de.schildbach.oeffi.util.GeocoderThread; import de.schildbach.oeffi.util.LocationHelper; +import de.schildbach.pte.AbstractNavitiaProvider; import de.schildbach.pte.NetworkId; import de.schildbach.pte.NetworkProvider; import de.schildbach.pte.dto.Location; @@ -114,7 +112,6 @@ public class NetworkPickerActivity extends ComponentActivity implements Location @Override protected void onCreate(final Bundle savedInstanceState) { - EdgeToEdge.enable(this, Constants.STATUS_BAR_STYLE); super.onCreate(savedInstanceState); prefs = PreferenceManager.getDefaultSharedPreferences(this); @@ -126,11 +123,10 @@ public class NetworkPickerActivity extends ComponentActivity implements Location backgroundHandler = new Handler(backgroundThread.getLooper()); setContentView(R.layout.network_picker_content); - final View contentView = findViewById(android.R.id.content); - ViewCompat.setOnApplyWindowInsetsListener(contentView, (v, windowInsets) -> { - final Insets insets = windowInsets.getInsets(WindowInsetsCompat.Type.systemBars()); - v.setPadding(insets.left, 0, insets.right, 0); - return windowInsets; + getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION); + findViewById(android.R.id.content).setOnApplyWindowInsetsListener((v, insets) -> { + v.setPadding(insets.getSystemWindowInsetLeft(), 0, insets.getSystemWindowInsetRight(), 0); + return insets; }); actionBar = findViewById(R.id.action_bar); @@ -143,19 +139,18 @@ public class NetworkPickerActivity extends ComponentActivity implements Location final String network = prefsGetNetwork(); listAdapter = new NetworksAdapter(this, network, this, this); listView.setAdapter(listAdapter); - ViewCompat.setOnApplyWindowInsetsListener(listView, (v, windowInsets) -> { - final Insets insets = windowInsets.getInsets(WindowInsetsCompat.Type.systemBars()); - v.setPadding(v.getPaddingLeft(), v.getPaddingTop(), v.getPaddingRight(), insets.bottom); - return windowInsets; + listView.setOnApplyWindowInsetsListener((v, insets) -> { + v.setPadding(v.getPaddingLeft(), v.getPaddingTop(), v.getPaddingRight(), + insets.getSystemWindowInsetBottom()); + return insets; }); mapView = findViewById(R.id.network_picker_map); final TextView mapDisclaimerView = findViewById(R.id.network_picker_map_disclaimer); mapDisclaimerView.setText(mapView.getTileProvider().getTileSource().getCopyrightNotice()); - ViewCompat.setOnApplyWindowInsetsListener(mapDisclaimerView, (v, windowInsets) -> { - final Insets insets = windowInsets.getInsets(WindowInsetsCompat.Type.systemBars()); - v.setPadding(0, 0, 0, insets.bottom); - return windowInsets; + mapDisclaimerView.setOnApplyWindowInsetsListener((v, insets) -> { + v.setPadding(0, 0, 0, insets.getSystemWindowInsetBottom()); + return insets; }); if (network != null) { @@ -482,6 +477,10 @@ public class NetworkPickerActivity extends ComponentActivity implements Location final NetworkProvider networkProvider = NetworkProviderFactory.provider(NetworkId.valueOf(network.id)); + // workaround, because of network access for navitia + if (AbstractNavitiaProvider.class.isAssignableFrom(networkProvider.getClass())) + return false; + boolean inArea = false; final Point[] area = getArea(networkProvider); @@ -572,4 +571,10 @@ public class NetworkPickerActivity extends ComponentActivity implements Location actionBar.setBackgroundColor(color); setTaskDescription(new TaskDescription(null, null, color)); } + + @TargetApi(24) + @Override + public boolean isInMultiWindowMode() { + return Build.VERSION.SDK_INT >= Build.VERSION_CODES.N && super.isInMultiWindowMode(); + } } diff --git a/oeffi/src/de/schildbach/oeffi/network/NetworkProviderFactory.java b/oeffi/src/de/schildbach/oeffi/network/NetworkProviderFactory.java index 886733c..6a6a6d7 100644 --- a/oeffi/src/de/schildbach/oeffi/network/NetworkProviderFactory.java +++ b/oeffi/src/de/schildbach/oeffi/network/NetworkProviderFactory.java @@ -27,12 +27,15 @@ import de.schildbach.pte.BayernProvider; import de.schildbach.pte.BsvagProvider; import de.schildbach.pte.BvgProvider; import de.schildbach.pte.CmtaProvider; +import de.schildbach.pte.CzechRepublicProvider; import de.schildbach.pte.DbProvider; import de.schildbach.pte.DingProvider; import de.schildbach.pte.DsbProvider; import de.schildbach.pte.DubProvider; +import de.schildbach.pte.FinlandProvider; import de.schildbach.pte.GvhProvider; import de.schildbach.pte.InvgProvider; +import de.schildbach.pte.ItalyProvider; import de.schildbach.pte.KvvProvider; import de.schildbach.pte.LinzProvider; import de.schildbach.pte.LuProvider; @@ -42,15 +45,18 @@ import de.schildbach.pte.MvvProvider; import de.schildbach.pte.NasaProvider; import de.schildbach.pte.NetworkId; import de.schildbach.pte.NetworkProvider; +import de.schildbach.pte.NicaraguaProvider; import de.schildbach.pte.NsProvider; import de.schildbach.pte.NvbwProvider; import de.schildbach.pte.NvvProvider; import de.schildbach.pte.OebbProvider; -import de.schildbach.pte.PlProvider; +import de.schildbach.pte.ParisProvider; import de.schildbach.pte.RtProvider; import de.schildbach.pte.RtaChicagoProvider; import de.schildbach.pte.SeProvider; import de.schildbach.pte.ShProvider; +import de.schildbach.pte.SncbProvider; +import de.schildbach.pte.SpainProvider; import de.schildbach.pte.StvProvider; import de.schildbach.pte.SydneyProvider; import de.schildbach.pte.TlemProvider; @@ -78,7 +84,8 @@ public final class NetworkProviderFactory { private static Map providerCache = new HashMap<>(); private static final BaseEncoding BASE64 = BaseEncoding.base64(); - private static final String USER_AGENT = "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:134.0) Gecko/20100101 Firefox/134.0"; + private static final String USER_AGENT = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/108.0.0.0 Safari/537.36 Edg/108.0.1462.54"; + private static final String NAVITIA_AUTHORIZATION = "577e5781-23ee-4ff0-a5b3-92e5b04887e5"; // oeffi@schildbach.de private static final byte[] VRS_CLIENT_CERTIFICATE = BASE64.decode("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"); public static synchronized NetworkProvider provider(final NetworkId networkId) { @@ -87,8 +94,7 @@ public final class NetworkProviderFactory { return cachedNetworkProvider; final AbstractNetworkProvider networkProvider = forId(networkId); - if (networkId != NetworkId.PL) - networkProvider.setUserAgent(USER_AGENT); + networkProvider.setUserAgent(USER_AGENT); providerCache.put(networkId, networkProvider); return networkProvider; } @@ -97,7 +103,8 @@ public final class NetworkProviderFactory { if (networkId.equals(NetworkId.RT)) return new RtProvider(); else if (networkId.equals(NetworkId.DB)) - return new DbProvider(); + return new DbProvider("{\"type\":\"AID\",\"aid\":\"n91dB8Z77MLdoR0K\"}", + "bdI8UVj40K5fvxwf".getBytes(Charsets.UTF_8)); else if (networkId.equals(NetworkId.BVG)) return new BvgProvider("{\"aid\":\"1Rxs112shyHLatUX4fofnmdxK\",\"type\":\"AID\"}"); else if (networkId.equals(NetworkId.VBB)) @@ -164,10 +171,20 @@ public final class NetworkProviderFactory { return new LinzProvider(); else if (networkId.equals(NetworkId.STV)) return new StvProvider(); + else if (networkId.equals(NetworkId.CZECH_REPUBLIC)) + return new CzechRepublicProvider(NAVITIA_AUTHORIZATION); else if (networkId.equals(NetworkId.VBL)) return new VblProvider(); else if (networkId.equals(NetworkId.ZVV)) return new ZvvProvider("{\"type\":\"AID\",\"aid\":\"hf7mcf9bv3nv8g5f\"}"); + else if (networkId.equals(NetworkId.IT)) + return new ItalyProvider(NAVITIA_AUTHORIZATION); + else if (networkId.equals(NetworkId.PARIS)) + return new ParisProvider(NAVITIA_AUTHORIZATION); + else if (networkId.equals(NetworkId.SPAIN)) + return new SpainProvider(NAVITIA_AUTHORIZATION); + else if (networkId.equals(NetworkId.SNCB)) + return new SncbProvider("{\"type\":\"AID\",\"aid\":\"sncb-mobi\"}"); else if (networkId.equals(NetworkId.LU)) return new LuProvider("{\"type\":\"AID\",\"aid\":\"SkC81GuwuzL4e0\"}"); else if (networkId.equals(NetworkId.NS)) @@ -176,12 +193,12 @@ public final class NetworkProviderFactory { return new DsbProvider("{\"type\":\"AID\",\"aid\":\"irkmpm9mdznstenr-android\"}"); else if (networkId.equals(NetworkId.SE)) return new SeProvider("{\"type\":\"AID\",\"aid\":\"h5o3n7f4t2m8l9x1\"}"); + else if (networkId.equals(NetworkId.FINLAND)) + return new FinlandProvider(NAVITIA_AUTHORIZATION); else if (networkId.equals(NetworkId.TLEM)) return new TlemProvider(); else if (networkId.equals(NetworkId.MERSEY)) return new MerseyProvider(); - else if (networkId.equals(NetworkId.PL)) - return new PlProvider("{\"type\":\"AID\",\"aid\":\"DrxJYtYZQpEBCtcb\"}"); else if (networkId.equals(NetworkId.DUB)) return new DubProvider(); else if (networkId.equals(NetworkId.BART)) @@ -192,6 +209,8 @@ public final class NetworkProviderFactory { return new CmtaProvider("{\"type\":\"AID\",\"aid\":\"web9j2nak29uz41irb\"}"); else if (networkId.equals(NetworkId.SYDNEY)) return new SydneyProvider(); + else if (networkId.equals(NetworkId.NICARAGUA)) + return new NicaraguaProvider(NAVITIA_AUTHORIZATION); else throw new IllegalArgumentException(networkId.name()); } diff --git a/oeffi/src/de/schildbach/oeffi/plans/PlanActivity.java b/oeffi/src/de/schildbach/oeffi/plans/PlanActivity.java index 1310d4d..15a4591 100644 --- a/oeffi/src/de/schildbach/oeffi/plans/PlanActivity.java +++ b/oeffi/src/de/schildbach/oeffi/plans/PlanActivity.java @@ -23,21 +23,19 @@ import android.content.Intent; import android.database.Cursor; import android.graphics.Bitmap; import android.graphics.BitmapFactory; -import android.graphics.Color; import android.net.Uri; import android.os.Bundle; import android.os.Handler; import android.os.HandlerThread; import android.os.Process; import android.view.View; +import android.view.WindowManager; import android.view.animation.Animation; import android.view.animation.AnimationUtils; import android.widget.PopupMenu; import android.widget.TextView; import android.widget.ViewAnimator; import androidx.activity.ComponentActivity; -import androidx.activity.EdgeToEdge; -import androidx.activity.SystemBarStyle; import com.google.common.util.concurrent.FutureCallback; import com.google.common.util.concurrent.Futures; import com.google.common.util.concurrent.ListenableFuture; @@ -85,9 +83,6 @@ public class PlanActivity extends ComponentActivity { public static final String INTENT_EXTRA_PLAN_ID = "plan_id"; // Used in launcher shortcuts private static final String INTENT_EXTRA_SELECTED_STATION_ID = PlanActivity.class.getName() + ".selected_station_id"; - // plan backgrounds are always white, so force navigation bar to light mode - private static final SystemBarStyle NAVIGATION_BAR_STYLE = SystemBarStyle.light(Color.TRANSPARENT, - Color.TRANSPARENT); public static Intent intent(final Context context, final String planId, final String selectedStationId) { final Intent intent = new Intent(Intent.ACTION_VIEW, null, context, PlanActivity.class); @@ -122,7 +117,6 @@ public class PlanActivity extends ComponentActivity { @Override protected void onCreate(final Bundle savedInstanceState) { - EdgeToEdge.enable(this, Constants.STATUS_BAR_STYLE, NAVIGATION_BAR_STYLE); super.onCreate(savedInstanceState); this.application = (Application) getApplication(); @@ -132,6 +126,7 @@ public class PlanActivity extends ComponentActivity { backgroundHandler = new Handler(backgroundThread.getLooper()); setContentView(R.layout.plans_content); + getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION); final Animation zoomControlsAnimation = AnimationUtils.loadAnimation(this, R.anim.zoom_controls); zoomControlsAnimation.setFillAfter(true); // workaround: set through code because XML does not work @@ -260,6 +255,11 @@ public class PlanActivity extends ComponentActivity { super.onDestroy(); } + @Override + public void onAttachedToWindow() { + getWindow().addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED); + } + @Override public boolean onSearchRequested() { if (!stations.isEmpty()) diff --git a/oeffi/src/de/schildbach/oeffi/plans/PlansPickerActivity.java b/oeffi/src/de/schildbach/oeffi/plans/PlansPickerActivity.java index 1440601..58e29db 100644 --- a/oeffi/src/de/schildbach/oeffi/plans/PlansPickerActivity.java +++ b/oeffi/src/de/schildbach/oeffi/plans/PlansPickerActivity.java @@ -38,10 +38,7 @@ import androidx.activity.result.contract.ActivityResultContracts; import androidx.core.content.ContextCompat; import androidx.core.content.pm.ShortcutInfoCompat; import androidx.core.content.pm.ShortcutManagerCompat; -import androidx.core.graphics.Insets; import androidx.core.graphics.drawable.IconCompat; -import androidx.core.view.ViewCompat; -import androidx.core.view.WindowInsetsCompat; import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.RecyclerView; import com.google.common.util.concurrent.FutureCallback; @@ -113,11 +110,10 @@ public class PlansPickerActivity extends OeffiMainActivity implements LocationHe thumbCache = new Cache(cacheDir, THUMB_CACHE_SIZE); setContentView(R.layout.plans_picker_content); - final View contentView = findViewById(android.R.id.content); - ViewCompat.setOnApplyWindowInsetsListener(contentView, (v, windowInsets) -> { - final Insets insets = windowInsets.getInsets(WindowInsetsCompat.Type.systemBars()); - v.setPadding(insets.left, 0, insets.right, 0); - return windowInsets; + getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION); + findViewById(android.R.id.content).setOnApplyWindowInsetsListener((v, insets) -> { + v.setPadding(insets.getSystemWindowInsetLeft(), 0, insets.getSystemWindowInsetRight(), 0); + return insets; }); actionBar = getMyActionBar(); @@ -135,10 +131,10 @@ public class PlansPickerActivity extends OeffiMainActivity implements LocationHe listView.addItemDecoration(new DividerItemDecoration(this, DividerItemDecoration.VERTICAL_LIST)); listAdapter = new PlansAdapter(this, cursor, thumbCache, this, this, application.okHttpClient()); listView.setAdapter(listAdapter); - ViewCompat.setOnApplyWindowInsetsListener(listView, (v, windowInsets) -> { - final Insets insets = windowInsets.getInsets(WindowInsetsCompat.Type.systemBars()); - v.setPadding(v.getPaddingLeft(), v.getPaddingTop(), v.getPaddingRight(), insets.bottom); - return windowInsets; + listView.setOnApplyWindowInsetsListener((v, insets) -> { + v.setPadding(v.getPaddingLeft(), v.getPaddingTop(), v.getPaddingRight(), + insets.getSystemWindowInsetBottom()); + return insets; }); connectivityWarningView = findViewById(R.id.plans_picker_connectivity_warning_box); diff --git a/oeffi/src/de/schildbach/oeffi/preference/CommonFragment.java b/oeffi/src/de/schildbach/oeffi/preference/CommonFragment.java index 9486a15..cd73015 100644 --- a/oeffi/src/de/schildbach/oeffi/preference/CommonFragment.java +++ b/oeffi/src/de/schildbach/oeffi/preference/CommonFragment.java @@ -17,6 +17,7 @@ package de.schildbach.oeffi.preference; +import android.os.Build; import android.os.Bundle; import android.preference.PreferenceFragment; import de.schildbach.oeffi.R; @@ -24,11 +25,13 @@ import de.schildbach.oeffi.R; import javax.annotation.Nullable; public class CommonFragment extends PreferenceFragment { + private static final String KEY_BATTERY_OPTIMIZATIONS = "battery_optimizations"; @Override public void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); addPreferencesFromResource(R.xml.preference_common); + findPreference(KEY_BATTERY_OPTIMIZATIONS).setEnabled(Build.VERSION.SDK_INT >= Build.VERSION_CODES.M); } } diff --git a/oeffi/src/de/schildbach/oeffi/preference/PreferenceActivity.java b/oeffi/src/de/schildbach/oeffi/preference/PreferenceActivity.java index 2ee2611..ff08703 100644 --- a/oeffi/src/de/schildbach/oeffi/preference/PreferenceActivity.java +++ b/oeffi/src/de/schildbach/oeffi/preference/PreferenceActivity.java @@ -19,13 +19,9 @@ package de.schildbach.oeffi.preference; import android.app.Activity; import android.content.Intent; -import android.os.Bundle; import android.view.MenuItem; -import android.view.View; -import androidx.core.graphics.Insets; -import androidx.core.view.ViewCompat; -import androidx.core.view.WindowInsetsCompat; import de.schildbach.oeffi.R; +import de.schildbach.oeffi.Variants; import java.util.List; @@ -40,21 +36,11 @@ public class PreferenceActivity extends android.preference.PreferenceActivity { activity.startActivity(intent); } - @Override - public void onCreate(final Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - final View contentView = findViewById(android.R.id.content); - ViewCompat.setOnApplyWindowInsetsListener(contentView, (v, windowInsets) -> { - final Insets insets = windowInsets.getInsets(WindowInsetsCompat.Type.systemBars()); - v.setPadding(v.getPaddingLeft(), insets.top, v.getPaddingRight(), v.getPaddingBottom()); - return windowInsets; - }); - } - @Override public void onBuildHeaders(final List
target) { loadHeadersFromResource(R.xml.preference_headers, target); - loadHeadersFromResource(R.xml.preference_headers_donate, target); + if (Variants.ENABLE_DONATE) + loadHeadersFromResource(R.xml.preference_headers_donate, target); } @Override @@ -73,6 +59,6 @@ public class PreferenceActivity extends android.preference.PreferenceActivity { return CommonFragment.class.getName().equals(fragmentName) || DirectionsFragment.class.getName().equals(fragmentName) || AboutFragment.class.getName().equals(fragmentName) - || DonateFragment.class.getName().equals(fragmentName); + || (Variants.ENABLE_DONATE && DonateFragment.class.getName().equals(fragmentName)); } } diff --git a/oeffi/src/de/schildbach/oeffi/stations/FavoriteStationsActivity.java b/oeffi/src/de/schildbach/oeffi/stations/FavoriteStationsActivity.java index 729d99f..87ea4ed 100644 --- a/oeffi/src/de/schildbach/oeffi/stations/FavoriteStationsActivity.java +++ b/oeffi/src/de/schildbach/oeffi/stations/FavoriteStationsActivity.java @@ -25,9 +25,6 @@ import android.os.Bundle; import android.view.View; import android.widget.ViewAnimator; import androidx.activity.result.contract.ActivityResultContract; -import androidx.core.graphics.Insets; -import androidx.core.view.ViewCompat; -import androidx.core.view.WindowInsetsCompat; import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.RecyclerView; import de.schildbach.oeffi.MyActionBar; @@ -87,11 +84,10 @@ public class FavoriteStationsActivity extends OeffiActivity network = (NetworkId) intent.getSerializableExtra(INTENT_EXTRA_NETWORK); setContentView(R.layout.favorites_content); - final View contentView = findViewById(android.R.id.content); - ViewCompat.setOnApplyWindowInsetsListener(contentView, (v, windowInsets) -> { - final Insets insets = windowInsets.getInsets(WindowInsetsCompat.Type.systemBars()); - v.setPadding(insets.left, 0, insets.right, 0); - return windowInsets; + getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION); + findViewById(android.R.id.content).setOnApplyWindowInsetsListener((v, insets) -> { + v.setPadding(insets.getSystemWindowInsetLeft(), 0, insets.getSystemWindowInsetRight(), 0); + return insets; }); final MyActionBar actionBar = getMyActionBar(); @@ -106,10 +102,10 @@ public class FavoriteStationsActivity extends OeffiActivity listView.addItemDecoration(new DividerItemDecoration(this, DividerItemDecoration.VERTICAL_LIST)); adapter = new FavoriteStationsAdapter(this, network, this, network == null ? this : null); listView.setAdapter(adapter); - ViewCompat.setOnApplyWindowInsetsListener(listView, (v, windowInsets) -> { - final Insets insets = windowInsets.getInsets(WindowInsetsCompat.Type.systemBars()); - v.setPadding(v.getPaddingLeft(), v.getPaddingTop(), v.getPaddingRight(), insets.bottom); - return windowInsets; + listView.setOnApplyWindowInsetsListener((v, insets) -> { + v.setPadding(v.getPaddingLeft(), v.getPaddingTop(), v.getPaddingRight(), + insets.getSystemWindowInsetBottom()); + return insets; }); updateGUI(); diff --git a/oeffi/src/de/schildbach/oeffi/stations/StationDetailsActivity.java b/oeffi/src/de/schildbach/oeffi/stations/StationDetailsActivity.java index 7c57fe6..4ff6e10 100644 --- a/oeffi/src/de/schildbach/oeffi/stations/StationDetailsActivity.java +++ b/oeffi/src/de/schildbach/oeffi/stations/StationDetailsActivity.java @@ -34,12 +34,10 @@ import android.text.format.DateUtils; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; +import android.view.WindowManager; import android.widget.LinearLayout; import android.widget.TextView; import android.widget.ViewAnimator; -import androidx.core.graphics.Insets; -import androidx.core.view.ViewCompat; -import androidx.core.view.WindowInsetsCompat; import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.RecyclerView; import com.google.common.base.Joiner; @@ -140,11 +138,10 @@ public class StationDetailsActivity extends OeffiActivity implements StationsAwa backgroundHandler = new Handler(backgroundThread.getLooper()); setContentView(R.layout.stations_station_details_content); - final View contentView = findViewById(android.R.id.content); - ViewCompat.setOnApplyWindowInsetsListener(contentView, (v, windowInsets) -> { - final Insets insets = windowInsets.getInsets(WindowInsetsCompat.Type.systemBars()); - v.setPadding(insets.left, 0, insets.right, 0); - return windowInsets; + getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION); + findViewById(android.R.id.content).setOnApplyWindowInsetsListener((v, insets) -> { + v.setPadding(insets.getSystemWindowInsetLeft(), 0, insets.getSystemWindowInsetRight(), 0); + return insets; }); actionBar = getMyActionBar(); @@ -178,21 +175,19 @@ public class StationDetailsActivity extends OeffiActivity implements StationsAwa listView.addItemDecoration(new DividerItemDecoration(this, DividerItemDecoration.VERTICAL_LIST)); listAdapter = new DeparturesAdapter(this); listView.setAdapter(listAdapter); - ViewCompat.setOnApplyWindowInsetsListener(listView, (v, windowInsets) -> { - final Insets insets = windowInsets.getInsets(WindowInsetsCompat.Type.systemBars()); + listView.setOnApplyWindowInsetsListener((v, insets) -> { v.setPadding(v.getPaddingLeft(), v.getPaddingTop(), v.getPaddingRight(), - insets.bottom + (int) (48 * getResources().getDisplayMetrics().density)); - return windowInsets; + insets.getSystemWindowInsetBottom() + (int)(48 * getResources().getDisplayMetrics().density)); + return insets; }); mapView = findViewById(R.id.stations_station_details_map); mapView.setStationsAware(this); final TextView mapDisclaimerView = findViewById(R.id.stations_station_details_map_disclaimer); mapDisclaimerView.setText(mapView.getTileProvider().getTileSource().getCopyrightNotice()); - ViewCompat.setOnApplyWindowInsetsListener(mapDisclaimerView, (v, windowInsets) -> { - final Insets insets = windowInsets.getInsets(WindowInsetsCompat.Type.systemBars()); - v.setPadding(0, 0, 0, insets.bottom); - return windowInsets; + mapDisclaimerView.setOnApplyWindowInsetsListener((v, insets) -> { + v.setPadding(0,0,0, insets.getSystemWindowInsetBottom()); + return insets; }); resultStatusView = findViewById(R.id.stations_station_details_result_status); @@ -208,11 +203,9 @@ public class StationDetailsActivity extends OeffiActivity implements StationsAwa favoriteButton .setChecked(selectedFavState != null && selectedFavState == FavoriteStationsProvider.TYPE_FAVORITE); - final View disclaimerView = findViewById(R.id.stations_station_details_disclaimer_group); - ViewCompat.setOnApplyWindowInsetsListener(disclaimerView, (v, windowInsets) -> { - final Insets insets = windowInsets.getInsets(WindowInsetsCompat.Type.systemBars()); - v.setPadding(0, 0, 0, insets.bottom); - return windowInsets; + findViewById(R.id.stations_station_details_disclaimer_group).setOnApplyWindowInsetsListener((v, insets) -> { + v.setPadding(0, 0, 0, insets.getSystemWindowInsetBottom()); + return insets; }); disclaimerSourceView = findViewById(R.id.stations_station_details_disclaimer_source); updateDisclaimerSource(disclaimerSourceView, selectedNetwork.name(), null); @@ -265,6 +258,11 @@ public class StationDetailsActivity extends OeffiActivity implements StationsAwa super.onDestroy(); } + @Override + public void onAttachedToWindow() { + getWindow().addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED); + } + @Override public void onConfigurationChanged(final Configuration config) { super.onConfigurationChanged(config); @@ -433,8 +431,9 @@ public class StationDetailsActivity extends OeffiActivity implements StationsAwa @Override public int getItemCount() { final List selectedDepartures = StationDetailsActivity.this.selectedDepartures; - final int numDepartures = selectedDepartures != null ? selectedDepartures.size() : 0; - return numDepartures + 1; // account for header + if (selectedDepartures == null || selectedDepartures.isEmpty()) + return 1; + return selectedDepartures.size(); } @Override diff --git a/oeffi/src/de/schildbach/oeffi/stations/StationsActivity.java b/oeffi/src/de/schildbach/oeffi/stations/StationsActivity.java index 9cfc18c..2596490 100644 --- a/oeffi/src/de/schildbach/oeffi/stations/StationsActivity.java +++ b/oeffi/src/de/schildbach/oeffi/stations/StationsActivity.java @@ -56,9 +56,6 @@ import android.widget.ViewAnimator; import androidx.activity.result.ActivityResultLauncher; import androidx.activity.result.contract.ActivityResultContracts; import androidx.core.content.ContextCompat; -import androidx.core.graphics.Insets; -import androidx.core.view.ViewCompat; -import androidx.core.view.WindowInsetsCompat; import androidx.recyclerview.widget.ItemTouchHelper; import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.RecyclerView; @@ -187,11 +184,10 @@ public class StationsActivity extends OeffiMainActivity implements StationsAware res = getResources(); setContentView(R.layout.stations_content); - final View contentView = findViewById(android.R.id.content); - ViewCompat.setOnApplyWindowInsetsListener(contentView, (v, windowInsets) -> { - final Insets insets = windowInsets.getInsets(WindowInsetsCompat.Type.systemBars()); - v.setPadding(insets.left, 0, insets.right, 0); - return windowInsets; + getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION); + findViewById(android.R.id.content).setOnApplyWindowInsetsListener((v, insets) -> { + v.setPadding(insets.getSystemWindowInsetLeft(), 0, insets.getSystemWindowInsetRight(), 0); + return insets; }); actionBar = getMyActionBar(); @@ -270,26 +266,22 @@ public class StationsActivity extends OeffiMainActivity implements StationsAware mapView.setLocationAware(this); final TextView mapDisclaimerView = findViewById(R.id.stations_map_disclaimer); mapDisclaimerView.setText(mapView.getTileProvider().getTileSource().getCopyrightNotice()); - ViewCompat.setOnApplyWindowInsetsListener(mapDisclaimerView, (v, windowInsets) -> { - final Insets insets = windowInsets.getInsets(WindowInsetsCompat.Type.systemBars()); - v.setPadding(0, 0, 0, insets.bottom); - return windowInsets; + mapDisclaimerView.setOnApplyWindowInsetsListener((v, insets) -> { + v.setPadding(0, 0, 0, insets.getSystemWindowInsetBottom()); + return insets; }); final ZoomControls zoom = findViewById(R.id.stations_map_zoom); - ViewCompat.setOnApplyWindowInsetsListener(zoom, (v, windowInsets) -> { - final Insets insets = windowInsets.getInsets(WindowInsetsCompat.Type.systemBars()); - v.setPadding(0, 0, 0, insets.bottom); - return windowInsets; + zoom.setOnApplyWindowInsetsListener((v, insets) -> { + v.setPadding(0, 0, 0, insets.getSystemWindowInsetBottom()); + return insets; }); mapView.setZoomControls(zoom); connectivityWarningView = findViewById(R.id.stations_connectivity_warning_box); - final View disclaimerView = findViewById(R.id.stations_disclaimer_group); - ViewCompat.setOnApplyWindowInsetsListener(disclaimerView, (v, windowInsets) -> { - final Insets insets = windowInsets.getInsets(WindowInsetsCompat.Type.systemBars()); - v.setPadding(0, 0, 0, insets.bottom); - return windowInsets; + findViewById(R.id.stations_disclaimer_group).setOnApplyWindowInsetsListener((v, insets) -> { + v.setPadding(0, 0, 0, insets.getSystemWindowInsetBottom()); + return insets; }); disclaimerSourceView = findViewById(R.id.stations_disclaimer_source); @@ -423,11 +415,10 @@ public class StationsActivity extends OeffiMainActivity implements StationsAware stationList.addItemDecoration(new DividerItemDecoration(this, DividerItemDecoration.VERTICAL_LIST)); stationListAdapter = new StationsAdapter(this, maxDeparturesPerStation, products, this, this); stationList.setAdapter(stationListAdapter); - ViewCompat.setOnApplyWindowInsetsListener(stationList, (v, windowInsets) -> { - final Insets insets = windowInsets.getInsets(WindowInsetsCompat.Type.systemBars()); + stationList.setOnApplyWindowInsetsListener((v, insets) -> { v.setPadding(v.getPaddingLeft(), v.getPaddingTop(), v.getPaddingRight(), - insets.bottom + (int) (48 * res.getDisplayMetrics().density)); - return windowInsets; + insets.getSystemWindowInsetBottom() + (int)(48 * res.getDisplayMetrics().density)); + return insets; }); stationList.addOnScrollListener(new RecyclerView.OnScrollListener() { @Override diff --git a/oeffi/src/de/schildbach/oeffi/util/ErrorReporter.java b/oeffi/src/de/schildbach/oeffi/util/ErrorReporter.java index cbc90ce..4ffd60e 100644 --- a/oeffi/src/de/schildbach/oeffi/util/ErrorReporter.java +++ b/oeffi/src/de/schildbach/oeffi/util/ErrorReporter.java @@ -181,7 +181,8 @@ public class ErrorReporter implements Thread.UncaughtExceptionHandler { report.append("Manufacturer: " + Build.MANUFACTURER + "\n"); report.append("Phone Model: " + Build.MODEL + "\n"); report.append("Android Version: " + Build.VERSION.RELEASE + "\n"); - report.append("Android security patch level: ").append(Build.VERSION.SECURITY_PATCH).append("\n"); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) + report.append("Android security patch level: ").append(Build.VERSION.SECURITY_PATCH).append("\n"); report.append("ABIs: ").append(Joiner.on(", ").skipNulls().join(Strings.emptyToNull(Build.CPU_ABI), Strings.emptyToNull(Build.CPU_ABI2))).append("\n"); report.append("Board: " + Build.BOARD + "\n"); @@ -314,12 +315,15 @@ public class ErrorReporter implements Thread.UncaughtExceptionHandler { private final static Pattern PATTERN_VERSION = Pattern.compile("
([^<]*)
"); - public void check(final Context context, final int applicationVersionCode, final OkHttpClient okHttpClient) { + public void check(final Context context, final int applicationVersionCode, final String applicationVersionFlavor, + final OkHttpClient okHttpClient) { if (!stackTraceFile.exists()) return; final HttpUrl.Builder url = HttpUrl.parse(context.getString(R.string.about_changelog_summary)).newBuilder(); url.addQueryParameter("version", Integer.toString(applicationVersionCode)); + if (applicationVersionFlavor != null) + url.addQueryParameter("flavor", applicationVersionFlavor); url.addQueryParameter("sdk", Integer.toString(Build.VERSION.SDK_INT)); url.addQueryParameter("check", null); final Request.Builder request = new Request.Builder().url(url.build()); diff --git a/oeffi/src/de/schildbach/oeffi/util/Toast.java b/oeffi/src/de/schildbach/oeffi/util/Toast.java index 35388d8..e823108 100644 --- a/oeffi/src/de/schildbach/oeffi/util/Toast.java +++ b/oeffi/src/de/schildbach/oeffi/util/Toast.java @@ -18,6 +18,9 @@ package de.schildbach.oeffi.util; import android.content.Context; +import android.graphics.PorterDuff; +import android.widget.TextView; +import de.schildbach.oeffi.R; public class Toast { private final Context context; diff --git a/public-transport-enabler b/public-transport-enabler index c7f77ac..a06bdea 160000 --- a/public-transport-enabler +++ b/public-transport-enabler @@ -1 +1 @@ -Subproject commit c7f77ac4c89b9dbb31625998b9de1dd3d617d68a +Subproject commit a06bdeabfd835457f97d5bf23d423591d0b95e13 diff --git a/settings.gradle b/settings.gradle index 7fe5e56..930ac5a 100644 --- a/settings.gradle +++ b/settings.gradle @@ -9,7 +9,8 @@ if (GradleVersion.current() < minGradleVersion || GradleVersion.current() >= max throw new GradleScriptException("build requires Gradle between ${minGradleVersion.version} (including) and ${maxGradleVersion.version} (excluding)", null) gradle.startParameter.excludedTaskNames << "lint" -gradle.startParameter.excludedTaskNames << ":oeffi:lintVitalRelease" +gradle.startParameter.excludedTaskNames << ":oeffi:lintVitalAospRelease" +gradle.startParameter.excludedTaskNames << ":oeffi:lintVitalGoogleRelease" include 'oeffi' include 'public-transport-enabler'