Add a workaround for a possible null offset ID.
This commit is contained in:
parent
b27b49e4f3
commit
c0d6c8aeb3
3 changed files with 55 additions and 5 deletions
|
@ -1,10 +1,29 @@
|
||||||
package org.schabi.newpipe.ktx
|
package org.schabi.newpipe.ktx
|
||||||
|
|
||||||
import java.time.OffsetDateTime
|
import java.time.OffsetDateTime
|
||||||
import java.time.ZoneId
|
import java.time.ZoneOffset
|
||||||
|
import java.time.temporal.ChronoField
|
||||||
import java.util.Calendar
|
import java.util.Calendar
|
||||||
|
import java.util.Date
|
||||||
import java.util.GregorianCalendar
|
import java.util.GregorianCalendar
|
||||||
|
import java.util.TimeZone
|
||||||
|
|
||||||
fun OffsetDateTime.toCalendar(zoneId: ZoneId = ZoneId.systemDefault()): Calendar {
|
// This method is a modified version of GregorianCalendar.from(ZonedDateTime).
|
||||||
return GregorianCalendar.from(if (zoneId != offset) atZoneSameInstant(zoneId) else toZonedDateTime())
|
// Math.addExact() and Math.multiplyExact() are desugared even though lint displays a warning.
|
||||||
|
@SuppressWarnings("NewApi")
|
||||||
|
fun OffsetDateTime.toCalendar(): Calendar {
|
||||||
|
val cal = GregorianCalendar(TimeZone.getTimeZone("UTC"))
|
||||||
|
val offsetDateTimeUTC = withOffsetSameInstant(ZoneOffset.UTC)
|
||||||
|
cal.gregorianChange = Date(Long.MIN_VALUE)
|
||||||
|
cal.firstDayOfWeek = Calendar.MONDAY
|
||||||
|
cal.minimalDaysInFirstWeek = 4
|
||||||
|
try {
|
||||||
|
cal.timeInMillis = Math.addExact(
|
||||||
|
Math.multiplyExact(offsetDateTimeUTC.toEpochSecond(), 1000),
|
||||||
|
offsetDateTimeUTC[ChronoField.MILLI_OF_SECOND].toLong()
|
||||||
|
)
|
||||||
|
} catch (ex: ArithmeticException) {
|
||||||
|
throw IllegalArgumentException(ex)
|
||||||
|
}
|
||||||
|
return cal
|
||||||
}
|
}
|
||||||
|
|
|
@ -20,6 +20,7 @@ import org.ocpsoft.prettytime.units.Decade;
|
||||||
import org.schabi.newpipe.R;
|
import org.schabi.newpipe.R;
|
||||||
import org.schabi.newpipe.extractor.ListExtractor;
|
import org.schabi.newpipe.extractor.ListExtractor;
|
||||||
import org.schabi.newpipe.extractor.localization.ContentCountry;
|
import org.schabi.newpipe.extractor.localization.ContentCountry;
|
||||||
|
import org.schabi.newpipe.ktx.OffsetDateTimeKt;
|
||||||
|
|
||||||
import java.math.BigDecimal;
|
import java.math.BigDecimal;
|
||||||
import java.math.RoundingMode;
|
import java.math.RoundingMode;
|
||||||
|
@ -30,7 +31,6 @@ import java.time.format.DateTimeFormatter;
|
||||||
import java.time.format.FormatStyle;
|
import java.time.format.FormatStyle;
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
import java.util.Calendar;
|
import java.util.Calendar;
|
||||||
import java.util.GregorianCalendar;
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Locale;
|
import java.util.Locale;
|
||||||
|
|
||||||
|
@ -314,7 +314,7 @@ public final class Localization {
|
||||||
}
|
}
|
||||||
|
|
||||||
public static String relativeTime(final OffsetDateTime offsetDateTime) {
|
public static String relativeTime(final OffsetDateTime offsetDateTime) {
|
||||||
return relativeTime(GregorianCalendar.from(offsetDateTime.toZonedDateTime()));
|
return relativeTime(OffsetDateTimeKt.toCalendar(offsetDateTime));
|
||||||
}
|
}
|
||||||
|
|
||||||
public static String relativeTime(final Calendar calendarTime) {
|
public static String relativeTime(final Calendar calendarTime) {
|
||||||
|
|
|
@ -0,0 +1,31 @@
|
||||||
|
package org.schabi.newpipe.ktx
|
||||||
|
|
||||||
|
import org.junit.Assert.assertEquals
|
||||||
|
import org.junit.Test
|
||||||
|
import java.time.LocalDate
|
||||||
|
import java.time.OffsetDateTime
|
||||||
|
import java.time.ZoneId
|
||||||
|
import java.time.ZoneOffset
|
||||||
|
import java.util.Calendar
|
||||||
|
import java.util.TimeZone
|
||||||
|
|
||||||
|
class OffsetDateTimeToCalendarTest {
|
||||||
|
@Test
|
||||||
|
fun testRelativeTimeWithCurrentOffsetDateTime() {
|
||||||
|
val calendar = LocalDate.of(2020, 1, 1).atStartOfDay().atOffset(ZoneOffset.UTC)
|
||||||
|
.toCalendar()
|
||||||
|
|
||||||
|
assertEquals(2020, calendar[Calendar.YEAR])
|
||||||
|
assertEquals(0, calendar[Calendar.MONTH])
|
||||||
|
assertEquals(1, calendar[Calendar.DAY_OF_MONTH])
|
||||||
|
assertEquals(0, calendar[Calendar.HOUR])
|
||||||
|
assertEquals(0, calendar[Calendar.MINUTE])
|
||||||
|
assertEquals(0, calendar[Calendar.SECOND])
|
||||||
|
assertEquals(TimeZone.getTimeZone("UTC"), calendar.timeZone)
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test(expected = IllegalArgumentException::class)
|
||||||
|
fun testRelativeTimeWithFarOffOffsetDateTime() {
|
||||||
|
OffsetDateTime.MAX.minusYears(1).toCalendar()
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in a new issue