Extract DurationParser
This makes it easier to test the logic of parsing duration strings. References: #3024
This commit is contained in:
parent
a4c852dac0
commit
9b41139709
@ -5,10 +5,9 @@ import android.util.Log;
|
||||
|
||||
import org.xml.sax.Attributes;
|
||||
|
||||
import java.util.concurrent.TimeUnit;
|
||||
|
||||
import de.danoeh.antennapod.core.feed.FeedItem;
|
||||
import de.danoeh.antennapod.core.syndication.handler.HandlerState;
|
||||
import de.danoeh.antennapod.core.syndication.parsers.DurationParser;
|
||||
|
||||
public class NSITunes extends Namespace {
|
||||
|
||||
@ -72,22 +71,12 @@ public class NSITunes extends Namespace {
|
||||
if (TextUtils.isEmpty(durationStr)) {
|
||||
return;
|
||||
}
|
||||
String[] parts = durationStr.trim().split(":");
|
||||
|
||||
try {
|
||||
int durationMs = 0;
|
||||
if (parts.length == 2) {
|
||||
durationMs += TimeUnit.MINUTES.toMillis(Long.parseLong(parts[0])) +
|
||||
TimeUnit.SECONDS.toMillis((long) Float.parseFloat(parts[1]));
|
||||
} else if (parts.length >= 3) {
|
||||
durationMs += TimeUnit.HOURS.toMillis(Long.parseLong(parts[0])) +
|
||||
TimeUnit.MINUTES.toMillis(Long.parseLong(parts[1])) +
|
||||
TimeUnit.SECONDS.toMillis((long) Float.parseFloat(parts[2]));
|
||||
} else {
|
||||
return;
|
||||
}
|
||||
state.getTempObjects().put(DURATION, durationMs);
|
||||
long durationMs = DurationParser.inMillis(durationStr);
|
||||
state.getTempObjects().put(DURATION, (int) durationMs);
|
||||
} catch (NumberFormatException e) {
|
||||
Log.e(NSTAG, "Duration \"" + durationStr + "\" could not be parsed");
|
||||
Log.e(NSTAG, String.format("Duration '%s' could not be parsed", durationStr));
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -0,0 +1,35 @@
|
||||
package de.danoeh.antennapod.core.syndication.parsers;
|
||||
|
||||
import static java.util.concurrent.TimeUnit.HOURS;
|
||||
import static java.util.concurrent.TimeUnit.MINUTES;
|
||||
import static java.util.concurrent.TimeUnit.SECONDS;
|
||||
|
||||
public class DurationParser {
|
||||
public static long inMillis(String durationStr) throws NumberFormatException {
|
||||
String[] parts = durationStr.trim().split(":");
|
||||
|
||||
if (parts.length == 2) {
|
||||
return toMillis("0", parts[0], parts[1]);
|
||||
} else if (parts.length == 3) {
|
||||
return toMillis(parts[0], parts[1], parts[2]);
|
||||
} else {
|
||||
throw new NumberFormatException();
|
||||
}
|
||||
}
|
||||
|
||||
private static long toMillis(String hours, String minutes, String seconds) {
|
||||
return HOURS.toMillis(Long.parseLong(hours))
|
||||
+ MINUTES.toMillis(Long.parseLong(minutes))
|
||||
+ toMillis(seconds);
|
||||
}
|
||||
|
||||
private static long toMillis(String seconds) {
|
||||
if (seconds.contains(".")) {
|
||||
float value = Float.parseFloat(seconds);
|
||||
float millis = value % 1;
|
||||
return SECONDS.toMillis((long) value) + (long) (millis * 1000);
|
||||
} else {
|
||||
return SECONDS.toMillis(Long.parseLong(seconds));
|
||||
}
|
||||
}
|
||||
}
|
@ -0,0 +1,36 @@
|
||||
package de.danoeh.antennapod.core.syndication.parsers;
|
||||
|
||||
import org.junit.Test;
|
||||
|
||||
import static org.junit.Assert.assertEquals;
|
||||
|
||||
public class DurationParserTest {
|
||||
private int milliseconds = 1;
|
||||
private int seconds = 1000 * milliseconds;
|
||||
private int minutes = 60 * seconds;
|
||||
private int hours = 60 * minutes;
|
||||
|
||||
@Test
|
||||
public void testSecondDurationInMillis() {
|
||||
long duration = DurationParser.inMillis("00:45");
|
||||
assertEquals(45 * seconds, duration);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testMinuteSecondDurationInMillis() {
|
||||
long duration = DurationParser.inMillis("05:10");
|
||||
assertEquals(5 * minutes + 10 * seconds, duration);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testHourMinuteSecondDurationInMillis() {
|
||||
long duration = DurationParser.inMillis("02:15:45");
|
||||
assertEquals(2 * hours + 15 * minutes + 45 * seconds, duration);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testSecondsWithMillisecondsInMillis() {
|
||||
long duration = DurationParser.inMillis("00:00:00.123");
|
||||
assertEquals(123, duration);
|
||||
}
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user