mirror of
https://gitlab.com/oeffi/oeffi.git
synced 2025-07-07 06:08:51 +00:00
Compare commits
28 commits
Author | SHA1 | Date | |
---|---|---|---|
![]() |
f1198671b1 | ||
![]() |
2736bc82dd | ||
![]() |
cd6628088a | ||
![]() |
e7e8af6a10 | ||
![]() |
53c5ea26b6 | ||
![]() |
37949d2628 | ||
![]() |
90c3e70665 | ||
![]() |
d1c124478d | ||
![]() |
004f32b234 | ||
![]() |
e361a6fc06 | ||
![]() |
d76e357603 | ||
![]() |
2f158a9b5b | ||
![]() |
3dfa049ae2 | ||
![]() |
e17a2ff2dc | ||
![]() |
d8b885fca3 | ||
![]() |
71f315ac59 | ||
![]() |
ce7fedc76e | ||
![]() |
3b80a7a3b4 | ||
![]() |
0bd83c0125 | ||
![]() |
c5ee0db526 | ||
![]() |
99b737f237 | ||
![]() |
59168f51c4 | ||
![]() |
eb23268ebc | ||
![]() |
2a1cc53180 | ||
![]() |
b5dac623dd | ||
![]() |
2e00027604 | ||
![]() |
335fdea1f8 | ||
![]() |
75913e122a |
31 changed files with 213 additions and 141 deletions
|
@ -18,8 +18,11 @@ FROM debian:bookworm-slim AS build-stage
|
||||||
|
|
||||||
# install debian packages
|
# install debian packages
|
||||||
ENV DEBIAN_FRONTEND noninteractive
|
ENV DEBIAN_FRONTEND noninteractive
|
||||||
RUN /usr/bin/apt-get update && \
|
RUN --mount=target=/var/lib/apt/lists,type=cache,sharing=locked \
|
||||||
/usr/bin/apt-get --yes install disorderfs openjdk-17-jdk-headless gradle sdkmanager && \
|
--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 && \
|
||||||
/bin/ln -fs /usr/share/zoneinfo/CET /etc/localtime && \
|
/bin/ln -fs /usr/share/zoneinfo/CET /etc/localtime && \
|
||||||
/usr/sbin/dpkg-reconfigure --frontend noninteractive tzdata && \
|
/usr/sbin/dpkg-reconfigure --frontend noninteractive tzdata && \
|
||||||
/bin/ln -s /proc/self/mounts /etc/mtab && \
|
/bin/ln -s /proc/self/mounts /etc/mtab && \
|
||||||
|
@ -34,10 +37,13 @@ COPY --chown=builder / project/
|
||||||
|
|
||||||
# accept SDK licenses
|
# accept SDK licenses
|
||||||
ENV ANDROID_HOME /home/builder/android-sdk
|
ENV ANDROID_HOME /home/builder/android-sdk
|
||||||
RUN yes | /usr/bin/sdkmanager --licenses >/dev/null
|
RUN --mount=target=/home/builder/android-sdk,type=cache,uid=1000,gid=1000,sharing=locked \
|
||||||
|
yes | /usr/bin/sdkmanager --licenses >/dev/null
|
||||||
|
|
||||||
# build project
|
# build project
|
||||||
RUN if [ -e /dev/fuse ] ; \
|
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 ] ; \
|
||||||
then /bin/mv project project.u && /bin/mkdir project && \
|
then /bin/mv project project.u && /bin/mkdir project && \
|
||||||
/usr/bin/disorderfs --sort-dirents=yes --reverse-dirents=no project.u project ; \
|
/usr/bin/disorderfs --sort-dirents=yes --reverse-dirents=no project.u project ; \
|
||||||
fi && \
|
fi && \
|
||||||
|
|
|
@ -20,12 +20,12 @@
|
||||||
xmlns:android="http://schemas.android.com/apk/res/android"
|
xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
xmlns:tools="http://schemas.android.com/tools"
|
xmlns:tools="http://schemas.android.com/tools"
|
||||||
package="de.schildbach.oeffi"
|
package="de.schildbach.oeffi"
|
||||||
android:versionCode="130003"
|
android:versionCode="130011"
|
||||||
android:versionName="13.0.3">
|
android:versionName="13.0.11">
|
||||||
|
|
||||||
<uses-sdk
|
<uses-sdk
|
||||||
android:minSdkVersion="24"
|
android:minSdkVersion="24"
|
||||||
android:targetSdkVersion="34" />
|
android:targetSdkVersion="35" />
|
||||||
|
|
||||||
<uses-permission android:name="android.permission.INTERNET" />
|
<uses-permission android:name="android.permission.INTERNET" />
|
||||||
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
|
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
|
||||||
|
|
|
@ -1,3 +1,11 @@
|
||||||
|
v13.0.11
|
||||||
|
|
||||||
|
* Add region again: Poland (PKP)
|
||||||
|
|
||||||
|
v13.0.4-v13.0.10
|
||||||
|
|
||||||
|
* Target Android 15.
|
||||||
|
|
||||||
v13.0.3
|
v13.0.3
|
||||||
|
|
||||||
* Remove regions: Czech Republic, Italy, Paris, Spain, Nicaragua
|
* Remove regions: Czech Republic, Italy, Paris, Spain, Nicaragua
|
||||||
|
|
|
@ -65,6 +65,9 @@ SE|sv-SE|SE;Stockholm
|
||||||
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
|
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
|
MERSEY|en-UK|GB;Liverpool|beta
|
||||||
|
|
||||||
|
# PL
|
||||||
|
PL|pl-PL|PL;Warschau
|
||||||
|
|
||||||
# AE
|
# AE
|
||||||
DUB|ae-AE|AE;Dubai|beta
|
DUB|ae-AE|AE;Dubai|beta
|
||||||
|
|
||||||
|
|
|
@ -20,12 +20,12 @@ dependencies {
|
||||||
implementation 'androidx.coordinatorlayout:coordinatorlayout:1.2.0'
|
implementation 'androidx.coordinatorlayout:coordinatorlayout:1.2.0'
|
||||||
implementation 'androidx.drawerlayout:drawerlayout:1.2.0'
|
implementation 'androidx.drawerlayout:drawerlayout:1.2.0'
|
||||||
implementation 'androidx.core:core:1.13.1'
|
implementation 'androidx.core:core:1.13.1'
|
||||||
implementation 'androidx.activity:activity:1.9.1'
|
implementation 'androidx.activity:activity:1.9.3'
|
||||||
//noinspection GradleDependency
|
//noinspection GradleDependency
|
||||||
implementation 'com.squareup.okhttp3:okhttp:3.12.13'
|
implementation 'com.squareup.okhttp3:okhttp:3.12.13'
|
||||||
//noinspection GradleDependency
|
//noinspection GradleDependency
|
||||||
implementation 'com.squareup.okhttp3:logging-interceptor:3.12.13'
|
implementation 'com.squareup.okhttp3:logging-interceptor:3.12.13'
|
||||||
implementation 'com.google.guava:guava:33.3.0-android'
|
implementation 'com.google.guava:guava:33.4.0-android'
|
||||||
implementation 'org.osmdroid:osmdroid-android:6.1.20'
|
implementation 'org.osmdroid:osmdroid-android:6.1.20'
|
||||||
//noinspection GradleDependency
|
//noinspection GradleDependency
|
||||||
implementation 'org.slf4j:slf4j-api:2.0.9'
|
implementation 'org.slf4j:slf4j-api:2.0.9'
|
||||||
|
|
|
@ -4,6 +4,7 @@
|
||||||
android:id="@+id/plans_layout"
|
android:id="@+id/plans_layout"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="match_parent"
|
android:layout_height="match_parent"
|
||||||
|
android:background="@color/bg_plan"
|
||||||
android:inAnimation="@android:anim/fade_in"
|
android:inAnimation="@android:anim/fade_in"
|
||||||
android:outAnimation="@android:anim/fade_out">
|
android:outAnimation="@android:anim/fade_out">
|
||||||
|
|
||||||
|
@ -24,7 +25,7 @@
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:paddingTop="8dp"
|
android:paddingTop="8dp"
|
||||||
android:text="@string/plan_progress_loading"
|
android:text="@string/plan_progress_loading"
|
||||||
android:textColor="@color/fg_significant_on_dark"
|
android:textColor="@color/fg_significant_on_light"
|
||||||
android:textStyle="bold" />
|
android:textStyle="bold" />
|
||||||
</LinearLayout>
|
</LinearLayout>
|
||||||
|
|
||||||
|
|
|
@ -97,6 +97,8 @@
|
||||||
<string name="network_tlem_comment">Lokal- und Regionalverkehr (z.B. London, Birmingham)</string>
|
<string name="network_tlem_comment">Lokal- und Regionalverkehr (z.B. London, Birmingham)</string>
|
||||||
<string name="network_mersey_label">Liverpool</string>
|
<string name="network_mersey_label">Liverpool</string>
|
||||||
<string name="network_mersey_comment">Lokal- und Regionalverkehr</string>
|
<string name="network_mersey_comment">Lokal- und Regionalverkehr</string>
|
||||||
|
<string name="network_pl_label">Polen</string>
|
||||||
|
<string name="network_pl_comment">Fern-, Regional und Lokalverkehr (z.B. Warschau)</string>
|
||||||
<string name="network_dub_label">Dubai</string>
|
<string name="network_dub_label">Dubai</string>
|
||||||
<string name="network_dub_comment">Lokalverkehr</string>
|
<string name="network_dub_comment">Lokalverkehr</string>
|
||||||
<string name="network_bart_label">San Francisco</string>
|
<string name="network_bart_label">San Francisco</string>
|
||||||
|
|
|
@ -1,9 +0,0 @@
|
||||||
<?xml version="1.0" encoding="utf-8"?>
|
|
||||||
<resources>
|
|
||||||
|
|
||||||
<!-- background -->
|
|
||||||
<color name="bg_status_bar">@android:color/transparent</color>
|
|
||||||
<color name="bg_navigation_bar">@android:color/transparent</color>
|
|
||||||
<color name="bg_navigation_bar_fullscreen">@android:color/transparent</color>
|
|
||||||
|
|
||||||
</resources>
|
|
|
@ -23,7 +23,6 @@
|
||||||
<color name="bg_delayed">#444444</color>
|
<color name="bg_delayed">#444444</color>
|
||||||
<color name="bg_current_time">#ffff00</color>
|
<color name="bg_current_time">#ffff00</color>
|
||||||
<color name="bg_position">#bbbbbb</color>
|
<color name="bg_position">#bbbbbb</color>
|
||||||
<color name="bg_status_bar">#44000000</color>
|
|
||||||
|
|
||||||
<item name="alpha_bright_white" format="float" type="dimen">0.8</item>
|
<item name="alpha_bright_white" format="float" type="dimen">0.8</item>
|
||||||
|
|
||||||
|
|
|
@ -5,8 +5,6 @@
|
||||||
|
|
||||||
<style name="My.Theme" parent="@android:style/Theme.Material.NoActionBar">
|
<style name="My.Theme" parent="@android:style/Theme.Material.NoActionBar">
|
||||||
<item name="android:windowBackground">@color/bg_level0</item>
|
<item name="android:windowBackground">@color/bg_level0</item>
|
||||||
<item name="android:statusBarColor">@color/bg_status_bar</item>
|
|
||||||
<item name="android:navigationBarColor">@color/bg_navigation_bar</item>
|
|
||||||
<item name="android:textViewStyle">@style/My.Widget.TextView</item>
|
<item name="android:textViewStyle">@style/My.Widget.TextView</item>
|
||||||
<item name="android:autoCompleteTextViewStyle">@style/My.Widget.AutoCompleteTextView</item>
|
<item name="android:autoCompleteTextViewStyle">@style/My.Widget.AutoCompleteTextView</item>
|
||||||
<item name="android:dropDownListViewStyle">@style/My.Widget.ListView.DropDown</item>
|
<item name="android:dropDownListViewStyle">@style/My.Widget.ListView.DropDown</item>
|
||||||
|
@ -17,8 +15,6 @@
|
||||||
</style>
|
</style>
|
||||||
|
|
||||||
<style name="My.Theme.Preference" parent="@android:style/Theme.Material">
|
<style name="My.Theme.Preference" parent="@android:style/Theme.Material">
|
||||||
<item name="android:statusBarColor">@color/bg_action_bar</item>
|
|
||||||
<item name="android:navigationBarColor">@color/bg_level0</item>
|
|
||||||
<item name="android:actionBarStyle">@style/My.Widget.ActionBar</item>
|
<item name="android:actionBarStyle">@style/My.Widget.ActionBar</item>
|
||||||
</style>
|
</style>
|
||||||
|
|
||||||
|
|
|
@ -4,8 +4,6 @@
|
||||||
|
|
||||||
<style name="My.Theme.DarkDefault" parent="@android:style/Theme.Material.Light.NoActionBar">
|
<style name="My.Theme.DarkDefault" parent="@android:style/Theme.Material.Light.NoActionBar">
|
||||||
<item name="android:windowBackground">@color/bg_level0_darkdefault</item>
|
<item name="android:windowBackground">@color/bg_level0_darkdefault</item>
|
||||||
<item name="android:statusBarColor">@color/bg_status_bar</item>
|
|
||||||
<item name="android:navigationBarColor">@color/bg_navigation_bar</item>
|
|
||||||
<item name="android:textViewStyle">@style/My.Widget.TextView.DarkDefault</item>
|
<item name="android:textViewStyle">@style/My.Widget.TextView.DarkDefault</item>
|
||||||
<item name="android:imageButtonStyle">@style/My.Widget.ImageButton</item>
|
<item name="android:imageButtonStyle">@style/My.Widget.ImageButton</item>
|
||||||
</style>
|
</style>
|
||||||
|
|
|
@ -1,9 +0,0 @@
|
||||||
<?xml version="1.0" encoding="utf-8"?>
|
|
||||||
<resources>
|
|
||||||
|
|
||||||
<!-- background -->
|
|
||||||
<color name="bg_status_bar">@android:color/transparent</color>
|
|
||||||
<color name="bg_navigation_bar">@android:color/transparent</color>
|
|
||||||
<color name="bg_navigation_bar_fullscreen">@android:color/transparent</color>
|
|
||||||
|
|
||||||
</resources>
|
|
|
@ -37,9 +37,7 @@
|
||||||
<color name="bg_position">#757575</color>
|
<color name="bg_position">#757575</color>
|
||||||
<color name="bg_position_darkdefault">#bbbbbb</color>
|
<color name="bg_position_darkdefault">#bbbbbb</color>
|
||||||
<color name="bg_highlighted_darkdefault">#ff4444</color>
|
<color name="bg_highlighted_darkdefault">#ff4444</color>
|
||||||
<color name="bg_status_bar">#44000000</color>
|
<color name="bg_plan">#ffd8d8d8</color>
|
||||||
<color name="bg_navigation_bar">@android:color/black</color>
|
|
||||||
<color name="bg_navigation_bar_fullscreen">#44000000</color>
|
|
||||||
|
|
||||||
<item name="alpha_bright_white" format="float" type="dimen">1</item>
|
<item name="alpha_bright_white" format="float" type="dimen">1</item>
|
||||||
|
|
||||||
|
|
|
@ -97,6 +97,8 @@
|
||||||
<string name="network_tlem_comment">local and regional (e.g. London, Birmingham)</string>
|
<string name="network_tlem_comment">local and regional (e.g. London, Birmingham)</string>
|
||||||
<string name="network_mersey_label">Liverpool</string>
|
<string name="network_mersey_label">Liverpool</string>
|
||||||
<string name="network_mersey_comment">local and regional</string>
|
<string name="network_mersey_comment">local and regional</string>
|
||||||
|
<string name="network_pl_label">Poland</string>
|
||||||
|
<string name="network_pl_comment">long-distance, regional and local (e.g. Warsaw)</string>
|
||||||
<string name="network_dub_label">Dubai</string>
|
<string name="network_dub_label">Dubai</string>
|
||||||
<string name="network_dub_comment">local</string>
|
<string name="network_dub_comment">local</string>
|
||||||
<string name="network_bart_label">San Francisco</string>
|
<string name="network_bart_label">San Francisco</string>
|
||||||
|
|
|
@ -46,7 +46,7 @@
|
||||||
<!-- preferences about -->
|
<!-- preferences about -->
|
||||||
<string name="about_title">About Offi</string>
|
<string name="about_title">About Offi</string>
|
||||||
<string name="about_copyright_title">Copyright</string>
|
<string name="about_copyright_title">Copyright</string>
|
||||||
<string name="about_copyright_summary">© 2010-2024, the Öffi developers</string>
|
<string name="about_copyright_summary">© 2010-2025, the Öffi developers</string>
|
||||||
<string name="about_license_title">License</string>
|
<string name="about_license_title">License</string>
|
||||||
<string name="about_privacy_policy_title">Privacy Policy</string>
|
<string name="about_privacy_policy_title">Privacy Policy</string>
|
||||||
<string name="about_privacy_policy_url">https://oeffi.schildbach.de/privacy_policy.txt</string>
|
<string name="about_privacy_policy_url">https://oeffi.schildbach.de/privacy_policy.txt</string>
|
||||||
|
|
|
@ -5,8 +5,6 @@
|
||||||
|
|
||||||
<style name="My.Theme" parent="@android:style/Theme.Material.Light.NoActionBar">
|
<style name="My.Theme" parent="@android:style/Theme.Material.Light.NoActionBar">
|
||||||
<item name="android:windowBackground">@color/bg_level0</item>
|
<item name="android:windowBackground">@color/bg_level0</item>
|
||||||
<item name="android:statusBarColor">@color/bg_status_bar</item>
|
|
||||||
<item name="android:navigationBarColor">@color/bg_navigation_bar</item>
|
|
||||||
<item name="android:textViewStyle">@style/My.Widget.TextView</item>
|
<item name="android:textViewStyle">@style/My.Widget.TextView</item>
|
||||||
<item name="android:autoCompleteTextViewStyle">@style/My.Widget.AutoCompleteTextView</item>
|
<item name="android:autoCompleteTextViewStyle">@style/My.Widget.AutoCompleteTextView</item>
|
||||||
<item name="android:dropDownListViewStyle">@style/My.Widget.ListView.DropDown</item>
|
<item name="android:dropDownListViewStyle">@style/My.Widget.ListView.DropDown</item>
|
||||||
|
@ -18,8 +16,6 @@
|
||||||
|
|
||||||
<style name="My.Theme.DarkDefault" parent="@android:style/Theme.Material.NoActionBar">
|
<style name="My.Theme.DarkDefault" parent="@android:style/Theme.Material.NoActionBar">
|
||||||
<item name="android:windowBackground">@color/bg_level0_darkdefault</item>
|
<item name="android:windowBackground">@color/bg_level0_darkdefault</item>
|
||||||
<item name="android:statusBarColor">@color/bg_status_bar</item>
|
|
||||||
<item name="android:navigationBarColor">@color/bg_navigation_bar</item>
|
|
||||||
<item name="android:textViewStyle">@style/My.Widget.TextView.DarkDefault</item>
|
<item name="android:textViewStyle">@style/My.Widget.TextView.DarkDefault</item>
|
||||||
<item name="android:imageButtonStyle">@style/My.Widget.ImageButton</item>
|
<item name="android:imageButtonStyle">@style/My.Widget.ImageButton</item>
|
||||||
</style>
|
</style>
|
||||||
|
@ -27,13 +23,10 @@
|
||||||
<style name="My.Theme.Fullscreen" parent="@android:style/Theme.Material.Light.NoActionBar.Fullscreen">
|
<style name="My.Theme.Fullscreen" parent="@android:style/Theme.Material.Light.NoActionBar.Fullscreen">
|
||||||
<item name="android:windowBackground">@android:color/black</item>
|
<item name="android:windowBackground">@android:color/black</item>
|
||||||
<item name="android:windowLayoutInDisplayCutoutMode" tools:targetApi="27">shortEdges</item>
|
<item name="android:windowLayoutInDisplayCutoutMode" tools:targetApi="27">shortEdges</item>
|
||||||
<item name="android:navigationBarColor">@color/bg_navigation_bar_fullscreen</item>
|
|
||||||
<item name="android:textViewStyle">@style/My.Widget.TextView</item>
|
<item name="android:textViewStyle">@style/My.Widget.TextView</item>
|
||||||
</style>
|
</style>
|
||||||
|
|
||||||
<style name="My.Theme.Preference" parent="@android:style/Theme.Material.Light.DarkActionBar">
|
<style name="My.Theme.Preference" parent="@android:style/Theme.Material.Light.DarkActionBar">
|
||||||
<item name="android:statusBarColor">@color/bg_action_bar</item>
|
|
||||||
<item name="android:navigationBarColor">@color/bg_level0</item>
|
|
||||||
<item name="android:actionBarStyle">@style/My.Widget.ActionBar</item>
|
<item name="android:actionBarStyle">@style/My.Widget.ActionBar</item>
|
||||||
</style>
|
</style>
|
||||||
|
|
||||||
|
|
|
@ -15,6 +15,7 @@
|
||||||
<domain includeSubdomains="false">appefa10.verbundlinie.at</domain><!-- STV -->
|
<domain includeSubdomains="false">appefa10.verbundlinie.at</domain><!-- STV -->
|
||||||
<domain includeSubdomains="false">railteam.hafas.eu</domain><!-- Railteam -->
|
<domain includeSubdomains="false">railteam.hafas.eu</domain><!-- Railteam -->
|
||||||
<domain includeSubdomains="false">mobil.vbl.ch</domain><!-- VBL -->
|
<domain includeSubdomains="false">mobil.vbl.ch</domain><!-- VBL -->
|
||||||
|
<domain includeSubdomains="false">mobil.rozklad-pkp.pl</domain><!-- PKP -->
|
||||||
</domain-config>
|
</domain-config>
|
||||||
|
|
||||||
</network-security-config>
|
</network-security-config>
|
||||||
|
|
|
@ -17,7 +17,9 @@
|
||||||
|
|
||||||
package de.schildbach.oeffi;
|
package de.schildbach.oeffi;
|
||||||
|
|
||||||
|
import android.graphics.Color;
|
||||||
import android.text.format.DateUtils;
|
import android.text.format.DateUtils;
|
||||||
|
import androidx.activity.SystemBarStyle;
|
||||||
import okhttp3.HttpUrl;
|
import okhttp3.HttpUrl;
|
||||||
|
|
||||||
import java.util.Locale;
|
import java.util.Locale;
|
||||||
|
@ -65,4 +67,6 @@ public class Constants {
|
||||||
public static final String DESTINATION_ARROW_PREFIX = Character.toString(Constants.CHAR_RIGHTWARDS_ARROW)
|
public static final String DESTINATION_ARROW_PREFIX = Character.toString(Constants.CHAR_RIGHTWARDS_ARROW)
|
||||||
+ Constants.CHAR_THIN_SPACE;
|
+ Constants.CHAR_THIN_SPACE;
|
||||||
public static final String DESTINATION_ARROW_INVISIBLE_PREFIX = " ";
|
public static final String DESTINATION_ARROW_INVISIBLE_PREFIX = " ";
|
||||||
|
|
||||||
|
public static final SystemBarStyle STATUS_BAR_STYLE = SystemBarStyle.dark(Color.TRANSPARENT);
|
||||||
}
|
}
|
||||||
|
|
|
@ -20,6 +20,7 @@ package de.schildbach.oeffi;
|
||||||
import android.app.ActivityManager.TaskDescription;
|
import android.app.ActivityManager.TaskDescription;
|
||||||
import android.content.SharedPreferences;
|
import android.content.SharedPreferences;
|
||||||
import android.content.res.Resources;
|
import android.content.res.Resources;
|
||||||
|
import android.graphics.Color;
|
||||||
import android.graphics.drawable.Drawable;
|
import android.graphics.drawable.Drawable;
|
||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
import android.preference.PreferenceManager;
|
import android.preference.PreferenceManager;
|
||||||
|
@ -29,6 +30,7 @@ import android.view.ViewGroup;
|
||||||
import android.widget.LinearLayout;
|
import android.widget.LinearLayout;
|
||||||
import android.widget.TextView;
|
import android.widget.TextView;
|
||||||
import androidx.activity.ComponentActivity;
|
import androidx.activity.ComponentActivity;
|
||||||
|
import androidx.activity.EdgeToEdge;
|
||||||
import de.schildbach.oeffi.network.NetworkResources;
|
import de.schildbach.oeffi.network.NetworkResources;
|
||||||
import de.schildbach.oeffi.util.ErrorReporter;
|
import de.schildbach.oeffi.util.ErrorReporter;
|
||||||
import de.schildbach.pte.NetworkId;
|
import de.schildbach.pte.NetworkId;
|
||||||
|
@ -44,6 +46,7 @@ public abstract class OeffiActivity extends ComponentActivity {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void onCreate(final Bundle savedInstanceState) {
|
protected void onCreate(final Bundle savedInstanceState) {
|
||||||
|
EdgeToEdge.enable(this, Constants.STATUS_BAR_STYLE);
|
||||||
super.onCreate(savedInstanceState);
|
super.onCreate(savedInstanceState);
|
||||||
this.application = (Application) getApplication();
|
this.application = (Application) getApplication();
|
||||||
this.prefs = PreferenceManager.getDefaultSharedPreferences(this);
|
this.prefs = PreferenceManager.getDefaultSharedPreferences(this);
|
||||||
|
|
|
@ -63,7 +63,9 @@ import androidx.activity.result.contract.ActivityResultContract;
|
||||||
import androidx.activity.result.contract.ActivityResultContracts;
|
import androidx.activity.result.contract.ActivityResultContracts;
|
||||||
import androidx.coordinatorlayout.widget.CoordinatorLayout;
|
import androidx.coordinatorlayout.widget.CoordinatorLayout;
|
||||||
import androidx.core.content.ContextCompat;
|
import androidx.core.content.ContextCompat;
|
||||||
|
import androidx.core.graphics.Insets;
|
||||||
import androidx.core.view.ViewCompat;
|
import androidx.core.view.ViewCompat;
|
||||||
|
import androidx.core.view.WindowInsetsCompat;
|
||||||
import androidx.recyclerview.widget.LinearLayoutManager;
|
import androidx.recyclerview.widget.LinearLayoutManager;
|
||||||
import androidx.recyclerview.widget.RecyclerView;
|
import androidx.recyclerview.widget.RecyclerView;
|
||||||
import com.google.common.base.Throwables;
|
import com.google.common.base.Throwables;
|
||||||
|
@ -307,10 +309,11 @@ public class DirectionsActivity extends OeffiMainActivity implements QueryHistor
|
||||||
backgroundHandler = new Handler(backgroundThread.getLooper());
|
backgroundHandler = new Handler(backgroundThread.getLooper());
|
||||||
|
|
||||||
setContentView(R.layout.directions_content);
|
setContentView(R.layout.directions_content);
|
||||||
getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION);
|
final View contentView = findViewById(android.R.id.content);
|
||||||
findViewById(android.R.id.content).setOnApplyWindowInsetsListener((v, insets) -> {
|
ViewCompat.setOnApplyWindowInsetsListener(contentView, (v, windowInsets) -> {
|
||||||
v.setPadding(insets.getSystemWindowInsetLeft(), 0, insets.getSystemWindowInsetRight(), 0);
|
final Insets insets = windowInsets.getInsets(WindowInsetsCompat.Type.systemBars());
|
||||||
return insets;
|
v.setPadding(insets.left, 0, insets.right, 0);
|
||||||
|
return windowInsets;
|
||||||
});
|
});
|
||||||
|
|
||||||
final MyActionBar actionBar = getMyActionBar();
|
final MyActionBar actionBar = getMyActionBar();
|
||||||
|
@ -456,10 +459,11 @@ public class DirectionsActivity extends OeffiMainActivity implements QueryHistor
|
||||||
viewQueryHistoryList.addItemDecoration(new DividerItemDecoration(this, DividerItemDecoration.VERTICAL_LIST));
|
viewQueryHistoryList.addItemDecoration(new DividerItemDecoration(this, DividerItemDecoration.VERTICAL_LIST));
|
||||||
queryHistoryListAdapter = new QueryHistoryAdapter(this, network, this, this);
|
queryHistoryListAdapter = new QueryHistoryAdapter(this, network, this, this);
|
||||||
viewQueryHistoryList.setAdapter(queryHistoryListAdapter);
|
viewQueryHistoryList.setAdapter(queryHistoryListAdapter);
|
||||||
viewQueryHistoryList.setOnApplyWindowInsetsListener((v, insets) -> {
|
ViewCompat.setOnApplyWindowInsetsListener(viewQueryHistoryList, (v, windowInsets) -> {
|
||||||
|
final Insets insets = windowInsets.getInsets(WindowInsetsCompat.Type.systemBars());
|
||||||
v.setPadding(v.getPaddingLeft(), v.getPaddingTop(), v.getPaddingRight(),
|
v.setPadding(v.getPaddingLeft(), v.getPaddingTop(), v.getPaddingRight(),
|
||||||
insets.getSystemWindowInsetBottom());
|
insets.bottom);
|
||||||
return insets;
|
return windowInsets;
|
||||||
});
|
});
|
||||||
|
|
||||||
viewQueryHistoryEmpty = findViewById(R.id.directions_query_history_empty);
|
viewQueryHistoryEmpty = findViewById(R.id.directions_query_history_empty);
|
||||||
|
@ -546,15 +550,17 @@ public class DirectionsActivity extends OeffiMainActivity implements QueryHistor
|
||||||
});
|
});
|
||||||
final TextView mapDisclaimerView = findViewById(R.id.directions_map_disclaimer);
|
final TextView mapDisclaimerView = findViewById(R.id.directions_map_disclaimer);
|
||||||
mapDisclaimerView.setText(mapView.getTileProvider().getTileSource().getCopyrightNotice());
|
mapDisclaimerView.setText(mapView.getTileProvider().getTileSource().getCopyrightNotice());
|
||||||
mapDisclaimerView.setOnApplyWindowInsetsListener((v, insets) -> {
|
ViewCompat.setOnApplyWindowInsetsListener(mapDisclaimerView, (v, windowInsets) -> {
|
||||||
v.setPadding(0,0,0, insets.getSystemWindowInsetBottom());
|
final Insets insets = windowInsets.getInsets(WindowInsetsCompat.Type.systemBars());
|
||||||
return insets;
|
v.setPadding(0, 0, 0, insets.bottom);
|
||||||
|
return windowInsets;
|
||||||
});
|
});
|
||||||
|
|
||||||
final ZoomControls zoom = findViewById(R.id.directions_map_zoom);
|
final ZoomControls zoom = findViewById(R.id.directions_map_zoom);
|
||||||
zoom.setOnApplyWindowInsetsListener((v, insets) -> {
|
ViewCompat.setOnApplyWindowInsetsListener(zoom, (v, windowInsets) -> {
|
||||||
v.setPadding(0, 0, 0, insets.getSystemWindowInsetBottom());
|
final Insets insets = windowInsets.getInsets(WindowInsetsCompat.Type.systemBars());
|
||||||
return insets;
|
v.setPadding(0, 0, 0, insets.bottom);
|
||||||
|
return windowInsets;
|
||||||
});
|
});
|
||||||
mapView.setZoomControls(zoom);
|
mapView.setZoomControls(zoom);
|
||||||
|
|
||||||
|
|
|
@ -50,6 +50,9 @@ import android.widget.PopupMenu;
|
||||||
import android.widget.TableLayout;
|
import android.widget.TableLayout;
|
||||||
import android.widget.TextView;
|
import android.widget.TextView;
|
||||||
import androidx.core.content.ContextCompat;
|
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 com.google.common.base.MoreObjects;
|
||||||
import de.schildbach.oeffi.Constants;
|
import de.schildbach.oeffi.Constants;
|
||||||
import de.schildbach.oeffi.LocationAware;
|
import de.schildbach.oeffi.LocationAware;
|
||||||
|
@ -186,10 +189,11 @@ public class TripDetailsActivity extends OeffiActivity implements LocationListen
|
||||||
scheduleTripIntent = scheduleTripIntent(trip);
|
scheduleTripIntent = scheduleTripIntent(trip);
|
||||||
|
|
||||||
setContentView(R.layout.directions_trip_details_content);
|
setContentView(R.layout.directions_trip_details_content);
|
||||||
getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION);
|
final View contentView = findViewById(android.R.id.content);
|
||||||
findViewById(android.R.id.content).setOnApplyWindowInsetsListener((v, insets) -> {
|
ViewCompat.setOnApplyWindowInsetsListener(contentView, (v, windowInsets) -> {
|
||||||
v.setPadding(insets.getSystemWindowInsetLeft(), 0, insets.getSystemWindowInsetRight(), 0);
|
final Insets insets = windowInsets.getInsets(WindowInsetsCompat.Type.systemBars());
|
||||||
return insets;
|
v.setPadding(insets.left, 0, insets.right, 0);
|
||||||
|
return windowInsets;
|
||||||
});
|
});
|
||||||
|
|
||||||
final MyActionBar actionBar = getMyActionBar();
|
final MyActionBar actionBar = getMyActionBar();
|
||||||
|
@ -282,9 +286,11 @@ public class TripDetailsActivity extends OeffiActivity implements LocationListen
|
||||||
((TextView) findViewById(R.id.directions_trip_details_footer))
|
((TextView) findViewById(R.id.directions_trip_details_footer))
|
||||||
.setText(Html.fromHtml(getString(R.string.directions_trip_details_realtime)));
|
.setText(Html.fromHtml(getString(R.string.directions_trip_details_realtime)));
|
||||||
|
|
||||||
findViewById(R.id.directions_trip_details_disclaimer_group).setOnApplyWindowInsetsListener((v, insets) -> {
|
final View disclaimerView = findViewById(R.id.directions_trip_details_disclaimer_group);
|
||||||
v.setPadding(0, 0, 0, insets.getSystemWindowInsetBottom());
|
ViewCompat.setOnApplyWindowInsetsListener(disclaimerView, (v, windowInsets) -> {
|
||||||
return insets;
|
final Insets insets = windowInsets.getInsets(WindowInsetsCompat.Type.systemBars());
|
||||||
|
v.setPadding(0, 0, 0, insets.bottom);
|
||||||
|
return windowInsets;
|
||||||
});
|
});
|
||||||
final TextView disclaimerSourceView = findViewById(R.id.directions_trip_details_disclaimer_source);
|
final TextView disclaimerSourceView = findViewById(R.id.directions_trip_details_disclaimer_source);
|
||||||
updateDisclaimerSource(disclaimerSourceView, network.name(), null);
|
updateDisclaimerSource(disclaimerSourceView, network.name(), null);
|
||||||
|
@ -313,9 +319,10 @@ public class TripDetailsActivity extends OeffiActivity implements LocationListen
|
||||||
});
|
});
|
||||||
final TextView mapDisclaimerView = findViewById(R.id.directions_trip_details_map_disclaimer);
|
final TextView mapDisclaimerView = findViewById(R.id.directions_trip_details_map_disclaimer);
|
||||||
mapDisclaimerView.setText(mapView.getTileProvider().getTileSource().getCopyrightNotice());
|
mapDisclaimerView.setText(mapView.getTileProvider().getTileSource().getCopyrightNotice());
|
||||||
mapDisclaimerView.setOnApplyWindowInsetsListener((v, insets) -> {
|
ViewCompat.setOnApplyWindowInsetsListener(mapDisclaimerView, (v, windowInsets) -> {
|
||||||
v.setPadding(0,0,0, insets.getSystemWindowInsetBottom());
|
final Insets insets = windowInsets.getInsets(WindowInsetsCompat.Type.systemBars());
|
||||||
return insets;
|
v.setPadding(0, 0, 0, insets.bottom);
|
||||||
|
return windowInsets;
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -31,6 +31,9 @@ import android.text.format.DateUtils;
|
||||||
import android.view.View;
|
import android.view.View;
|
||||||
import android.widget.AdapterView;
|
import android.widget.AdapterView;
|
||||||
import android.widget.TextView;
|
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.ComparisonChain;
|
||||||
import com.google.common.collect.Ordering;
|
import com.google.common.collect.Ordering;
|
||||||
import com.google.common.util.concurrent.Uninterruptibles;
|
import com.google.common.util.concurrent.Uninterruptibles;
|
||||||
|
@ -130,10 +133,11 @@ public class TripsOverviewActivity extends OeffiActivity {
|
||||||
final Uri historyUri = historyUriStr != null ? Uri.parse(historyUriStr) : null;
|
final Uri historyUri = historyUriStr != null ? Uri.parse(historyUriStr) : null;
|
||||||
|
|
||||||
setContentView(R.layout.directions_trip_overview_content);
|
setContentView(R.layout.directions_trip_overview_content);
|
||||||
getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION);
|
final View contentView = findViewById(android.R.id.content);
|
||||||
findViewById(android.R.id.content).setOnApplyWindowInsetsListener((v, insets) -> {
|
ViewCompat.setOnApplyWindowInsetsListener(contentView, (v, windowInsets) -> {
|
||||||
v.setPadding(insets.getSystemWindowInsetLeft(), 0, insets.getSystemWindowInsetRight(), 0);
|
final Insets insets = windowInsets.getInsets(WindowInsetsCompat.Type.systemBars());
|
||||||
return insets;
|
v.setPadding(insets.left, 0, insets.right, 0);
|
||||||
|
return windowInsets;
|
||||||
});
|
});
|
||||||
|
|
||||||
final MyActionBar actionBar = getMyActionBar();
|
final MyActionBar actionBar = getMyActionBar();
|
||||||
|
@ -164,9 +168,11 @@ public class TripsOverviewActivity extends OeffiActivity {
|
||||||
});
|
});
|
||||||
barView.setOnScrollListener(() -> handler.post(checkMoreRunnable));
|
barView.setOnScrollListener(() -> handler.post(checkMoreRunnable));
|
||||||
|
|
||||||
findViewById(R.id.directions_trip_overview_disclaimer_group).setOnApplyWindowInsetsListener((v, insets) -> {
|
final View disclaimerView = findViewById(R.id.directions_trip_overview_disclaimer_group);
|
||||||
v.setPadding(0, 0, 0, insets.getSystemWindowInsetBottom());
|
ViewCompat.setOnApplyWindowInsetsListener(disclaimerView, (v, windowInsets) -> {
|
||||||
return insets;
|
final Insets insets = windowInsets.getInsets(WindowInsetsCompat.Type.systemBars());
|
||||||
|
v.setPadding(0, 0, 0, insets.bottom);
|
||||||
|
return windowInsets;
|
||||||
});
|
});
|
||||||
|
|
||||||
processResult(result, dep);
|
processResult(result, dep);
|
||||||
|
|
|
@ -25,6 +25,7 @@ import android.content.SharedPreferences;
|
||||||
import android.content.pm.PackageManager;
|
import android.content.pm.PackageManager;
|
||||||
import android.content.res.Configuration;
|
import android.content.res.Configuration;
|
||||||
import android.content.res.Resources;
|
import android.content.res.Resources;
|
||||||
|
import android.graphics.Color;
|
||||||
import android.location.Address;
|
import android.location.Address;
|
||||||
import android.location.Criteria;
|
import android.location.Criteria;
|
||||||
import android.location.LocationManager;
|
import android.location.LocationManager;
|
||||||
|
@ -38,9 +39,13 @@ import android.view.View;
|
||||||
import android.widget.LinearLayout;
|
import android.widget.LinearLayout;
|
||||||
import android.widget.TextView;
|
import android.widget.TextView;
|
||||||
import androidx.activity.ComponentActivity;
|
import androidx.activity.ComponentActivity;
|
||||||
|
import androidx.activity.EdgeToEdge;
|
||||||
import androidx.activity.result.ActivityResultLauncher;
|
import androidx.activity.result.ActivityResultLauncher;
|
||||||
import androidx.activity.result.contract.ActivityResultContracts;
|
import androidx.activity.result.contract.ActivityResultContracts;
|
||||||
import androidx.core.content.ContextCompat;
|
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.LinearLayoutManager;
|
||||||
import androidx.recyclerview.widget.RecyclerView;
|
import androidx.recyclerview.widget.RecyclerView;
|
||||||
import de.schildbach.oeffi.AreaAware;
|
import de.schildbach.oeffi.AreaAware;
|
||||||
|
@ -109,6 +114,7 @@ public class NetworkPickerActivity extends ComponentActivity implements Location
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void onCreate(final Bundle savedInstanceState) {
|
protected void onCreate(final Bundle savedInstanceState) {
|
||||||
|
EdgeToEdge.enable(this, Constants.STATUS_BAR_STYLE);
|
||||||
super.onCreate(savedInstanceState);
|
super.onCreate(savedInstanceState);
|
||||||
|
|
||||||
prefs = PreferenceManager.getDefaultSharedPreferences(this);
|
prefs = PreferenceManager.getDefaultSharedPreferences(this);
|
||||||
|
@ -120,10 +126,11 @@ public class NetworkPickerActivity extends ComponentActivity implements Location
|
||||||
backgroundHandler = new Handler(backgroundThread.getLooper());
|
backgroundHandler = new Handler(backgroundThread.getLooper());
|
||||||
|
|
||||||
setContentView(R.layout.network_picker_content);
|
setContentView(R.layout.network_picker_content);
|
||||||
getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION);
|
final View contentView = findViewById(android.R.id.content);
|
||||||
findViewById(android.R.id.content).setOnApplyWindowInsetsListener((v, insets) -> {
|
ViewCompat.setOnApplyWindowInsetsListener(contentView, (v, windowInsets) -> {
|
||||||
v.setPadding(insets.getSystemWindowInsetLeft(), 0, insets.getSystemWindowInsetRight(), 0);
|
final Insets insets = windowInsets.getInsets(WindowInsetsCompat.Type.systemBars());
|
||||||
return insets;
|
v.setPadding(insets.left, 0, insets.right, 0);
|
||||||
|
return windowInsets;
|
||||||
});
|
});
|
||||||
|
|
||||||
actionBar = findViewById(R.id.action_bar);
|
actionBar = findViewById(R.id.action_bar);
|
||||||
|
@ -136,18 +143,19 @@ public class NetworkPickerActivity extends ComponentActivity implements Location
|
||||||
final String network = prefsGetNetwork();
|
final String network = prefsGetNetwork();
|
||||||
listAdapter = new NetworksAdapter(this, network, this, this);
|
listAdapter = new NetworksAdapter(this, network, this, this);
|
||||||
listView.setAdapter(listAdapter);
|
listView.setAdapter(listAdapter);
|
||||||
listView.setOnApplyWindowInsetsListener((v, insets) -> {
|
ViewCompat.setOnApplyWindowInsetsListener(listView, (v, windowInsets) -> {
|
||||||
v.setPadding(v.getPaddingLeft(), v.getPaddingTop(), v.getPaddingRight(),
|
final Insets insets = windowInsets.getInsets(WindowInsetsCompat.Type.systemBars());
|
||||||
insets.getSystemWindowInsetBottom());
|
v.setPadding(v.getPaddingLeft(), v.getPaddingTop(), v.getPaddingRight(), insets.bottom);
|
||||||
return insets;
|
return windowInsets;
|
||||||
});
|
});
|
||||||
|
|
||||||
mapView = findViewById(R.id.network_picker_map);
|
mapView = findViewById(R.id.network_picker_map);
|
||||||
final TextView mapDisclaimerView = findViewById(R.id.network_picker_map_disclaimer);
|
final TextView mapDisclaimerView = findViewById(R.id.network_picker_map_disclaimer);
|
||||||
mapDisclaimerView.setText(mapView.getTileProvider().getTileSource().getCopyrightNotice());
|
mapDisclaimerView.setText(mapView.getTileProvider().getTileSource().getCopyrightNotice());
|
||||||
mapDisclaimerView.setOnApplyWindowInsetsListener((v, insets) -> {
|
ViewCompat.setOnApplyWindowInsetsListener(mapDisclaimerView, (v, windowInsets) -> {
|
||||||
v.setPadding(0, 0, 0, insets.getSystemWindowInsetBottom());
|
final Insets insets = windowInsets.getInsets(WindowInsetsCompat.Type.systemBars());
|
||||||
return insets;
|
v.setPadding(0, 0, 0, insets.bottom);
|
||||||
|
return windowInsets;
|
||||||
});
|
});
|
||||||
|
|
||||||
if (network != null) {
|
if (network != null) {
|
||||||
|
|
|
@ -46,6 +46,7 @@ import de.schildbach.pte.NsProvider;
|
||||||
import de.schildbach.pte.NvbwProvider;
|
import de.schildbach.pte.NvbwProvider;
|
||||||
import de.schildbach.pte.NvvProvider;
|
import de.schildbach.pte.NvvProvider;
|
||||||
import de.schildbach.pte.OebbProvider;
|
import de.schildbach.pte.OebbProvider;
|
||||||
|
import de.schildbach.pte.PlProvider;
|
||||||
import de.schildbach.pte.RtProvider;
|
import de.schildbach.pte.RtProvider;
|
||||||
import de.schildbach.pte.RtaChicagoProvider;
|
import de.schildbach.pte.RtaChicagoProvider;
|
||||||
import de.schildbach.pte.SeProvider;
|
import de.schildbach.pte.SeProvider;
|
||||||
|
@ -77,7 +78,7 @@ public final class NetworkProviderFactory {
|
||||||
private static Map<NetworkId, NetworkProvider> providerCache = new HashMap<>();
|
private static Map<NetworkId, NetworkProvider> providerCache = new HashMap<>();
|
||||||
private static final BaseEncoding BASE64 = BaseEncoding.base64();
|
private static final BaseEncoding BASE64 = BaseEncoding.base64();
|
||||||
|
|
||||||
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 USER_AGENT = "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:134.0) Gecko/20100101 Firefox/134.0";
|
||||||
private static final byte[] VRS_CLIENT_CERTIFICATE = BASE64.decode("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");
|
private static final byte[] VRS_CLIENT_CERTIFICATE = BASE64.decode("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");
|
||||||
|
|
||||||
public static synchronized NetworkProvider provider(final NetworkId networkId) {
|
public static synchronized NetworkProvider provider(final NetworkId networkId) {
|
||||||
|
@ -86,7 +87,8 @@ public final class NetworkProviderFactory {
|
||||||
return cachedNetworkProvider;
|
return cachedNetworkProvider;
|
||||||
|
|
||||||
final AbstractNetworkProvider networkProvider = forId(networkId);
|
final AbstractNetworkProvider networkProvider = forId(networkId);
|
||||||
networkProvider.setUserAgent(USER_AGENT);
|
if (networkId != NetworkId.PL)
|
||||||
|
networkProvider.setUserAgent(USER_AGENT);
|
||||||
providerCache.put(networkId, networkProvider);
|
providerCache.put(networkId, networkProvider);
|
||||||
return networkProvider;
|
return networkProvider;
|
||||||
}
|
}
|
||||||
|
@ -95,8 +97,7 @@ public final class NetworkProviderFactory {
|
||||||
if (networkId.equals(NetworkId.RT))
|
if (networkId.equals(NetworkId.RT))
|
||||||
return new RtProvider();
|
return new RtProvider();
|
||||||
else if (networkId.equals(NetworkId.DB))
|
else if (networkId.equals(NetworkId.DB))
|
||||||
return new DbProvider("{\"type\":\"AID\",\"aid\":\"n91dB8Z77MLdoR0K\"}",
|
return new DbProvider();
|
||||||
"bdI8UVj40K5fvxwf".getBytes(Charsets.UTF_8));
|
|
||||||
else if (networkId.equals(NetworkId.BVG))
|
else if (networkId.equals(NetworkId.BVG))
|
||||||
return new BvgProvider("{\"aid\":\"1Rxs112shyHLatUX4fofnmdxK\",\"type\":\"AID\"}");
|
return new BvgProvider("{\"aid\":\"1Rxs112shyHLatUX4fofnmdxK\",\"type\":\"AID\"}");
|
||||||
else if (networkId.equals(NetworkId.VBB))
|
else if (networkId.equals(NetworkId.VBB))
|
||||||
|
@ -179,6 +180,8 @@ public final class NetworkProviderFactory {
|
||||||
return new TlemProvider();
|
return new TlemProvider();
|
||||||
else if (networkId.equals(NetworkId.MERSEY))
|
else if (networkId.equals(NetworkId.MERSEY))
|
||||||
return new MerseyProvider();
|
return new MerseyProvider();
|
||||||
|
else if (networkId.equals(NetworkId.PL))
|
||||||
|
return new PlProvider("{\"type\":\"AID\",\"aid\":\"DrxJYtYZQpEBCtcb\"}");
|
||||||
else if (networkId.equals(NetworkId.DUB))
|
else if (networkId.equals(NetworkId.DUB))
|
||||||
return new DubProvider();
|
return new DubProvider();
|
||||||
else if (networkId.equals(NetworkId.BART))
|
else if (networkId.equals(NetworkId.BART))
|
||||||
|
|
|
@ -23,6 +23,7 @@ import android.content.Intent;
|
||||||
import android.database.Cursor;
|
import android.database.Cursor;
|
||||||
import android.graphics.Bitmap;
|
import android.graphics.Bitmap;
|
||||||
import android.graphics.BitmapFactory;
|
import android.graphics.BitmapFactory;
|
||||||
|
import android.graphics.Color;
|
||||||
import android.net.Uri;
|
import android.net.Uri;
|
||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
import android.os.Handler;
|
import android.os.Handler;
|
||||||
|
@ -35,6 +36,8 @@ import android.widget.PopupMenu;
|
||||||
import android.widget.TextView;
|
import android.widget.TextView;
|
||||||
import android.widget.ViewAnimator;
|
import android.widget.ViewAnimator;
|
||||||
import androidx.activity.ComponentActivity;
|
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.FutureCallback;
|
||||||
import com.google.common.util.concurrent.Futures;
|
import com.google.common.util.concurrent.Futures;
|
||||||
import com.google.common.util.concurrent.ListenableFuture;
|
import com.google.common.util.concurrent.ListenableFuture;
|
||||||
|
@ -82,6 +85,9 @@ public class PlanActivity extends ComponentActivity {
|
||||||
public static final String INTENT_EXTRA_PLAN_ID = "plan_id"; // Used in launcher shortcuts
|
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()
|
private static final String INTENT_EXTRA_SELECTED_STATION_ID = PlanActivity.class.getName()
|
||||||
+ ".selected_station_id";
|
+ ".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) {
|
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);
|
final Intent intent = new Intent(Intent.ACTION_VIEW, null, context, PlanActivity.class);
|
||||||
|
@ -116,6 +122,7 @@ public class PlanActivity extends ComponentActivity {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void onCreate(final Bundle savedInstanceState) {
|
protected void onCreate(final Bundle savedInstanceState) {
|
||||||
|
EdgeToEdge.enable(this, Constants.STATUS_BAR_STYLE, NAVIGATION_BAR_STYLE);
|
||||||
super.onCreate(savedInstanceState);
|
super.onCreate(savedInstanceState);
|
||||||
this.application = (Application) getApplication();
|
this.application = (Application) getApplication();
|
||||||
|
|
||||||
|
@ -125,7 +132,6 @@ public class PlanActivity extends ComponentActivity {
|
||||||
backgroundHandler = new Handler(backgroundThread.getLooper());
|
backgroundHandler = new Handler(backgroundThread.getLooper());
|
||||||
|
|
||||||
setContentView(R.layout.plans_content);
|
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);
|
final Animation zoomControlsAnimation = AnimationUtils.loadAnimation(this, R.anim.zoom_controls);
|
||||||
zoomControlsAnimation.setFillAfter(true); // workaround: set through code because XML does not work
|
zoomControlsAnimation.setFillAfter(true); // workaround: set through code because XML does not work
|
||||||
|
|
|
@ -38,7 +38,10 @@ import androidx.activity.result.contract.ActivityResultContracts;
|
||||||
import androidx.core.content.ContextCompat;
|
import androidx.core.content.ContextCompat;
|
||||||
import androidx.core.content.pm.ShortcutInfoCompat;
|
import androidx.core.content.pm.ShortcutInfoCompat;
|
||||||
import androidx.core.content.pm.ShortcutManagerCompat;
|
import androidx.core.content.pm.ShortcutManagerCompat;
|
||||||
|
import androidx.core.graphics.Insets;
|
||||||
import androidx.core.graphics.drawable.IconCompat;
|
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.LinearLayoutManager;
|
||||||
import androidx.recyclerview.widget.RecyclerView;
|
import androidx.recyclerview.widget.RecyclerView;
|
||||||
import com.google.common.util.concurrent.FutureCallback;
|
import com.google.common.util.concurrent.FutureCallback;
|
||||||
|
@ -110,10 +113,11 @@ public class PlansPickerActivity extends OeffiMainActivity implements LocationHe
|
||||||
thumbCache = new Cache(cacheDir, THUMB_CACHE_SIZE);
|
thumbCache = new Cache(cacheDir, THUMB_CACHE_SIZE);
|
||||||
|
|
||||||
setContentView(R.layout.plans_picker_content);
|
setContentView(R.layout.plans_picker_content);
|
||||||
getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION);
|
final View contentView = findViewById(android.R.id.content);
|
||||||
findViewById(android.R.id.content).setOnApplyWindowInsetsListener((v, insets) -> {
|
ViewCompat.setOnApplyWindowInsetsListener(contentView, (v, windowInsets) -> {
|
||||||
v.setPadding(insets.getSystemWindowInsetLeft(), 0, insets.getSystemWindowInsetRight(), 0);
|
final Insets insets = windowInsets.getInsets(WindowInsetsCompat.Type.systemBars());
|
||||||
return insets;
|
v.setPadding(insets.left, 0, insets.right, 0);
|
||||||
|
return windowInsets;
|
||||||
});
|
});
|
||||||
|
|
||||||
actionBar = getMyActionBar();
|
actionBar = getMyActionBar();
|
||||||
|
@ -131,10 +135,10 @@ public class PlansPickerActivity extends OeffiMainActivity implements LocationHe
|
||||||
listView.addItemDecoration(new DividerItemDecoration(this, DividerItemDecoration.VERTICAL_LIST));
|
listView.addItemDecoration(new DividerItemDecoration(this, DividerItemDecoration.VERTICAL_LIST));
|
||||||
listAdapter = new PlansAdapter(this, cursor, thumbCache, this, this, application.okHttpClient());
|
listAdapter = new PlansAdapter(this, cursor, thumbCache, this, this, application.okHttpClient());
|
||||||
listView.setAdapter(listAdapter);
|
listView.setAdapter(listAdapter);
|
||||||
listView.setOnApplyWindowInsetsListener((v, insets) -> {
|
ViewCompat.setOnApplyWindowInsetsListener(listView, (v, windowInsets) -> {
|
||||||
v.setPadding(v.getPaddingLeft(), v.getPaddingTop(), v.getPaddingRight(),
|
final Insets insets = windowInsets.getInsets(WindowInsetsCompat.Type.systemBars());
|
||||||
insets.getSystemWindowInsetBottom());
|
v.setPadding(v.getPaddingLeft(), v.getPaddingTop(), v.getPaddingRight(), insets.bottom);
|
||||||
return insets;
|
return windowInsets;
|
||||||
});
|
});
|
||||||
|
|
||||||
connectivityWarningView = findViewById(R.id.plans_picker_connectivity_warning_box);
|
connectivityWarningView = findViewById(R.id.plans_picker_connectivity_warning_box);
|
||||||
|
|
|
@ -19,7 +19,12 @@ package de.schildbach.oeffi.preference;
|
||||||
|
|
||||||
import android.app.Activity;
|
import android.app.Activity;
|
||||||
import android.content.Intent;
|
import android.content.Intent;
|
||||||
|
import android.os.Bundle;
|
||||||
import android.view.MenuItem;
|
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.R;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
@ -35,6 +40,17 @@ public class PreferenceActivity extends android.preference.PreferenceActivity {
|
||||||
activity.startActivity(intent);
|
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
|
@Override
|
||||||
public void onBuildHeaders(final List<Header> target) {
|
public void onBuildHeaders(final List<Header> target) {
|
||||||
loadHeadersFromResource(R.xml.preference_headers, target);
|
loadHeadersFromResource(R.xml.preference_headers, target);
|
||||||
|
|
|
@ -25,6 +25,9 @@ import android.os.Bundle;
|
||||||
import android.view.View;
|
import android.view.View;
|
||||||
import android.widget.ViewAnimator;
|
import android.widget.ViewAnimator;
|
||||||
import androidx.activity.result.contract.ActivityResultContract;
|
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.LinearLayoutManager;
|
||||||
import androidx.recyclerview.widget.RecyclerView;
|
import androidx.recyclerview.widget.RecyclerView;
|
||||||
import de.schildbach.oeffi.MyActionBar;
|
import de.schildbach.oeffi.MyActionBar;
|
||||||
|
@ -84,10 +87,11 @@ public class FavoriteStationsActivity extends OeffiActivity
|
||||||
network = (NetworkId) intent.getSerializableExtra(INTENT_EXTRA_NETWORK);
|
network = (NetworkId) intent.getSerializableExtra(INTENT_EXTRA_NETWORK);
|
||||||
|
|
||||||
setContentView(R.layout.favorites_content);
|
setContentView(R.layout.favorites_content);
|
||||||
getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION);
|
final View contentView = findViewById(android.R.id.content);
|
||||||
findViewById(android.R.id.content).setOnApplyWindowInsetsListener((v, insets) -> {
|
ViewCompat.setOnApplyWindowInsetsListener(contentView, (v, windowInsets) -> {
|
||||||
v.setPadding(insets.getSystemWindowInsetLeft(), 0, insets.getSystemWindowInsetRight(), 0);
|
final Insets insets = windowInsets.getInsets(WindowInsetsCompat.Type.systemBars());
|
||||||
return insets;
|
v.setPadding(insets.left, 0, insets.right, 0);
|
||||||
|
return windowInsets;
|
||||||
});
|
});
|
||||||
|
|
||||||
final MyActionBar actionBar = getMyActionBar();
|
final MyActionBar actionBar = getMyActionBar();
|
||||||
|
@ -102,10 +106,10 @@ public class FavoriteStationsActivity extends OeffiActivity
|
||||||
listView.addItemDecoration(new DividerItemDecoration(this, DividerItemDecoration.VERTICAL_LIST));
|
listView.addItemDecoration(new DividerItemDecoration(this, DividerItemDecoration.VERTICAL_LIST));
|
||||||
adapter = new FavoriteStationsAdapter(this, network, this, network == null ? this : null);
|
adapter = new FavoriteStationsAdapter(this, network, this, network == null ? this : null);
|
||||||
listView.setAdapter(adapter);
|
listView.setAdapter(adapter);
|
||||||
listView.setOnApplyWindowInsetsListener((v, insets) -> {
|
ViewCompat.setOnApplyWindowInsetsListener(listView, (v, windowInsets) -> {
|
||||||
v.setPadding(v.getPaddingLeft(), v.getPaddingTop(), v.getPaddingRight(),
|
final Insets insets = windowInsets.getInsets(WindowInsetsCompat.Type.systemBars());
|
||||||
insets.getSystemWindowInsetBottom());
|
v.setPadding(v.getPaddingLeft(), v.getPaddingTop(), v.getPaddingRight(), insets.bottom);
|
||||||
return insets;
|
return windowInsets;
|
||||||
});
|
});
|
||||||
|
|
||||||
updateGUI();
|
updateGUI();
|
||||||
|
|
|
@ -37,6 +37,9 @@ import android.view.ViewGroup;
|
||||||
import android.widget.LinearLayout;
|
import android.widget.LinearLayout;
|
||||||
import android.widget.TextView;
|
import android.widget.TextView;
|
||||||
import android.widget.ViewAnimator;
|
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.LinearLayoutManager;
|
||||||
import androidx.recyclerview.widget.RecyclerView;
|
import androidx.recyclerview.widget.RecyclerView;
|
||||||
import com.google.common.base.Joiner;
|
import com.google.common.base.Joiner;
|
||||||
|
@ -137,10 +140,11 @@ public class StationDetailsActivity extends OeffiActivity implements StationsAwa
|
||||||
backgroundHandler = new Handler(backgroundThread.getLooper());
|
backgroundHandler = new Handler(backgroundThread.getLooper());
|
||||||
|
|
||||||
setContentView(R.layout.stations_station_details_content);
|
setContentView(R.layout.stations_station_details_content);
|
||||||
getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION);
|
final View contentView = findViewById(android.R.id.content);
|
||||||
findViewById(android.R.id.content).setOnApplyWindowInsetsListener((v, insets) -> {
|
ViewCompat.setOnApplyWindowInsetsListener(contentView, (v, windowInsets) -> {
|
||||||
v.setPadding(insets.getSystemWindowInsetLeft(), 0, insets.getSystemWindowInsetRight(), 0);
|
final Insets insets = windowInsets.getInsets(WindowInsetsCompat.Type.systemBars());
|
||||||
return insets;
|
v.setPadding(insets.left, 0, insets.right, 0);
|
||||||
|
return windowInsets;
|
||||||
});
|
});
|
||||||
|
|
||||||
actionBar = getMyActionBar();
|
actionBar = getMyActionBar();
|
||||||
|
@ -174,19 +178,21 @@ public class StationDetailsActivity extends OeffiActivity implements StationsAwa
|
||||||
listView.addItemDecoration(new DividerItemDecoration(this, DividerItemDecoration.VERTICAL_LIST));
|
listView.addItemDecoration(new DividerItemDecoration(this, DividerItemDecoration.VERTICAL_LIST));
|
||||||
listAdapter = new DeparturesAdapter(this);
|
listAdapter = new DeparturesAdapter(this);
|
||||||
listView.setAdapter(listAdapter);
|
listView.setAdapter(listAdapter);
|
||||||
listView.setOnApplyWindowInsetsListener((v, insets) -> {
|
ViewCompat.setOnApplyWindowInsetsListener(listView, (v, windowInsets) -> {
|
||||||
|
final Insets insets = windowInsets.getInsets(WindowInsetsCompat.Type.systemBars());
|
||||||
v.setPadding(v.getPaddingLeft(), v.getPaddingTop(), v.getPaddingRight(),
|
v.setPadding(v.getPaddingLeft(), v.getPaddingTop(), v.getPaddingRight(),
|
||||||
insets.getSystemWindowInsetBottom() + (int)(48 * getResources().getDisplayMetrics().density));
|
insets.bottom + (int) (48 * getResources().getDisplayMetrics().density));
|
||||||
return insets;
|
return windowInsets;
|
||||||
});
|
});
|
||||||
|
|
||||||
mapView = findViewById(R.id.stations_station_details_map);
|
mapView = findViewById(R.id.stations_station_details_map);
|
||||||
mapView.setStationsAware(this);
|
mapView.setStationsAware(this);
|
||||||
final TextView mapDisclaimerView = findViewById(R.id.stations_station_details_map_disclaimer);
|
final TextView mapDisclaimerView = findViewById(R.id.stations_station_details_map_disclaimer);
|
||||||
mapDisclaimerView.setText(mapView.getTileProvider().getTileSource().getCopyrightNotice());
|
mapDisclaimerView.setText(mapView.getTileProvider().getTileSource().getCopyrightNotice());
|
||||||
mapDisclaimerView.setOnApplyWindowInsetsListener((v, insets) -> {
|
ViewCompat.setOnApplyWindowInsetsListener(mapDisclaimerView, (v, windowInsets) -> {
|
||||||
v.setPadding(0,0,0, insets.getSystemWindowInsetBottom());
|
final Insets insets = windowInsets.getInsets(WindowInsetsCompat.Type.systemBars());
|
||||||
return insets;
|
v.setPadding(0, 0, 0, insets.bottom);
|
||||||
|
return windowInsets;
|
||||||
});
|
});
|
||||||
|
|
||||||
resultStatusView = findViewById(R.id.stations_station_details_result_status);
|
resultStatusView = findViewById(R.id.stations_station_details_result_status);
|
||||||
|
@ -202,9 +208,11 @@ public class StationDetailsActivity extends OeffiActivity implements StationsAwa
|
||||||
favoriteButton
|
favoriteButton
|
||||||
.setChecked(selectedFavState != null && selectedFavState == FavoriteStationsProvider.TYPE_FAVORITE);
|
.setChecked(selectedFavState != null && selectedFavState == FavoriteStationsProvider.TYPE_FAVORITE);
|
||||||
|
|
||||||
findViewById(R.id.stations_station_details_disclaimer_group).setOnApplyWindowInsetsListener((v, insets) -> {
|
final View disclaimerView = findViewById(R.id.stations_station_details_disclaimer_group);
|
||||||
v.setPadding(0, 0, 0, insets.getSystemWindowInsetBottom());
|
ViewCompat.setOnApplyWindowInsetsListener(disclaimerView, (v, windowInsets) -> {
|
||||||
return insets;
|
final Insets insets = windowInsets.getInsets(WindowInsetsCompat.Type.systemBars());
|
||||||
|
v.setPadding(0, 0, 0, insets.bottom);
|
||||||
|
return windowInsets;
|
||||||
});
|
});
|
||||||
disclaimerSourceView = findViewById(R.id.stations_station_details_disclaimer_source);
|
disclaimerSourceView = findViewById(R.id.stations_station_details_disclaimer_source);
|
||||||
updateDisclaimerSource(disclaimerSourceView, selectedNetwork.name(), null);
|
updateDisclaimerSource(disclaimerSourceView, selectedNetwork.name(), null);
|
||||||
|
@ -425,9 +433,8 @@ public class StationDetailsActivity extends OeffiActivity implements StationsAwa
|
||||||
@Override
|
@Override
|
||||||
public int getItemCount() {
|
public int getItemCount() {
|
||||||
final List<Departure> selectedDepartures = StationDetailsActivity.this.selectedDepartures;
|
final List<Departure> selectedDepartures = StationDetailsActivity.this.selectedDepartures;
|
||||||
if (selectedDepartures == null || selectedDepartures.isEmpty())
|
final int numDepartures = selectedDepartures != null ? selectedDepartures.size() : 0;
|
||||||
return 1;
|
return numDepartures + 1; // account for header
|
||||||
return selectedDepartures.size();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|
|
@ -56,6 +56,9 @@ import android.widget.ViewAnimator;
|
||||||
import androidx.activity.result.ActivityResultLauncher;
|
import androidx.activity.result.ActivityResultLauncher;
|
||||||
import androidx.activity.result.contract.ActivityResultContracts;
|
import androidx.activity.result.contract.ActivityResultContracts;
|
||||||
import androidx.core.content.ContextCompat;
|
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.ItemTouchHelper;
|
||||||
import androidx.recyclerview.widget.LinearLayoutManager;
|
import androidx.recyclerview.widget.LinearLayoutManager;
|
||||||
import androidx.recyclerview.widget.RecyclerView;
|
import androidx.recyclerview.widget.RecyclerView;
|
||||||
|
@ -184,10 +187,11 @@ public class StationsActivity extends OeffiMainActivity implements StationsAware
|
||||||
res = getResources();
|
res = getResources();
|
||||||
|
|
||||||
setContentView(R.layout.stations_content);
|
setContentView(R.layout.stations_content);
|
||||||
getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION);
|
final View contentView = findViewById(android.R.id.content);
|
||||||
findViewById(android.R.id.content).setOnApplyWindowInsetsListener((v, insets) -> {
|
ViewCompat.setOnApplyWindowInsetsListener(contentView, (v, windowInsets) -> {
|
||||||
v.setPadding(insets.getSystemWindowInsetLeft(), 0, insets.getSystemWindowInsetRight(), 0);
|
final Insets insets = windowInsets.getInsets(WindowInsetsCompat.Type.systemBars());
|
||||||
return insets;
|
v.setPadding(insets.left, 0, insets.right, 0);
|
||||||
|
return windowInsets;
|
||||||
});
|
});
|
||||||
|
|
||||||
actionBar = getMyActionBar();
|
actionBar = getMyActionBar();
|
||||||
|
@ -266,22 +270,26 @@ public class StationsActivity extends OeffiMainActivity implements StationsAware
|
||||||
mapView.setLocationAware(this);
|
mapView.setLocationAware(this);
|
||||||
final TextView mapDisclaimerView = findViewById(R.id.stations_map_disclaimer);
|
final TextView mapDisclaimerView = findViewById(R.id.stations_map_disclaimer);
|
||||||
mapDisclaimerView.setText(mapView.getTileProvider().getTileSource().getCopyrightNotice());
|
mapDisclaimerView.setText(mapView.getTileProvider().getTileSource().getCopyrightNotice());
|
||||||
mapDisclaimerView.setOnApplyWindowInsetsListener((v, insets) -> {
|
ViewCompat.setOnApplyWindowInsetsListener(mapDisclaimerView, (v, windowInsets) -> {
|
||||||
v.setPadding(0, 0, 0, insets.getSystemWindowInsetBottom());
|
final Insets insets = windowInsets.getInsets(WindowInsetsCompat.Type.systemBars());
|
||||||
return insets;
|
v.setPadding(0, 0, 0, insets.bottom);
|
||||||
|
return windowInsets;
|
||||||
});
|
});
|
||||||
|
|
||||||
final ZoomControls zoom = findViewById(R.id.stations_map_zoom);
|
final ZoomControls zoom = findViewById(R.id.stations_map_zoom);
|
||||||
zoom.setOnApplyWindowInsetsListener((v, insets) -> {
|
ViewCompat.setOnApplyWindowInsetsListener(zoom, (v, windowInsets) -> {
|
||||||
v.setPadding(0, 0, 0, insets.getSystemWindowInsetBottom());
|
final Insets insets = windowInsets.getInsets(WindowInsetsCompat.Type.systemBars());
|
||||||
return insets;
|
v.setPadding(0, 0, 0, insets.bottom);
|
||||||
|
return windowInsets;
|
||||||
});
|
});
|
||||||
mapView.setZoomControls(zoom);
|
mapView.setZoomControls(zoom);
|
||||||
|
|
||||||
connectivityWarningView = findViewById(R.id.stations_connectivity_warning_box);
|
connectivityWarningView = findViewById(R.id.stations_connectivity_warning_box);
|
||||||
findViewById(R.id.stations_disclaimer_group).setOnApplyWindowInsetsListener((v, insets) -> {
|
final View disclaimerView = findViewById(R.id.stations_disclaimer_group);
|
||||||
v.setPadding(0, 0, 0, insets.getSystemWindowInsetBottom());
|
ViewCompat.setOnApplyWindowInsetsListener(disclaimerView, (v, windowInsets) -> {
|
||||||
return insets;
|
final Insets insets = windowInsets.getInsets(WindowInsetsCompat.Type.systemBars());
|
||||||
|
v.setPadding(0, 0, 0, insets.bottom);
|
||||||
|
return windowInsets;
|
||||||
});
|
});
|
||||||
disclaimerSourceView = findViewById(R.id.stations_disclaimer_source);
|
disclaimerSourceView = findViewById(R.id.stations_disclaimer_source);
|
||||||
|
|
||||||
|
@ -415,10 +423,11 @@ public class StationsActivity extends OeffiMainActivity implements StationsAware
|
||||||
stationList.addItemDecoration(new DividerItemDecoration(this, DividerItemDecoration.VERTICAL_LIST));
|
stationList.addItemDecoration(new DividerItemDecoration(this, DividerItemDecoration.VERTICAL_LIST));
|
||||||
stationListAdapter = new StationsAdapter(this, maxDeparturesPerStation, products, this, this);
|
stationListAdapter = new StationsAdapter(this, maxDeparturesPerStation, products, this, this);
|
||||||
stationList.setAdapter(stationListAdapter);
|
stationList.setAdapter(stationListAdapter);
|
||||||
stationList.setOnApplyWindowInsetsListener((v, insets) -> {
|
ViewCompat.setOnApplyWindowInsetsListener(stationList, (v, windowInsets) -> {
|
||||||
|
final Insets insets = windowInsets.getInsets(WindowInsetsCompat.Type.systemBars());
|
||||||
v.setPadding(v.getPaddingLeft(), v.getPaddingTop(), v.getPaddingRight(),
|
v.setPadding(v.getPaddingLeft(), v.getPaddingTop(), v.getPaddingRight(),
|
||||||
insets.getSystemWindowInsetBottom() + (int)(48 * res.getDisplayMetrics().density));
|
insets.bottom + (int) (48 * res.getDisplayMetrics().density));
|
||||||
return insets;
|
return windowInsets;
|
||||||
});
|
});
|
||||||
stationList.addOnScrollListener(new RecyclerView.OnScrollListener() {
|
stationList.addOnScrollListener(new RecyclerView.OnScrollListener() {
|
||||||
@Override
|
@Override
|
||||||
|
|
|
@ -1 +1 @@
|
||||||
Subproject commit 0a98f7c3cffcac7bb396ba2bcc4a2439a4f2b61e
|
Subproject commit c7f77ac4c89b9dbb31625998b9de1dd3d617d68a
|
Loading…
Add table
Add a link
Reference in a new issue