diff --git a/oeffi/AndroidManifest.xml b/oeffi/AndroidManifest.xml index 609967d..23e125a 100644 --- a/oeffi/AndroidManifest.xml +++ b/oeffi/AndroidManifest.xml @@ -18,13 +18,12 @@ @@ -64,8 +63,7 @@ android:icon="@mipmap/ic_oeffi_stations_color_48dp" android:label="@string/app_name" android:networkSecurityConfig="@xml/network_security_config" - android:theme="@style/My.Theme.Light" - tools:targetApi="24"> + android:theme="@style/My.Theme.Light"> + android:elevation="@dimen/elevation_action_bar"> + android:elevation="@dimen/elevation_content"> + android:elevation="@dimen/elevation_panel"> @@ -105,8 +102,7 @@ android:id="@+id/directions_map_fragment" android:layout_width="match_parent" android:layout_height="match_parent" - android:elevation="@dimen/elevation_map" - tools:targetApi="21"> + android:elevation="@dimen/elevation_map"> + android:elevation="@dimen/elevation_content"> @@ -122,8 +120,7 @@ android:id="@+id/directions_trip_details_map_frame" android:layout_width="match_parent" android:layout_height="match_parent" - android:elevation="@dimen/elevation_map" - tools:targetApi="21"> + android:elevation="@dimen/elevation_map"> + android:orientation="horizontal"> + android:elevation="@dimen/elevation_content"> + android:elevation="@dimen/elevation_map"> + android:orientation="vertical"> @@ -80,8 +78,7 @@ android:id="@+id/stations_station_details_map_fragment" android:layout_width="match_parent" android:layout_height="match_parent" - android:elevation="@dimen/elevation_map" - tools:targetApi="21"> + android:elevation="@dimen/elevation_map"> - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/oeffi/res/values/styles.xml b/oeffi/res/values/styles.xml index eb30030..8cbc3e7 100644 --- a/oeffi/res/values/styles.xml +++ b/oeffi/res/values/styles.xml @@ -1,8 +1,9 @@ + xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:tools="http://schemas.android.com/tools"> - - - - @@ -41,20 +43,21 @@ @dimen/font_size_normal - - - @@ -69,23 +72,23 @@ @drawable/ic_more_vert_grey600_24dp - - - - diff --git a/oeffi/src/de/schildbach/oeffi/Application.java b/oeffi/src/de/schildbach/oeffi/Application.java index 352cc94..6a6f9ef 100644 --- a/oeffi/src/de/schildbach/oeffi/Application.java +++ b/oeffi/src/de/schildbach/oeffi/Application.java @@ -47,7 +47,6 @@ import org.slf4j.LoggerFactory; import java.io.File; import java.io.FilenameFilter; -import java.lang.reflect.Method; import java.util.concurrent.TimeUnit; public class Application extends android.app.Application { @@ -86,13 +85,6 @@ public class Application extends android.app.Application { }); interceptor.setLevel(HttpLoggingInterceptor.Level.BASIC); 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(); initMaps(); @@ -127,23 +119,6 @@ public class Application extends android.app.Application { 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() { final File logDir = new File(getFilesDir(), "log"); final File logFile = new File(logDir, "oeffi.log"); diff --git a/oeffi/src/de/schildbach/oeffi/Constants.java b/oeffi/src/de/schildbach/oeffi/Constants.java index 77947fa..2d5a647 100644 --- a/oeffi/src/de/schildbach/oeffi/Constants.java +++ b/oeffi/src/de/schildbach/oeffi/Constants.java @@ -17,8 +17,6 @@ package de.schildbach.oeffi; -import android.app.AlertDialog; -import android.os.Build; import android.text.format.DateUtils; import okhttp3.HttpUrl; @@ -74,6 +72,5 @@ public class Constants { public static final String DESTINATION_ARROW_INVISIBLE_PREFIX = " "; @SuppressWarnings("deprecation") - public static final int ALERT_DIALOG_THEME = Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP - ? AlertDialog.THEME_DEVICE_DEFAULT_LIGHT : android.R.style.Theme_DeviceDefault_Light_Dialog; + public static final int ALERT_DIALOG_THEME = android.R.style.Theme_DeviceDefault_Light_Dialog; } diff --git a/oeffi/src/de/schildbach/oeffi/OeffiActivity.java b/oeffi/src/de/schildbach/oeffi/OeffiActivity.java index 87c0a65..ede9d8e 100644 --- a/oeffi/src/de/schildbach/oeffi/OeffiActivity.java +++ b/oeffi/src/de/schildbach/oeffi/OeffiActivity.java @@ -115,8 +115,7 @@ public abstract class OeffiActivity extends Activity { protected final void setPrimaryColor(final int colorResId) { final int color = getResources().getColor(colorResId); getMyActionBar().setBackgroundColor(color); - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) - setTaskDescription(new TaskDescription(null, null, color)); + setTaskDescription(new TaskDescription(null, null, color)); } protected void updateDisclaimerSource(final TextView disclaimerSourceView, final String network, diff --git a/oeffi/src/de/schildbach/oeffi/Tls12SocketFactory.java b/oeffi/src/de/schildbach/oeffi/Tls12SocketFactory.java deleted file mode 100644 index f8340e2..0000000 --- a/oeffi/src/de/schildbach/oeffi/Tls12SocketFactory.java +++ /dev/null @@ -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 . - */ - -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 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; - } -} diff --git a/oeffi/src/de/schildbach/oeffi/network/NetworkPickerActivity.java b/oeffi/src/de/schildbach/oeffi/network/NetworkPickerActivity.java index 0bc63ee..a13f977 100644 --- a/oeffi/src/de/schildbach/oeffi/network/NetworkPickerActivity.java +++ b/oeffi/src/de/schildbach/oeffi/network/NetworkPickerActivity.java @@ -560,8 +560,7 @@ public class NetworkPickerActivity extends Activity implements ActivityCompat.On protected final void setPrimaryColor(final int colorResId) { final int color = getResources().getColor(colorResId); actionBar.setBackgroundColor(color); - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) - setTaskDescription(new TaskDescription(null, null, color)); + setTaskDescription(new TaskDescription(null, null, color)); } @TargetApi(24) diff --git a/oeffi/src/de/schildbach/oeffi/network/NetworkProviderFactory.java b/oeffi/src/de/schildbach/oeffi/network/NetworkProviderFactory.java index 4c524f3..92087f0 100644 --- a/oeffi/src/de/schildbach/oeffi/network/NetworkProviderFactory.java +++ b/oeffi/src/de/schildbach/oeffi/network/NetworkProviderFactory.java @@ -17,7 +17,6 @@ package de.schildbach.oeffi.network; -import android.os.Build; import com.google.common.base.Charsets; import de.schildbach.pte.AbstractNetworkProvider; import de.schildbach.pte.AvvAachenProvider; @@ -97,8 +96,6 @@ public final class NetworkProviderFactory { final AbstractNetworkProvider networkProvider = forId(networkId); networkProvider.setUserAgent(USER_AGENT); - if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) - networkProvider.setTrustAllCertificates(true); providerCache.put(networkId, networkProvider); return networkProvider; } @@ -170,11 +167,7 @@ public final class NetworkProviderFactory { else if (networkId.equals(NetworkId.VVV)) return new VvvProvider(); else if (networkId.equals(NetworkId.OEBB)) - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) - return new OebbProvider("{\"type\":\"AID\",\"aid\":\"OWDL4fE4ixNiPBBm\"}"); - else - return new OebbProvider(HttpUrl.parse("http://fahrplan.oebb.at/bin/"), "{\"type\":\"AID\"," + - "\"aid\":\"OWDL4fE4ixNiPBBm\"}"); + return new OebbProvider("{\"type\":\"AID\",\"aid\":\"OWDL4fE4ixNiPBBm\"}"); else if (networkId.equals(NetworkId.WIEN)) return new WienProvider(); else if (networkId.equals(NetworkId.LINZ))