mirror of
https://gitlab.com/oeffi/oeffi.git
synced 2025-07-08 09:18:47 +00:00
Require Android 5.0 (Lollipop).
This commit is contained in:
parent
d988141528
commit
459db742eb
15 changed files with 33 additions and 278 deletions
|
@ -18,13 +18,12 @@
|
||||||
|
|
||||||
<manifest
|
<manifest
|
||||||
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"
|
|
||||||
package="de.schildbach.oeffi"
|
package="de.schildbach.oeffi"
|
||||||
android:versionCode="692"
|
android:versionCode="692"
|
||||||
android:versionName="11.4.5">
|
android:versionName="11.4.5">
|
||||||
|
|
||||||
<uses-sdk
|
<uses-sdk
|
||||||
android:minSdkVersion="19"
|
android:minSdkVersion="21"
|
||||||
android:targetSdkVersion="29" />
|
android:targetSdkVersion="29" />
|
||||||
|
|
||||||
<uses-permission android:name="android.permission.INTERNET" />
|
<uses-permission android:name="android.permission.INTERNET" />
|
||||||
|
@ -64,8 +63,7 @@
|
||||||
android:icon="@mipmap/ic_oeffi_stations_color_48dp"
|
android:icon="@mipmap/ic_oeffi_stations_color_48dp"
|
||||||
android:label="@string/app_name"
|
android:label="@string/app_name"
|
||||||
android:networkSecurityConfig="@xml/network_security_config"
|
android:networkSecurityConfig="@xml/network_security_config"
|
||||||
android:theme="@style/My.Theme.Light"
|
android:theme="@style/My.Theme.Light">
|
||||||
tools:targetApi="24">
|
|
||||||
|
|
||||||
<provider
|
<provider
|
||||||
android:name="androidx.core.content.FileProvider"
|
android:name="androidx.core.content.FileProvider"
|
||||||
|
|
|
@ -1,13 +1,11 @@
|
||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<de.schildbach.oeffi.MyActionBar
|
<de.schildbach.oeffi.MyActionBar
|
||||||
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"
|
|
||||||
android:id="@+id/action_bar"
|
android:id="@+id/action_bar"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:animateLayoutChanges="true"
|
android:animateLayoutChanges="true"
|
||||||
android:elevation="@dimen/elevation_action_bar"
|
android:elevation="@dimen/elevation_action_bar">
|
||||||
tools:targetApi="21">
|
|
||||||
|
|
||||||
<ImageButton
|
<ImageButton
|
||||||
android:id="@+id/action_bar_menu_button"
|
android:id="@+id/action_bar_menu_button"
|
||||||
|
|
|
@ -1,7 +1,6 @@
|
||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<LinearLayout
|
<LinearLayout
|
||||||
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"
|
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="match_parent"
|
android:layout_height="match_parent"
|
||||||
android:baselineAligned="false"
|
android:baselineAligned="false"
|
||||||
|
@ -11,8 +10,7 @@
|
||||||
android:id="@+id/navigation_drawer_layout"
|
android:id="@+id/navigation_drawer_layout"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="match_parent"
|
android:layout_height="match_parent"
|
||||||
android:elevation="@dimen/elevation_content"
|
android:elevation="@dimen/elevation_content">
|
||||||
tools:targetApi="21">
|
|
||||||
|
|
||||||
<LinearLayout
|
<LinearLayout
|
||||||
android:id="@+id/directions_content_layout"
|
android:id="@+id/directions_content_layout"
|
||||||
|
@ -90,8 +88,7 @@
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:layout_gravity="top"
|
android:layout_gravity="top"
|
||||||
android:background="@android:color/white"
|
android:background="@android:color/white"
|
||||||
android:elevation="@dimen/elevation_panel"
|
android:elevation="@dimen/elevation_panel">
|
||||||
tools:targetApi="21">
|
|
||||||
|
|
||||||
<include layout="@layout/directions_form_include" />
|
<include layout="@layout/directions_form_include" />
|
||||||
</ScrollView>
|
</ScrollView>
|
||||||
|
@ -105,8 +102,7 @@
|
||||||
android:id="@+id/directions_map_fragment"
|
android:id="@+id/directions_map_fragment"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="match_parent"
|
android:layout_height="match_parent"
|
||||||
android:elevation="@dimen/elevation_map"
|
android:elevation="@dimen/elevation_map">
|
||||||
tools:targetApi="21">
|
|
||||||
|
|
||||||
<de.schildbach.oeffi.OeffiMapView
|
<de.schildbach.oeffi.OeffiMapView
|
||||||
android:id="@+id/directions_map"
|
android:id="@+id/directions_map"
|
||||||
|
|
|
@ -1,7 +1,6 @@
|
||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<LinearLayout
|
<LinearLayout
|
||||||
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"
|
|
||||||
android:id="@+id/stations_layout"
|
android:id="@+id/stations_layout"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="match_parent"
|
android:layout_height="match_parent"
|
||||||
|
@ -13,8 +12,7 @@
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="match_parent"
|
android:layout_height="match_parent"
|
||||||
android:orientation="vertical"
|
android:orientation="vertical"
|
||||||
android:elevation="@dimen/elevation_content"
|
android:elevation="@dimen/elevation_content">
|
||||||
tools:targetApi="21">
|
|
||||||
|
|
||||||
<include layout="@layout/action_bar" />
|
<include layout="@layout/action_bar" />
|
||||||
|
|
||||||
|
@ -122,8 +120,7 @@
|
||||||
android:id="@+id/directions_trip_details_map_frame"
|
android:id="@+id/directions_trip_details_map_frame"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="match_parent"
|
android:layout_height="match_parent"
|
||||||
android:elevation="@dimen/elevation_map"
|
android:elevation="@dimen/elevation_map">
|
||||||
tools:targetApi="21">
|
|
||||||
|
|
||||||
<de.schildbach.oeffi.OeffiMapView
|
<de.schildbach.oeffi.OeffiMapView
|
||||||
android:id="@+id/directions_trip_details_map"
|
android:id="@+id/directions_trip_details_map"
|
||||||
|
|
|
@ -1,14 +1,12 @@
|
||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<LinearLayout
|
<LinearLayout
|
||||||
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"
|
|
||||||
android:id="@+id/stations_layout"
|
android:id="@+id/stations_layout"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="match_parent"
|
android:layout_height="match_parent"
|
||||||
android:baselineAligned="false"
|
android:baselineAligned="false"
|
||||||
android:elevation="@dimen/elevation_content"
|
android:elevation="@dimen/elevation_content"
|
||||||
android:orientation="horizontal"
|
android:orientation="horizontal">
|
||||||
tools:targetApi="21">
|
|
||||||
|
|
||||||
<LinearLayout
|
<LinearLayout
|
||||||
android:id="@+id/network_picker_list_frame"
|
android:id="@+id/network_picker_list_frame"
|
||||||
|
|
|
@ -1,7 +1,6 @@
|
||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<LinearLayout
|
<LinearLayout
|
||||||
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"
|
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="match_parent"
|
android:layout_height="match_parent"
|
||||||
android:baselineAligned="false"
|
android:baselineAligned="false"
|
||||||
|
@ -11,8 +10,7 @@
|
||||||
android:id="@+id/navigation_drawer_layout"
|
android:id="@+id/navigation_drawer_layout"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="match_parent"
|
android:layout_height="match_parent"
|
||||||
android:elevation="@dimen/elevation_content"
|
android:elevation="@dimen/elevation_content">
|
||||||
tools:targetApi="21">
|
|
||||||
|
|
||||||
<LinearLayout
|
<LinearLayout
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
|
@ -404,8 +402,7 @@
|
||||||
android:id="@+id/stations_map_fragment"
|
android:id="@+id/stations_map_fragment"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="match_parent"
|
android:layout_height="match_parent"
|
||||||
android:elevation="@dimen/elevation_map"
|
android:elevation="@dimen/elevation_map">
|
||||||
tools:targetApi="21">
|
|
||||||
|
|
||||||
<de.schildbach.oeffi.OeffiMapView
|
<de.schildbach.oeffi.OeffiMapView
|
||||||
android:id="@+id/stations_map"
|
android:id="@+id/stations_map"
|
||||||
|
|
|
@ -1,7 +1,6 @@
|
||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<LinearLayout
|
<LinearLayout
|
||||||
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"
|
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="match_parent"
|
android:layout_height="match_parent"
|
||||||
android:baselineAligned="false"
|
android:baselineAligned="false"
|
||||||
|
@ -12,8 +11,7 @@
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="match_parent"
|
android:layout_height="match_parent"
|
||||||
android:elevation="@dimen/elevation_content"
|
android:elevation="@dimen/elevation_content"
|
||||||
android:orientation="vertical"
|
android:orientation="vertical">
|
||||||
tools:targetApi="21">
|
|
||||||
|
|
||||||
<include layout="@layout/action_bar" />
|
<include layout="@layout/action_bar" />
|
||||||
|
|
||||||
|
@ -80,8 +78,7 @@
|
||||||
android:id="@+id/stations_station_details_map_fragment"
|
android:id="@+id/stations_station_details_map_fragment"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="match_parent"
|
android:layout_height="match_parent"
|
||||||
android:elevation="@dimen/elevation_map"
|
android:elevation="@dimen/elevation_map">
|
||||||
tools:targetApi="21">
|
|
||||||
|
|
||||||
<de.schildbach.oeffi.OeffiMapView
|
<de.schildbach.oeffi.OeffiMapView
|
||||||
android:id="@+id/stations_station_details_map"
|
android:id="@+id/stations_station_details_map"
|
||||||
|
|
|
@ -1,74 +0,0 @@
|
||||||
<?xml version="1.0" encoding="utf-8"?>
|
|
||||||
<resources
|
|
||||||
xmlns:android="http://schemas.android.com/apk/res/android"
|
|
||||||
xmlns:tools="http://schemas.android.com/tools">
|
|
||||||
|
|
||||||
<style name="My.Theme.Light" parent="@android:style/Theme.Material.Light.NoActionBar">
|
|
||||||
<item name="android:windowBackground">@android:color/white</item>
|
|
||||||
<item name="android:windowTranslucentStatus">true</item>
|
|
||||||
<item name="android:textViewStyle">@style/My.Widget.TextView</item>
|
|
||||||
<item name="android:autoCompleteTextViewStyle">@style/My.Widget.AutoCompleteTextView</item>
|
|
||||||
<item name="android:dropDownListViewStyle">@style/My.Widget.ListView.DropDown</item>
|
|
||||||
<item name="android:buttonStyle">@style/My.Widget.Button</item>
|
|
||||||
<item name="android:imageButtonStyle">@style/My.Widget.ImageButton</item>
|
|
||||||
<item name="android:checkboxStyle">@style/My.Widget.CompoundButton.CheckBox</item>
|
|
||||||
<item name="android:popupMenuStyle">@style/My.Widget.PopupMenu</item>
|
|
||||||
</style>
|
|
||||||
|
|
||||||
<style name="My.Theme.Dark" parent="@android:style/Theme.Material.NoActionBar">
|
|
||||||
<item name="android:windowBackground">@android:color/black</item>
|
|
||||||
<item name="android:windowTranslucentStatus">true</item>
|
|
||||||
<item name="android:imageButtonStyle">@style/My.Widget.ImageButton</item>
|
|
||||||
</style>
|
|
||||||
|
|
||||||
<style name="My.Theme.Fullscreen" parent="@android:style/Theme.Material.Light.NoActionBar.Fullscreen">
|
|
||||||
<item name="android:windowBackground">@android:color/black</item>
|
|
||||||
<item name="android:textViewStyle">@style/My.Widget.TextView</item>
|
|
||||||
<item name="android:windowLayoutInDisplayCutoutMode" tools:targetApi="27">shortEdges</item>
|
|
||||||
</style>
|
|
||||||
|
|
||||||
<style name="My.Theme.Preference" parent="@android:style/Theme.Material.Light.DarkActionBar">
|
|
||||||
<item name="android:actionBarStyle">@style/My.Widget.ActionBar</item>
|
|
||||||
</style>
|
|
||||||
|
|
||||||
<style name="My.Widget.AutoCompleteTextView" parent="@android:style/Widget.Material.Light.AutoCompleteTextView">
|
|
||||||
<item name="android:textColor">@color/fg_significant</item>
|
|
||||||
<item name="android:background">@null</item>
|
|
||||||
<item name="android:popupBackground">@android:color/white</item>
|
|
||||||
<item name="android:dropDownVerticalOffset">0px</item>
|
|
||||||
</style>
|
|
||||||
|
|
||||||
<style name="My.Widget.Button" parent="@android:style/Widget.Material.Light.Button">
|
|
||||||
<item name="android:background">?android:attr/selectableItemBackground</item>
|
|
||||||
<item name="android:textColor">@color/fg_significant</item>
|
|
||||||
<item name="android:textSize">@dimen/font_size_normal</item>
|
|
||||||
<item name="android:textAllCaps">false</item>
|
|
||||||
</style>
|
|
||||||
|
|
||||||
<style name="My.Widget.Button.Border" parent="@android:style/Widget.Material.Light.Button">
|
|
||||||
<item name="android:textColor">@color/fg_significant</item>
|
|
||||||
<item name="android:textSize">@dimen/font_size_normal</item>
|
|
||||||
</style>
|
|
||||||
|
|
||||||
<style name="My.Widget.CompoundButton.CheckBox" parent="@android:style/Widget.Material.CompoundButton.CheckBox">
|
|
||||||
<item name="android:textSize">@dimen/font_size_normal</item>
|
|
||||||
</style>
|
|
||||||
|
|
||||||
<style name="My.Widget.ListView.DropDown" parent="@android:style/Widget.Material.ListView.DropDown">
|
|
||||||
<item name="android:divider">@null</item>
|
|
||||||
</style>
|
|
||||||
|
|
||||||
<style name="My.Widget.PopupMenu" parent="@android:style/Widget.Material.Light.PopupMenu" />
|
|
||||||
|
|
||||||
<style name="My.Widget.ActionBar" parent="@android:style/Widget.Material.ActionBar.Solid">
|
|
||||||
<item name="android:background">@color/bg_action_bar</item>
|
|
||||||
<item name="android:titleTextStyle">@style/My.TextAppearance.Widget.ActionBar.Title</item>
|
|
||||||
<item name="android:displayOptions">homeAsUp|showTitle</item>
|
|
||||||
</style>
|
|
||||||
|
|
||||||
<style name="My.TextAppearance.Widget.ActionBar.Title" parent="@android:style/TextAppearance.Material.Widget.ActionBar.Title">
|
|
||||||
<item name="android:textColor">@android:color/white</item>
|
|
||||||
<item name="android:textStyle">bold</item>
|
|
||||||
</style>
|
|
||||||
|
|
||||||
</resources>
|
|
|
@ -1,8 +1,9 @@
|
||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<resources
|
<resources
|
||||||
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">
|
||||||
|
|
||||||
<style name="My.Theme.Light" parent="@android:style/Theme.Holo.Light.NoActionBar">
|
<style name="My.Theme.Light" parent="@android:style/Theme.Material.Light.NoActionBar">
|
||||||
<item name="android:windowBackground">@android:color/white</item>
|
<item name="android:windowBackground">@android:color/white</item>
|
||||||
<item name="android:windowTranslucentStatus">true</item>
|
<item name="android:windowTranslucentStatus">true</item>
|
||||||
<item name="android:textViewStyle">@style/My.Widget.TextView</item>
|
<item name="android:textViewStyle">@style/My.Widget.TextView</item>
|
||||||
|
@ -14,18 +15,19 @@
|
||||||
<item name="android:popupMenuStyle">@style/My.Widget.PopupMenu</item>
|
<item name="android:popupMenuStyle">@style/My.Widget.PopupMenu</item>
|
||||||
</style>
|
</style>
|
||||||
|
|
||||||
<style name="My.Theme.Dark" parent="@android:style/Theme.Holo.NoActionBar">
|
<style name="My.Theme.Dark" parent="@android:style/Theme.Material.NoActionBar">
|
||||||
<item name="android:windowBackground">@android:color/black</item>
|
<item name="android:windowBackground">@android:color/black</item>
|
||||||
<item name="android:windowTranslucentStatus">true</item>
|
<item name="android:windowTranslucentStatus">true</item>
|
||||||
<item name="android:imageButtonStyle">@style/My.Widget.ImageButton</item>
|
<item name="android:imageButtonStyle">@style/My.Widget.ImageButton</item>
|
||||||
</style>
|
</style>
|
||||||
|
|
||||||
<style name="My.Theme.Fullscreen" parent="@android:style/Theme.Holo.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:textViewStyle">@style/My.Widget.TextView</item>
|
<item name="android:textViewStyle">@style/My.Widget.TextView</item>
|
||||||
|
<item name="android:windowLayoutInDisplayCutoutMode" tools:targetApi="27">shortEdges</item>
|
||||||
</style>
|
</style>
|
||||||
|
|
||||||
<style name="My.Theme.Preference" parent="@android:style/Theme.Holo.Light.DarkActionBar">
|
<style name="My.Theme.Preference" parent="@android:style/Theme.Material.Light.DarkActionBar">
|
||||||
<item name="android:actionBarStyle">@style/My.Widget.ActionBar</item>
|
<item name="android:actionBarStyle">@style/My.Widget.ActionBar</item>
|
||||||
</style>
|
</style>
|
||||||
|
|
||||||
|
@ -41,20 +43,21 @@
|
||||||
<item name="android:textSize">@dimen/font_size_normal</item>
|
<item name="android:textSize">@dimen/font_size_normal</item>
|
||||||
</style>
|
</style>
|
||||||
|
|
||||||
<style name="My.Widget.AutoCompleteTextView" parent="@android:style/Widget.Holo.Light.AutoCompleteTextView">
|
<style name="My.Widget.AutoCompleteTextView" parent="@android:style/Widget.Material.Light.AutoCompleteTextView">
|
||||||
<item name="android:textColor">@color/fg_significant</item>
|
<item name="android:textColor">@color/fg_significant</item>
|
||||||
<item name="android:background">@null</item>
|
<item name="android:background">@null</item>
|
||||||
<item name="android:popupBackground">@android:color/white</item>
|
<item name="android:popupBackground">@android:color/white</item>
|
||||||
<item name="android:dropDownVerticalOffset">0px</item>
|
<item name="android:dropDownVerticalOffset">0px</item>
|
||||||
</style>
|
</style>
|
||||||
|
|
||||||
<style name="My.Widget.Button" parent="@android:style/Widget.Holo.Light.Button">
|
<style name="My.Widget.Button" parent="@android:style/Widget.Material.Light.Button">
|
||||||
<item name="android:background">?android:attr/selectableItemBackground</item>
|
<item name="android:background">?android:attr/selectableItemBackground</item>
|
||||||
<item name="android:textColor">@color/fg_significant</item>
|
<item name="android:textColor">@color/fg_significant</item>
|
||||||
<item name="android:textSize">@dimen/font_size_normal</item>
|
<item name="android:textSize">@dimen/font_size_normal</item>
|
||||||
|
<item name="android:textAllCaps">false</item>
|
||||||
</style>
|
</style>
|
||||||
|
|
||||||
<style name="My.Widget.Button.Border" parent="@android:style/Widget.Holo.Light.Button">
|
<style name="My.Widget.Button.Border" parent="@android:style/Widget.Material.Light.Button">
|
||||||
<item name="android:textColor">@color/fg_significant</item>
|
<item name="android:textColor">@color/fg_significant</item>
|
||||||
<item name="android:textSize">@dimen/font_size_normal</item>
|
<item name="android:textSize">@dimen/font_size_normal</item>
|
||||||
</style>
|
</style>
|
||||||
|
@ -69,23 +72,23 @@
|
||||||
<item name="android:src">@drawable/ic_more_vert_grey600_24dp</item>
|
<item name="android:src">@drawable/ic_more_vert_grey600_24dp</item>
|
||||||
</style>
|
</style>
|
||||||
|
|
||||||
<style name="My.Widget.CompoundButton.CheckBox" parent="@android:style/Widget.Holo.CompoundButton.CheckBox">
|
<style name="My.Widget.CompoundButton.CheckBox" parent="@android:style/Widget.Material.CompoundButton.CheckBox">
|
||||||
<item name="android:textSize">@dimen/font_size_normal</item>
|
<item name="android:textSize">@dimen/font_size_normal</item>
|
||||||
</style>
|
</style>
|
||||||
|
|
||||||
<style name="My.Widget.ListView.DropDown" parent="@android:style/Widget.Holo.ListView.DropDown">
|
<style name="My.Widget.ListView.DropDown" parent="@android:style/Widget.Material.ListView.DropDown">
|
||||||
<item name="android:divider">@null</item>
|
<item name="android:divider">@null</item>
|
||||||
</style>
|
</style>
|
||||||
|
|
||||||
<style name="My.Widget.PopupMenu" parent="@android:style/Widget.Holo.Light.PopupMenu" />
|
<style name="My.Widget.PopupMenu" parent="@android:style/Widget.Material.Light.PopupMenu" />
|
||||||
|
|
||||||
<style name="My.Widget.ActionBar" parent="@android:style/Widget.Holo.ActionBar.Solid">
|
<style name="My.Widget.ActionBar" parent="@android:style/Widget.Material.ActionBar.Solid">
|
||||||
<item name="android:background">@color/bg_action_bar</item>
|
<item name="android:background">@color/bg_action_bar</item>
|
||||||
<item name="android:titleTextStyle">@style/My.TextAppearance.Widget.ActionBar.Title</item>
|
<item name="android:titleTextStyle">@style/My.TextAppearance.Widget.ActionBar.Title</item>
|
||||||
<item name="android:displayOptions">homeAsUp|showTitle</item>
|
<item name="android:displayOptions">homeAsUp|showTitle</item>
|
||||||
</style>
|
</style>
|
||||||
|
|
||||||
<style name="My.TextAppearance.Widget.ActionBar.Title" parent="@android:style/TextAppearance.Holo.Widget.ActionBar.Title">
|
<style name="My.TextAppearance.Widget.ActionBar.Title" parent="@android:style/TextAppearance.Material.Widget.ActionBar.Title">
|
||||||
<item name="android:textColor">@android:color/white</item>
|
<item name="android:textColor">@android:color/white</item>
|
||||||
<item name="android:textStyle">bold</item>
|
<item name="android:textStyle">bold</item>
|
||||||
</style>
|
</style>
|
||||||
|
|
|
@ -47,7 +47,6 @@ import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.io.FilenameFilter;
|
import java.io.FilenameFilter;
|
||||||
import java.lang.reflect.Method;
|
|
||||||
import java.util.concurrent.TimeUnit;
|
import java.util.concurrent.TimeUnit;
|
||||||
|
|
||||||
public class Application extends android.app.Application {
|
public class Application extends android.app.Application {
|
||||||
|
@ -86,13 +85,6 @@ public class Application extends android.app.Application {
|
||||||
});
|
});
|
||||||
interceptor.setLevel(HttpLoggingInterceptor.Level.BASIC);
|
interceptor.setLevel(HttpLoggingInterceptor.Level.BASIC);
|
||||||
builder.addNetworkInterceptor(interceptor);
|
builder.addNetworkInterceptor(interceptor);
|
||||||
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) {
|
|
||||||
log.info("manually enabling TLS 1.2 on API level {}", Build.VERSION.SDK_INT);
|
|
||||||
if (safetyNetInsertProvider()) {
|
|
||||||
final Tls12SocketFactory socketFactory = new Tls12SocketFactory();
|
|
||||||
builder.sslSocketFactory(socketFactory, socketFactory.getTrustManager());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
okHttpClient = builder.build();
|
okHttpClient = builder.build();
|
||||||
|
|
||||||
initMaps();
|
initMaps();
|
||||||
|
@ -127,23 +119,6 @@ public class Application extends android.app.Application {
|
||||||
initNotificationManager();
|
initNotificationManager();
|
||||||
}
|
}
|
||||||
|
|
||||||
private boolean safetyNetInsertProvider() {
|
|
||||||
// This piece of code uses SafetyNet (Google Play Services) to insert a recent version of Conscrypt, if
|
|
||||||
// available. We use reflection to avoid the proprietary Google Play Services client library.
|
|
||||||
try {
|
|
||||||
final Stopwatch watch = Stopwatch.createStarted();
|
|
||||||
final Context remoteContext = createPackageContext("com.google.android.gms", 3);
|
|
||||||
final Method insertProvider = remoteContext.getClassLoader().loadClass("com.google.android.gms.common" +
|
|
||||||
".security.ProviderInstallerImpl").getMethod("insertProvider", new Class[] { Context.class });
|
|
||||||
insertProvider.invoke(null, new Object[] { remoteContext });
|
|
||||||
log.info("insertProvider successful, took {}", watch.stop());
|
|
||||||
return true;
|
|
||||||
} catch (final Exception x) {
|
|
||||||
log.warn("insertProvider failed", x);
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private void initLogging() {
|
private void initLogging() {
|
||||||
final File logDir = new File(getFilesDir(), "log");
|
final File logDir = new File(getFilesDir(), "log");
|
||||||
final File logFile = new File(logDir, "oeffi.log");
|
final File logFile = new File(logDir, "oeffi.log");
|
||||||
|
|
|
@ -17,8 +17,6 @@
|
||||||
|
|
||||||
package de.schildbach.oeffi;
|
package de.schildbach.oeffi;
|
||||||
|
|
||||||
import android.app.AlertDialog;
|
|
||||||
import android.os.Build;
|
|
||||||
import android.text.format.DateUtils;
|
import android.text.format.DateUtils;
|
||||||
import okhttp3.HttpUrl;
|
import okhttp3.HttpUrl;
|
||||||
|
|
||||||
|
@ -74,6 +72,5 @@ public class Constants {
|
||||||
public static final String DESTINATION_ARROW_INVISIBLE_PREFIX = " ";
|
public static final String DESTINATION_ARROW_INVISIBLE_PREFIX = " ";
|
||||||
|
|
||||||
@SuppressWarnings("deprecation")
|
@SuppressWarnings("deprecation")
|
||||||
public static final int ALERT_DIALOG_THEME = Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP
|
public static final int ALERT_DIALOG_THEME = android.R.style.Theme_DeviceDefault_Light_Dialog;
|
||||||
? AlertDialog.THEME_DEVICE_DEFAULT_LIGHT : android.R.style.Theme_DeviceDefault_Light_Dialog;
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -115,7 +115,6 @@ public abstract class OeffiActivity extends Activity {
|
||||||
protected final void setPrimaryColor(final int colorResId) {
|
protected final void setPrimaryColor(final int colorResId) {
|
||||||
final int color = getResources().getColor(colorResId);
|
final int color = getResources().getColor(colorResId);
|
||||||
getMyActionBar().setBackgroundColor(color);
|
getMyActionBar().setBackgroundColor(color);
|
||||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP)
|
|
||||||
setTaskDescription(new TaskDescription(null, null, color));
|
setTaskDescription(new TaskDescription(null, null, color));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,118 +0,0 @@
|
||||||
/*
|
|
||||||
* 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 <https://www.gnu.org/licenses/>.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package de.schildbach.oeffi;
|
|
||||||
|
|
||||||
import androidx.annotation.Nullable;
|
|
||||||
import okhttp3.TlsVersion;
|
|
||||||
|
|
||||||
import javax.net.ssl.SSLContext;
|
|
||||||
import javax.net.ssl.SSLSocket;
|
|
||||||
import javax.net.ssl.SSLSocketFactory;
|
|
||||||
import javax.net.ssl.TrustManager;
|
|
||||||
import javax.net.ssl.TrustManagerFactory;
|
|
||||||
import javax.net.ssl.X509TrustManager;
|
|
||||||
import java.io.IOException;
|
|
||||||
import java.net.InetAddress;
|
|
||||||
import java.net.Socket;
|
|
||||||
import java.net.UnknownHostException;
|
|
||||||
import java.security.KeyManagementException;
|
|
||||||
import java.security.KeyStore;
|
|
||||||
import java.security.KeyStoreException;
|
|
||||||
import java.security.NoSuchAlgorithmException;
|
|
||||||
import java.util.Arrays;
|
|
||||||
import java.util.Set;
|
|
||||||
import java.util.TreeSet;
|
|
||||||
|
|
||||||
public final class Tls12SocketFactory extends SSLSocketFactory {
|
|
||||||
private final SSLSocketFactory delegate;
|
|
||||||
private final TrustManager[] trustManagers;
|
|
||||||
|
|
||||||
public Tls12SocketFactory() {
|
|
||||||
try {
|
|
||||||
final TrustManagerFactory trustManagerFactory =
|
|
||||||
TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
|
|
||||||
trustManagerFactory.init((KeyStore) null);
|
|
||||||
trustManagers = trustManagerFactory.getTrustManagers();
|
|
||||||
final SSLContext context = SSLContext.getInstance(TlsVersion.TLS_1_2.javaName());
|
|
||||||
context.init(null, trustManagers, null);
|
|
||||||
delegate = context.getSocketFactory();
|
|
||||||
} catch (final NoSuchAlgorithmException | KeyManagementException | KeyStoreException x) {
|
|
||||||
throw new RuntimeException(x);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Nullable
|
|
||||||
public X509TrustManager getTrustManager() {
|
|
||||||
for (final TrustManager tm : trustManagers)
|
|
||||||
if (tm instanceof X509TrustManager)
|
|
||||||
return (X509TrustManager) tm;
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String[] getDefaultCipherSuites() {
|
|
||||||
return delegate.getDefaultCipherSuites();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String[] getSupportedCipherSuites() {
|
|
||||||
return delegate.getSupportedCipherSuites();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Socket createSocket() throws IOException {
|
|
||||||
return patchForTls12(delegate.createSocket());
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Socket createSocket(Socket s, String host, int port, boolean autoClose) throws IOException {
|
|
||||||
return patchForTls12(delegate.createSocket(s, host, port, autoClose));
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Socket createSocket(String host, int port) throws IOException, UnknownHostException {
|
|
||||||
return patchForTls12(delegate.createSocket(host, port));
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Socket createSocket(String host, int port, InetAddress localHost, int localPort) throws IOException,
|
|
||||||
UnknownHostException {
|
|
||||||
return patchForTls12(delegate.createSocket(host, port, localHost, localPort));
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Socket createSocket(InetAddress host, int port) throws IOException {
|
|
||||||
return patchForTls12(delegate.createSocket(host, port));
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Socket createSocket(InetAddress address, int port, InetAddress localAddress, int localPort) throws IOException {
|
|
||||||
return patchForTls12(delegate.createSocket(address, port, localAddress, localPort));
|
|
||||||
}
|
|
||||||
|
|
||||||
private Socket patchForTls12(final Socket socket) {
|
|
||||||
if (socket != null && (socket instanceof SSLSocket)) {
|
|
||||||
final SSLSocket sslSocket = (SSLSocket) socket;
|
|
||||||
final Set<String> protocols = new TreeSet<>();
|
|
||||||
protocols.addAll(Arrays.asList(sslSocket.getEnabledProtocols()));
|
|
||||||
protocols.add(TlsVersion.TLS_1_2.javaName());
|
|
||||||
sslSocket.setEnabledProtocols(protocols.toArray(new String[0]));
|
|
||||||
}
|
|
||||||
return socket;
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -560,7 +560,6 @@ public class NetworkPickerActivity extends Activity implements ActivityCompat.On
|
||||||
protected final void setPrimaryColor(final int colorResId) {
|
protected final void setPrimaryColor(final int colorResId) {
|
||||||
final int color = getResources().getColor(colorResId);
|
final int color = getResources().getColor(colorResId);
|
||||||
actionBar.setBackgroundColor(color);
|
actionBar.setBackgroundColor(color);
|
||||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP)
|
|
||||||
setTaskDescription(new TaskDescription(null, null, color));
|
setTaskDescription(new TaskDescription(null, null, color));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -17,7 +17,6 @@
|
||||||
|
|
||||||
package de.schildbach.oeffi.network;
|
package de.schildbach.oeffi.network;
|
||||||
|
|
||||||
import android.os.Build;
|
|
||||||
import com.google.common.base.Charsets;
|
import com.google.common.base.Charsets;
|
||||||
import de.schildbach.pte.AbstractNetworkProvider;
|
import de.schildbach.pte.AbstractNetworkProvider;
|
||||||
import de.schildbach.pte.AvvAachenProvider;
|
import de.schildbach.pte.AvvAachenProvider;
|
||||||
|
@ -97,8 +96,6 @@ public final class NetworkProviderFactory {
|
||||||
|
|
||||||
final AbstractNetworkProvider networkProvider = forId(networkId);
|
final AbstractNetworkProvider networkProvider = forId(networkId);
|
||||||
networkProvider.setUserAgent(USER_AGENT);
|
networkProvider.setUserAgent(USER_AGENT);
|
||||||
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP)
|
|
||||||
networkProvider.setTrustAllCertificates(true);
|
|
||||||
providerCache.put(networkId, networkProvider);
|
providerCache.put(networkId, networkProvider);
|
||||||
return networkProvider;
|
return networkProvider;
|
||||||
}
|
}
|
||||||
|
@ -170,11 +167,7 @@ public final class NetworkProviderFactory {
|
||||||
else if (networkId.equals(NetworkId.VVV))
|
else if (networkId.equals(NetworkId.VVV))
|
||||||
return new VvvProvider();
|
return new VvvProvider();
|
||||||
else if (networkId.equals(NetworkId.OEBB))
|
else if (networkId.equals(NetworkId.OEBB))
|
||||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP)
|
|
||||||
return new OebbProvider("{\"type\":\"AID\",\"aid\":\"OWDL4fE4ixNiPBBm\"}");
|
return new OebbProvider("{\"type\":\"AID\",\"aid\":\"OWDL4fE4ixNiPBBm\"}");
|
||||||
else
|
|
||||||
return new OebbProvider(HttpUrl.parse("http://fahrplan.oebb.at/bin/"), "{\"type\":\"AID\"," +
|
|
||||||
"\"aid\":\"OWDL4fE4ixNiPBBm\"}");
|
|
||||||
else if (networkId.equals(NetworkId.WIEN))
|
else if (networkId.equals(NetworkId.WIEN))
|
||||||
return new WienProvider();
|
return new WienProvider();
|
||||||
else if (networkId.equals(NetworkId.LINZ))
|
else if (networkId.equals(NetworkId.LINZ))
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue