diff --git a/ultrasonic/src/main/java/org/moire/ultrasonic/service/ssl/SSLSocketFactory.java b/ultrasonic/src/main/java/org/moire/ultrasonic/service/ssl/SSLSocketFactory.java
deleted file mode 100644
index 4f87e1ea..00000000
--- a/ultrasonic/src/main/java/org/moire/ultrasonic/service/ssl/SSLSocketFactory.java
+++ /dev/null
@@ -1,373 +0,0 @@
-/*
- * ====================================================================
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- * ====================================================================
- *
- * This software consists of voluntary contributions made by many
- * individuals on behalf of the Apache Software Foundation. For more
- * information on the Apache Software Foundation, please see
- *
- * SSLSocketFactory can be used to validate the identity of the HTTPS server against a list of - * trusted certificates and to authenticate to the HTTPS server using a private key. - *
- * SSLSocketFactory will enable server authentication when supplied with - * a {@link KeyStore trust-store} file containing one or several trusted certificates. The client - * secure socket will reject the connection during the SSL session handshake if the target HTTPS - * server attempts to authenticate itself with a non-trusted certificate. - *
- * Use JDK keytool utility to import a trusted certificate and generate a trust-store file: - *
- * keytool -import -alias "my server cert" -file server.crt -keystore my.truststore - *- *
- * In special cases the standard trust verification process can be bypassed by using a custom - * {@link TrustStrategy}. This interface is primarily intended for allowing self-signed - * certificates to be accepted as trusted without having to add them to the trust-store file. - *
- * The following parameters can be used to customize the behavior of this - * class: - *
- * SSLSocketFactory will enable client authentication when supplied with - * a {@link KeyStore key-store} file containing a private key/public certificate - * pair. The client secure socket will use the private key to authenticate - * itself to the target HTTPS server during the SSL session handshake if - * requested to do so by the server. - * The target HTTPS server will in its turn verify the certificate presented - * by the client in order to establish client's authenticity - *
- * Use the following sequence of actions to generate a key-store file - *
- *- * Use JDK keytool utility to generate a new key - *
keytool -genkey -v -alias "my client key" -validity 365 -keystore my.keystore- * For simplicity use the same password for the key as that of the key-store - * - *
- * Issue a certificate signing request (CSR) - *
keytool -certreq -alias "my client key" -file mycertreq.csr -keystore my.keystore- * - *
- * Send the certificate request to the trusted Certificate Authority for signature. - * One may choose to act as her own CA and sign the certificate request using a PKI - * tool, such as OpenSSL. - *
- *- * Import the trusted CA root certificate - *
keytool -import -alias "my trusted ca" -file caroot.crt -keystore my.keystore- * - *
- * Import the PKCS#7 file containg the complete certificate chain - *
keytool -import -alias "my client key" -file mycert.p7 -keystore my.keystore- * - *
- * Verify the content the resultant keystore file - *
keytool -list -v -keystore my.keystore- * - *
true
- * @throws IllegalArgumentException if the argument is invalid
- */
- public boolean isSecure(final Socket sock) throws IllegalArgumentException
- {
- if (sock == null)
- {
- throw new IllegalArgumentException("Socket may not be null");
- }
-
- // This instanceof check is in line with createSocket() above.
- if (!(sock instanceof SSLSocket))
- {
- throw new IllegalArgumentException("Socket not created by this factory");
- }
-
- // This check is performed last since it calls the argument object.
- if (sock.isClosed())
- {
- throw new IllegalArgumentException("Socket is closed");
- }
-
- return true;
- }
-
- /**
- * @since 4.1
- */
- public Socket createLayeredSocket(final Socket socket, final String host, final int port, final boolean autoClose) throws IOException
- {
- SSLSocket sslSocket = (SSLSocket) this.socketFactory.createSocket(socket, host, port, autoClose);
-
- if (this.hostnameVerifier != null)
- {
- this.hostnameVerifier.verify(host, sslSocket);
- }
-
- // verifyHostName() didn't blowup - good!
- return sslSocket;
- }
-
- /**
- * @deprecated Use {@link #connectSocket(Socket, InetSocketAddress, InetSocketAddress, HttpParams)}
- */
- @Deprecated
- public Socket connectSocket(final Socket socket, final String host, int port, final InetAddress localAddress, int localPort, final HttpParams params) throws IOException
- {
- InetSocketAddress local = null;
-
- if (localAddress != null || localPort > 0)
- {
- // we need to bind explicitly
- if (localPort < 0)
- {
- localPort = 0; // indicates "any"
- }
-
- local = new InetSocketAddress(localAddress, localPort);
- }
-
- InetAddress remoteAddress;
-
- if (this.nameResolver != null)
- {
- remoteAddress = this.nameResolver.resolve(host);
- }
- else
- {
- remoteAddress = InetAddress.getByName(host);
- }
-
- InetSocketAddress remote = new InetSocketAddress(remoteAddress, port);
-
- return connectSocket(socket, remote, local, params);
- }
-
- /**
- * @deprecated Use {@link #createLayeredSocket(Socket, String, int, boolean)}
- */
- @Deprecated
- public Socket createSocket(final Socket socket, final String host, int port, boolean autoClose) throws IOException
- {
- return createLayeredSocket(socket, host, port, autoClose);
- }
-}
\ No newline at end of file
diff --git a/ultrasonic/src/main/java/org/moire/ultrasonic/service/ssl/TrustManagerDecorator.java b/ultrasonic/src/main/java/org/moire/ultrasonic/service/ssl/TrustManagerDecorator.java
deleted file mode 100644
index 6e593418..00000000
--- a/ultrasonic/src/main/java/org/moire/ultrasonic/service/ssl/TrustManagerDecorator.java
+++ /dev/null
@@ -1,73 +0,0 @@
-/*
- * ====================================================================
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- * ====================================================================
- *
- * This software consists of voluntary contributions made by many
- * individuals on behalf of the Apache Software Foundation. For more
- * information on the Apache Software Foundation, please see
- * false
, the trust manager configured
- * in the actual SSL context can still clear the certificate as trusted.
- *
- * @param chain the peer certificate chain
- * @param authType the authentication type based on the client certificate
- * @return true
if the certificate can be trusted without verification by
- * the trust manager, false
otherwise.
- * @throws CertificateException thrown if the certificate is not trusted or invalid.
- */
- boolean isTrusted(X509Certificate[] chain, String authType) throws CertificateException;
-
-}
diff --git a/ultrasonic/src/main/kotlin/org/moire/ultrasonic/activity/NavigationActivity.kt b/ultrasonic/src/main/kotlin/org/moire/ultrasonic/activity/NavigationActivity.kt
index 6206816e..ee625720 100644
--- a/ultrasonic/src/main/kotlin/org/moire/ultrasonic/activity/NavigationActivity.kt
+++ b/ultrasonic/src/main/kotlin/org/moire/ultrasonic/activity/NavigationActivity.kt
@@ -22,6 +22,7 @@ import android.view.Menu
import android.view.MenuItem
import android.view.View
import android.widget.ImageView
+import androidx.activity.OnBackPressedCallback
import androidx.appcompat.app.AppCompatActivity
import androidx.appcompat.widget.Toolbar
import androidx.core.content.ContextCompat
@@ -220,6 +221,8 @@ class NavigationActivity : AppCompatActivity() {
cachedServerCount = count ?: 0
updateNavigationHeaderForServer()
}
+
+ onBackPressedDispatcher.addCallback(this, callback)
}
override fun onResume() {
@@ -337,13 +340,16 @@ class NavigationActivity : AppCompatActivity() {
setupActionBarWithNavController(navController, appBarConfig)
}
- override fun onBackPressed() {
- if (drawerLayout?.isDrawerVisible(GravityCompat.START) == true) {
- this.drawerLayout?.closeDrawer(GravityCompat.START)
- } else {
- val currentFragment = host!!.childFragmentManager.fragments.last()
- if (currentFragment is OnBackPressedHandler) currentFragment.onBackPressed()
- else super.onBackPressed()
+ val callback: OnBackPressedCallback = object : OnBackPressedCallback(
+ true
+ ) {
+ override fun handleOnBackPressed() {
+ if (drawerLayout?.isDrawerVisible(GravityCompat.START) == true) {
+ drawerLayout?.closeDrawer(GravityCompat.START)
+ } else {
+ val currentFragment = host!!.childFragmentManager.fragments.last()
+ if (currentFragment is OnBackPressedHandler) currentFragment.onBackPressed()
+ }
}
}
diff --git a/ultrasonic/src/main/kotlin/org/moire/ultrasonic/fragment/SettingsFragment.kt b/ultrasonic/src/main/kotlin/org/moire/ultrasonic/fragment/SettingsFragment.kt
index 74e810c0..e1c32c2f 100644
--- a/ultrasonic/src/main/kotlin/org/moire/ultrasonic/fragment/SettingsFragment.kt
+++ b/ultrasonic/src/main/kotlin/org/moire/ultrasonic/fragment/SettingsFragment.kt
@@ -250,7 +250,8 @@ class SettingsFragment :
val dialogFragment = TimeSpanPreferenceDialogFragmentCompat()
val bundle = Bundle(1)
bundle.putString("key", preference.getKey())
- dialogFragment.setArguments(bundle)
+ dialogFragment.arguments = bundle
+ @Suppress("DEPRECATION") // Their own super class uses this call :shrug:
dialogFragment.setTargetFragment(this, 0)
dialogFragment.show(
this.parentFragmentManager,
diff --git a/ultrasonic/src/main/kotlin/org/moire/ultrasonic/service/DownloadTask.kt b/ultrasonic/src/main/kotlin/org/moire/ultrasonic/service/DownloadTask.kt
index 45d7a9cd..a192f598 100644
--- a/ultrasonic/src/main/kotlin/org/moire/ultrasonic/service/DownloadTask.kt
+++ b/ultrasonic/src/main/kotlin/org/moire/ultrasonic/service/DownloadTask.kt
@@ -110,10 +110,19 @@ class DownloadTask(
// Manual throttling to avoid overloading Rx
if (SystemClock.elapsedRealtime() - lastPostTime > REFRESH_INTERVAL) {
lastPostTime = SystemClock.elapsedRealtime()
+
+ // If the file size is unknown we can only provide null as the progress
+ val size = item.track.size ?: 0
+ val progress = if (size <= 0) {
+ null
+ } else {
+ (totalBytesCopied * 100 / (size)).toInt()
+ }
+
stateChangedCallback(
item,
DownloadState.DOWNLOADING,
- (totalBytesCopied * 100 / (item.track.size ?: 1)).toInt()
+ progress
)
}
}
diff --git a/ultrasonic/src/main/res/layout/search.xml b/ultrasonic/src/main/res/layout/search.xml
index 513054b2..87d5ab49 100644
--- a/ultrasonic/src/main/res/layout/search.xml
+++ b/ultrasonic/src/main/res/layout/search.xml
@@ -1,6 +1,5 @@