diff --git a/README.md b/README.md index 8c310a92..7f243ffa 100644 --- a/README.md +++ b/README.md @@ -23,8 +23,8 @@ Androidでの利用 | PAY.JP https://pay.jp/docs/mobileapp-android ## 動作環境 -- Android Studio 3.0以上 -- Android OS 4.1 (API Level 16) 以上 +- Android Studio Ladybug Feature Drop (2024.2.2) 以上 +- Android OS 5.0 (API Level 21) 以上 ## インストール diff --git a/build.gradle b/build.gradle index f6169bad..4950f7c1 100644 --- a/build.gradle +++ b/build.gradle @@ -59,7 +59,7 @@ tasks.named("dokkaHtmlCollector") { } ext { - minSdkVersion = 16 + minSdkVersion = 21 sdkVersion = 35 numberOfCommits = numberOfCommits() } diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 40886507..629fb707 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -9,7 +9,7 @@ junitKtx = "1.1.5" kotlin = "2.0.0" browser = "1.6.0" leakcanaryAndroid = "2.14" -okHttp3 = "3.12.13" +okHttp3 = "4.12.0" moshi = "1.15.1" retrofit = "2.11.0" lifecycle = "2.6.2" @@ -23,7 +23,7 @@ recyclerview = "1.3.2" cardio = "5.5.1" androidxCore = "1.12.0" annotation = "1.8.1" -robolectric = "4.12.2" +robolectric = "4.14" swiperefreshlayout = "1.1.0" viewpager2 = "1.0.0" webkit = "1.8.0" diff --git a/payjp-android-cardform/src/test/resources/robolectric.properties b/payjp-android-cardform/src/test/resources/robolectric.properties index e7f67b67..b2cd4407 100644 --- a/payjp-android-cardform/src/test/resources/robolectric.properties +++ b/payjp-android-cardform/src/test/resources/robolectric.properties @@ -21,5 +21,5 @@ # SOFTWARE. # -sdk=19,34 +sdk=21,35 constants=jp.pay.android.BuildConfig \ No newline at end of file diff --git a/payjp-android-core/src/main/kotlin/jp/pay/android/network/OkHttpTlsHelper.kt b/payjp-android-core/src/main/kotlin/jp/pay/android/network/OkHttpTlsHelper.kt deleted file mode 100644 index ffc3c9cf..00000000 --- a/payjp-android-core/src/main/kotlin/jp/pay/android/network/OkHttpTlsHelper.kt +++ /dev/null @@ -1,83 +0,0 @@ -/* - * - * Copyright (c) 2021 PAY, Inc. - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ -package jp.pay.android.network - -import android.os.Build -import jp.pay.android.PayjpLogger -import okhttp3.ConnectionSpec -import okhttp3.OkHttpClient -import okhttp3.TlsVersion -import java.security.KeyStore -import java.util.Arrays -import javax.net.ssl.SSLContext -import javax.net.ssl.TrustManagerFactory -import javax.net.ssl.X509TrustManager - -/** - * Enable Tls ON Pre-Lollipop - * @link https://github.com/square/okhttp/issues/2372 - */ -internal object OkHttpTlsHelper { - - fun enableTls12OnPreLollipop( - builder: OkHttpClient.Builder, - logger: PayjpLogger - ): OkHttpClient.Builder { - return builder.takeIf { - Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN && - Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP_MR1 - }?.apply { - try { - val trustManagerFactory = TrustManagerFactory.getInstance( - TrustManagerFactory.getDefaultAlgorithm() - ) - trustManagerFactory.init(null as KeyStore?) - val trustManagers = trustManagerFactory.trustManagers - check(!(trustManagers.size != 1 || trustManagers[0] !is X509TrustManager)) { - "Unexpected default trust managers:" + Arrays.toString(trustManagers) - } - val trustManager = trustManagers[0] as X509TrustManager - - val sslContext = SSLContext.getInstance("TLSv1.2") - .apply { init(null, null, null) } - - sslSocketFactory(Tls12SocketFactory(sslContext.socketFactory), trustManager) - - val cs = ConnectionSpec.Builder(ConnectionSpec.MODERN_TLS) - .tlsVersions(TlsVersion.TLS_1_2) - .build() - - connectionSpecs( - mutableListOf( - cs, - ConnectionSpec.COMPATIBLE_TLS, - ConnectionSpec.CLEARTEXT - ) - ) - logger.v("apply TLSv1.2 for pre-Lollipop") - } catch (e: Exception) { - logger.e("error while setting TLS 1.2", e) - } - } ?: builder - } -} diff --git a/payjp-android-core/src/main/kotlin/jp/pay/android/network/Tls12SocketFactory.java b/payjp-android-core/src/main/kotlin/jp/pay/android/network/Tls12SocketFactory.java deleted file mode 100644 index 47d74eee..00000000 --- a/payjp-android-core/src/main/kotlin/jp/pay/android/network/Tls12SocketFactory.java +++ /dev/null @@ -1,94 +0,0 @@ -/* - * - * Copyright (c) 2018 PAY, Inc. - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -package jp.pay.android.network; - -import java.io.IOException; -import java.net.InetAddress; -import java.net.Socket; -import java.net.UnknownHostException; - -import javax.net.ssl.SSLSocket; -import javax.net.ssl.SSLSocketFactory; - -/** - * Enables TLS v1.2 when creating SSLSockets. - *
- * For some reason, android supports TLS v1.2 from API 16, but enables it by - * default only from API 20. - * - * @link https://developer.android.com/reference/javax/net/ssl/SSLSocket.html - * @link https://github.com/square/okhttp/issues/2372 - * @see SSLSocketFactory - */ -class Tls12SocketFactory extends SSLSocketFactory { - private static final String[] TLS_V12_ONLY = {"TLSv1.2"}; - - private final SSLSocketFactory delegate; - - public Tls12SocketFactory(SSLSocketFactory base) { - this.delegate = base; - } - - @Override - public String[] getDefaultCipherSuites() { - return delegate.getDefaultCipherSuites(); - } - - @Override - public String[] getSupportedCipherSuites() { - return delegate.getSupportedCipherSuites(); - } - - @Override - public Socket createSocket(Socket s, String host, int port, boolean autoClose) throws IOException { - return patch(delegate.createSocket(s, host, port, autoClose)); - } - - @Override - public Socket createSocket(String host, int port) throws IOException, UnknownHostException { - return patch(delegate.createSocket(host, port)); - } - - @Override - public Socket createSocket(String host, int port, InetAddress localHost, int localPort) throws IOException, UnknownHostException { - return patch(delegate.createSocket(host, port, localHost, localPort)); - } - - @Override - public Socket createSocket(InetAddress host, int port) throws IOException { - return patch(delegate.createSocket(host, port)); - } - - @Override - public Socket createSocket(InetAddress address, int port, InetAddress localAddress, int localPort) throws IOException { - return patch(delegate.createSocket(address, port, localAddress, localPort)); - } - - private Socket patch(Socket s) { - if (s instanceof SSLSocket) { - ((SSLSocket) s).setEnabledProtocols(TLS_V12_ONLY); - } - return s; - } -} \ No newline at end of file diff --git a/payjp-android-core/src/main/kotlin/jp/pay/android/network/TokenApiClientFactory.kt b/payjp-android-core/src/main/kotlin/jp/pay/android/network/TokenApiClientFactory.kt index c138b6a8..815b8865 100644 --- a/payjp-android-core/src/main/kotlin/jp/pay/android/network/TokenApiClientFactory.kt +++ b/payjp-android-core/src/main/kotlin/jp/pay/android/network/TokenApiClientFactory.kt @@ -24,7 +24,6 @@ package jp.pay.android.network import com.squareup.moshi.Moshi import jp.pay.android.PayjpApi -import jp.pay.android.PayjpLogger import jp.pay.android.model.BundleJsonAdapter import jp.pay.android.model.CardBrand import jp.pay.android.model.ClientInfo @@ -73,9 +72,6 @@ internal object TokenApiClientFactory { ) } } - .let { - OkHttpTlsHelper.enableTls12OnPreLollipop(it, PayjpLogger.get(debuggable)) - } .dispatcher(Dispatcher(NetworkExecutorFactory.create())) .build() diff --git a/payjp-android-core/src/test/resources/robolectric.properties b/payjp-android-core/src/test/resources/robolectric.properties index e7f67b67..b2cd4407 100644 --- a/payjp-android-core/src/test/resources/robolectric.properties +++ b/payjp-android-core/src/test/resources/robolectric.properties @@ -21,5 +21,5 @@ # SOFTWARE. # -sdk=19,34 +sdk=21,35 constants=jp.pay.android.BuildConfig \ No newline at end of file diff --git a/payjp-android-coroutine/src/test/resources/robolectric.properties b/payjp-android-coroutine/src/test/resources/robolectric.properties index 3bed9556..89636521 100644 --- a/payjp-android-coroutine/src/test/resources/robolectric.properties +++ b/payjp-android-coroutine/src/test/resources/robolectric.properties @@ -21,4 +21,4 @@ # SOFTWARE. # -sdk=19,34 \ No newline at end of file +sdk=21,35 \ No newline at end of file diff --git a/payjp-android-verifier/src/main/kotlin/jp/pay/android/verifier/ui/VerifierWebView.kt b/payjp-android-verifier/src/main/kotlin/jp/pay/android/verifier/ui/VerifierWebView.kt index b9982120..67d89792 100644 --- a/payjp-android-verifier/src/main/kotlin/jp/pay/android/verifier/ui/VerifierWebView.kt +++ b/payjp-android-verifier/src/main/kotlin/jp/pay/android/verifier/ui/VerifierWebView.kt @@ -160,9 +160,6 @@ internal class VerifierWebView @JvmOverloads constructor( domStorageEnabled = true @SuppressLint("SetJavaScriptEnabled") javaScriptEnabled = true - if (Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN_MR2) { - savePassword = false - } } if (WebViewFeature.isFeatureSupported(WebViewFeature.SAFE_BROWSING_ENABLE)) { WebSettingsCompat.setSafeBrowsingEnabled(settings, true) diff --git a/payjp-android-verifier/src/test/resources/robolectric.properties b/payjp-android-verifier/src/test/resources/robolectric.properties index 3bed9556..89636521 100644 --- a/payjp-android-verifier/src/test/resources/robolectric.properties +++ b/payjp-android-verifier/src/test/resources/robolectric.properties @@ -21,4 +21,4 @@ # SOFTWARE. # -sdk=19,34 \ No newline at end of file +sdk=21,35 \ No newline at end of file