aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/github/daneren2005/dsub/service/DownloadService.java27
-rw-r--r--src/github/daneren2005/dsub/service/ssl/SSLSocketFactory.java27
2 files changed, 46 insertions, 8 deletions
diff --git a/src/github/daneren2005/dsub/service/DownloadService.java b/src/github/daneren2005/dsub/service/DownloadService.java
index 676d263c..7ff1d5eb 100644
--- a/src/github/daneren2005/dsub/service/DownloadService.java
+++ b/src/github/daneren2005/dsub/service/DownloadService.java
@@ -144,6 +144,10 @@ public class DownloadService extends Service {
private boolean autoPlayStart = false;
private MediaRouteManager mediaRouter;
+
+ // Variables to manage getCurrentPosition sometimes starting from an arbitrary non-zero number
+ private long subtractNextPosition = 0;
+ private int subtractPosition = 0;
@Override
public void onCreate() {
@@ -803,6 +807,7 @@ public class DownloadService extends Service {
Util.broadcastPlaybackStatusChange(this, currentPlaying.getSong(), PlayerState.PREPARED);
// Swap the media players since nextMediaPlayer is ready to play
+ subtractPosition = 0;
if(start) {
nextMediaPlayer.start();
} else if(!nextMediaPlayer.isPlaying()) {
@@ -810,6 +815,9 @@ public class DownloadService extends Service {
nextMediaPlayer.start();
} else {
Log.i(TAG, "nextMediaPlayer already playing");
+
+ // Next time the cachedPosition is updated, use that as position 0
+ subtractNextPosition = System.currentTimeMillis();
}
MediaPlayer tmp = mediaPlayer;
mediaPlayer = nextMediaPlayer;
@@ -850,6 +858,7 @@ public class DownloadService extends Service {
} else {
mediaPlayer.seekTo(position);
cachedPosition = position;
+ subtractPosition = 0;
}
} catch (Exception x) {
handleError(x);
@@ -980,6 +989,7 @@ public class DownloadService extends Service {
mediaPlayer.setOnErrorListener(null);
mediaPlayer.setOnCompletionListener(null);
mediaPlayer.reset();
+ subtractPosition = 0;
} catch (Exception x) {
handleError(x);
}
@@ -1012,7 +1022,7 @@ public class DownloadService extends Service {
if (remoteState != RemoteControlState.LOCAL) {
return remoteController.getRemotePosition() * 1000;
} else {
- return cachedPosition;
+ return Math.max(0, cachedPosition - subtractPosition);
}
} catch (Exception x) {
handleError(x);
@@ -1109,6 +1119,14 @@ public class DownloadService extends Service {
try {
if(mediaPlayer != null && playerState == STARTED) {
cachedPosition = mediaPlayer.getCurrentPosition();
+ if(subtractNextPosition > 0) {
+ // Subtraction amount is current position - how long ago onCompletionListener was called
+ subtractPosition = cachedPosition - (int) (System.currentTimeMillis() - subtractNextPosition);
+ if(subtractPosition < 0) {
+ subtractPosition = 0;
+ }
+ subtractNextPosition = 0;
+ }
}
Thread.sleep(1000L);
}
@@ -1332,6 +1350,7 @@ public class DownloadService extends Service {
boolean isPartial = file.equals(downloadFile.getPartialFile());
downloadFile.updateModificationDate();
+ subtractPosition = 0;
mediaPlayer.setOnCompletionListener(null);
mediaPlayer.reset();
setPlayerState(IDLE);
@@ -1456,7 +1475,7 @@ public class DownloadService extends Service {
mediaPlayer.setOnErrorListener(new MediaPlayer.OnErrorListener() {
public boolean onError(MediaPlayer mediaPlayer, int what, int extra) {
Log.w(TAG, "Error on playing file " + "(" + what + ", " + extra + "): " + downloadFile);
- int pos = cachedPosition;
+ int pos = getPlayerPosition();
reset();
if (!isPartial || (downloadFile.isWorkDone() && (Math.abs(duration - pos) < 10000))) {
playNext();
@@ -1479,7 +1498,7 @@ public class DownloadService extends Service {
setPlayerStateCompleted();
- int pos = cachedPosition;
+ int pos = getPlayerPosition();
Log.i(TAG, "Ending position " + pos + " of " + duration);
if (!isPartial || (downloadFile.isWorkDone() && (Math.abs(duration - pos) < 10000)) || nextSetup) {
playNext();
@@ -1770,7 +1789,7 @@ public class DownloadService extends Service {
private boolean isPastCutoff() {
int duration = getPlayerDuration();
int cutoffPoint = (int) (duration * DELETE_CUTOFF);
- return duration > 0 && cachedPosition > cutoffPoint;
+ return duration > 0 && getPlayerPosition() > cutoffPoint;
}
private void clearCurrentBookmark() {
diff --git a/src/github/daneren2005/dsub/service/ssl/SSLSocketFactory.java b/src/github/daneren2005/dsub/service/ssl/SSLSocketFactory.java
index 2ffed048..2f11730a 100644
--- a/src/github/daneren2005/dsub/service/ssl/SSLSocketFactory.java
+++ b/src/github/daneren2005/dsub/service/ssl/SSLSocketFactory.java
@@ -27,6 +27,8 @@
package github.daneren2005.dsub.service.ssl;
+import android.util.Log;
+
import org.apache.http.conn.ConnectTimeoutException;
import org.apache.http.conn.scheme.HostNameResolver;
import org.apache.http.conn.scheme.LayeredSocketFactory;
@@ -140,7 +142,7 @@ import java.security.UnrecoverableKeyException;
* @since 4.0
*/
public class SSLSocketFactory implements LayeredSocketFactory {
-
+ private static final String TAG = SSLSocketFactory.class.getSimpleName();
public static final String TLS = "TLS";
public static final String SSL = "SSL";
public static final String SSLV2 = "SSLv2";
@@ -341,13 +343,17 @@ public class SSLSocketFactory implements LayeredSocketFactory {
@SuppressWarnings("cast")
public Socket createSocket(final HttpParams params) throws IOException {
// the cast makes sure that the factory is working as expected
- return (SSLSocket) this.socketfactory.createSocket();
+ SSLSocket sslsocket = (SSLSocket) this.socketfactory.createSocket();
+ sslsocket.setEnabledProtocols(sslsocket.getSupportedProtocols());
+ return sslsocket;
}
@SuppressWarnings("cast")
public Socket createSocket() throws IOException {
// the cast makes sure that the factory is working as expected
- return (SSLSocket) this.socketfactory.createSocket();
+ SSLSocket sslSocket = (SSLSocket) this.socketfactory.createSocket();
+ sslSocket.setEnabledProtocols(sslSocket.getSupportedProtocols());
+ return sslSocket;
}
/**
@@ -370,6 +376,7 @@ public class SSLSocketFactory implements LayeredSocketFactory {
sslsock.bind(localAddress);
}
+ setHostName(sslsock, remoteAddress.getHostName());
int connTimeout = HttpConnectionParams.getConnectionTimeout(params);
int soTimeout = HttpConnectionParams.getSoTimeout(params);
@@ -437,6 +444,7 @@ public class SSLSocketFactory implements LayeredSocketFactory {
port,
autoClose
);
+ sslSocket.setEnabledProtocols(sslSocket.getSupportedProtocols());
if (this.hostnameVerifier != null) {
this.hostnameVerifier.verify(host, sslSocket);
}
@@ -491,7 +499,18 @@ public class SSLSocketFactory implements LayeredSocketFactory {
final Socket socket,
final String host, int port,
boolean autoClose) throws IOException, UnknownHostException {
- return createLayeredSocket(socket, host, port, autoClose);
+ SSLSocket sslSocket = (SSLSocket) this.socketfactory.createSocket(socket, host, port, autoClose);
+ sslSocket.setEnabledProtocols(sslSocket.getSupportedProtocols());
+ setHostName(sslSocket, host);
+ return sslSocket;
}
+ private void setHostName(SSLSocket sslsock, String hostname){
+ try {
+ java.lang.reflect.Method setHostnameMethod = sslsock.getClass().getMethod("setHostname", String.class);
+ setHostnameMethod.invoke(sslsock, hostname);
+ } catch (Exception e) {
+ Log.w(TAG, "SNI not useable", e);
+ }
+ }
}