Compare commits
No commits in common. "master" and "v124030731" have entirely different histories.
master
...
v124030731
15
CHANGELOG.md
15
CHANGELOG.md
@ -1,18 +1,3 @@
|
|||||||
**v124041081**
|
|
||||||
|
|
||||||
- chore: comment.
|
|
||||||
- fix: Last time fixing the parsing date hack before moving it to os version.
|
|
||||||
- Changelog for v124030731 [CI SKIP]
|
|
||||||
|
|
||||||
--------------------------------------------------------------------
|
|
||||||
|
|
||||||
**v124030731**
|
|
||||||
|
|
||||||
- fix: Basic auth and password can have non whitspace characters. Fixes 142.
|
|
||||||
- Changelog for v124020451 [CI SKIP]
|
|
||||||
|
|
||||||
--------------------------------------------------------------------
|
|
||||||
|
|
||||||
**v124020451**
|
**v124020451**
|
||||||
|
|
||||||
- fix: Fixed handling of position in card adapter.
|
- fix: Fixed handling of position in card adapter.
|
||||||
|
@ -9,7 +9,6 @@ import android.widget.ImageView.ScaleType
|
|||||||
import androidx.recyclerview.widget.RecyclerView
|
import androidx.recyclerview.widget.RecyclerView
|
||||||
import bou.amine.apps.readerforselfossv2.android.R
|
import bou.amine.apps.readerforselfossv2.android.R
|
||||||
import bou.amine.apps.readerforselfossv2.android.databinding.CardItemBinding
|
import bou.amine.apps.readerforselfossv2.android.databinding.CardItemBinding
|
||||||
import bou.amine.apps.readerforselfossv2.android.sendSilentlyWithAcraWithName
|
|
||||||
import bou.amine.apps.readerforselfossv2.android.utils.LinkOnTouchListener
|
import bou.amine.apps.readerforselfossv2.android.utils.LinkOnTouchListener
|
||||||
import bou.amine.apps.readerforselfossv2.android.utils.glide.bitmapCenterCrop
|
import bou.amine.apps.readerforselfossv2.android.utils.glide.bitmapCenterCrop
|
||||||
import bou.amine.apps.readerforselfossv2.android.utils.glide.circularDrawable
|
import bou.amine.apps.readerforselfossv2.android.utils.glide.circularDrawable
|
||||||
@ -111,12 +110,7 @@ class ItemCardAdapter(
|
|||||||
|
|
||||||
binding.title.setLinkTextColor(c.resources.getColor(R.color.colorAccent))
|
binding.title.setLinkTextColor(c.resources.getColor(R.color.colorAccent))
|
||||||
|
|
||||||
binding.sourceTitleAndDate.text = try {
|
binding.sourceTitleAndDate.text = itm.sourceAuthorAndDate()
|
||||||
itm.sourceAuthorAndDate()
|
|
||||||
} catch (e: Exception) {
|
|
||||||
e.sendSilentlyWithAcraWithName("ItemCardAdapter parse date")
|
|
||||||
itm.sourceAuthorOnly()
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!appSettingsService.isFullHeightCardsEnabled()) {
|
if (!appSettingsService.isFullHeightCardsEnabled()) {
|
||||||
binding.itemImage.maxHeight = imageMaxHeight
|
binding.itemImage.maxHeight = imageMaxHeight
|
||||||
|
@ -7,7 +7,6 @@ import android.view.ViewGroup
|
|||||||
import androidx.recyclerview.widget.RecyclerView
|
import androidx.recyclerview.widget.RecyclerView
|
||||||
import bou.amine.apps.readerforselfossv2.android.R
|
import bou.amine.apps.readerforselfossv2.android.R
|
||||||
import bou.amine.apps.readerforselfossv2.android.databinding.ListItemBinding
|
import bou.amine.apps.readerforselfossv2.android.databinding.ListItemBinding
|
||||||
import bou.amine.apps.readerforselfossv2.android.sendSilentlyWithAcraWithName
|
|
||||||
import bou.amine.apps.readerforselfossv2.android.utils.LinkOnTouchListener
|
import bou.amine.apps.readerforselfossv2.android.utils.LinkOnTouchListener
|
||||||
import bou.amine.apps.readerforselfossv2.android.utils.glide.circularDrawable
|
import bou.amine.apps.readerforselfossv2.android.utils.glide.circularDrawable
|
||||||
import bou.amine.apps.readerforselfossv2.android.utils.openItemUrl
|
import bou.amine.apps.readerforselfossv2.android.utils.openItemUrl
|
||||||
@ -64,12 +63,7 @@ class ItemListAdapter(
|
|||||||
|
|
||||||
binding.title.setLinkTextColor(c.resources.getColor(R.color.colorAccent))
|
binding.title.setLinkTextColor(c.resources.getColor(R.color.colorAccent))
|
||||||
|
|
||||||
binding.sourceTitleAndDate.text = try {
|
binding.sourceTitleAndDate.text = itm.sourceAuthorAndDate()
|
||||||
itm.sourceAuthorAndDate()
|
|
||||||
} catch (e: Exception) {
|
|
||||||
e.sendSilentlyWithAcraWithName("ItemListAdapter parse date")
|
|
||||||
itm.sourceAuthorOnly()
|
|
||||||
}
|
|
||||||
|
|
||||||
if (itm.getThumbnail(repository.baseUrl).isEmpty()) {
|
if (itm.getThumbnail(repository.baseUrl).isEmpty()) {
|
||||||
if (itm.getIcon(repository.baseUrl).isEmpty()) {
|
if (itm.getIcon(repository.baseUrl).isEmpty()) {
|
||||||
|
@ -102,12 +102,7 @@ class ArticleFragment : Fragment(), DIAware {
|
|||||||
contentText = item.content
|
contentText = item.content
|
||||||
contentTitle = item.title.getHtmlDecoded()
|
contentTitle = item.title.getHtmlDecoded()
|
||||||
contentImage = item.getThumbnail(repository.baseUrl)
|
contentImage = item.getThumbnail(repository.baseUrl)
|
||||||
contentSource = try {
|
contentSource = item.sourceAuthorAndDate()
|
||||||
item.sourceAuthorAndDate()
|
|
||||||
} catch (e: Exception) {
|
|
||||||
e.sendSilentlyWithAcraWithName("Article Fragment parse date")
|
|
||||||
item.sourceAuthorOnly()
|
|
||||||
}
|
|
||||||
allImages = item.getImages()
|
allImages = item.getImages()
|
||||||
|
|
||||||
fontSize = appSettingsService.getFontSize()
|
fontSize = appSettingsService.getFontSize()
|
||||||
|
@ -10,10 +10,10 @@ import org.junit.Test
|
|||||||
class DatesTest {
|
class DatesTest {
|
||||||
private val newVersionDateVariant = "2022-12-24T17:00:08+00"
|
private val newVersionDateVariant = "2022-12-24T17:00:08+00"
|
||||||
private val newVersionDate = "2013-04-07T13:43:00+01:00"
|
private val newVersionDate = "2013-04-07T13:43:00+01:00"
|
||||||
private val newVersionDate2 = "2013-04-07T13:43:00-01:00"
|
|
||||||
private val oldVersionDate = "2013-05-07 13:46:00"
|
private val oldVersionDate = "2013-05-07 13:46:00"
|
||||||
private val oldVersionDateVariant = "2021-03-21 10:32:00.000000"
|
private val oldVersionDateVariant = "2021-03-21 10:32:00.000000"
|
||||||
|
|
||||||
|
private val bugVersionDate = "2023-12-19T10:30:53-05:00"
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
fun new_version_date_should_be_parsed() {
|
fun new_version_date_should_be_parsed() {
|
||||||
@ -24,15 +24,6 @@ class DatesTest {
|
|||||||
|
|
||||||
assertEquals(expected, date)
|
assertEquals(expected, date)
|
||||||
}
|
}
|
||||||
@Test
|
|
||||||
fun new_version_date2_should_be_parsed() {
|
|
||||||
val date = DateUtils.parseDate(newVersionDate2)
|
|
||||||
val expected =
|
|
||||||
LocalDateTime(2013, 4, 7, 13, 43, 0, 0).toInstant(TimeZone.currentSystemDefault())
|
|
||||||
.toEpochMilliseconds()
|
|
||||||
|
|
||||||
assertEquals(expected, date)
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
fun old_version_date_should_be_parsed() {
|
fun old_version_date_should_be_parsed() {
|
||||||
@ -63,4 +54,14 @@ class DatesTest {
|
|||||||
|
|
||||||
assertEquals(expected, date)
|
assertEquals(expected, date)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun bug_version_variant_date_should_be_parsed() {
|
||||||
|
val date = DateUtils.parseDate(bugVersionDate)
|
||||||
|
val expected =
|
||||||
|
LocalDateTime(1991, 3, 18, 3, 0, 0, 0).toInstant(TimeZone.currentSystemDefault())
|
||||||
|
.toEpochMilliseconds()
|
||||||
|
|
||||||
|
assertEquals(expected, date)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -11,21 +11,23 @@ actual class DateUtils {
|
|||||||
private val oldVersionFormat = "\\d{4}-\\d{2}-\\d{2} \\d{2}:\\d{2}:\\d{2}(.()\\d*)?".toRegex()
|
private val oldVersionFormat = "\\d{4}-\\d{2}-\\d{2} \\d{2}:\\d{2}:\\d{2}(.()\\d*)?".toRegex()
|
||||||
|
|
||||||
// yyyy-MM-dd'T'HH:mm:ss[.SSS]XXX (RFC3339)
|
// yyyy-MM-dd'T'HH:mm:ss[.SSS]XXX (RFC3339)
|
||||||
private val newVersionFormat = "(\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2})[+-](\\d{2}(:\\d{2})?)?".toRegex()
|
private val newVersionFormat = "\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}\\+\\d{2}(:\\d{2})?".toRegex()
|
||||||
|
|
||||||
// TODO: do not fix any more issues here. Move everything to plateform specific code.
|
// We may need to consider moving the formatting to platform specific code, even if the tests are doubled
|
||||||
|
// For now, we handle this in a hacky way, because kotlin only accepts iso formats
|
||||||
actual fun parseDate(dateString: String): Long {
|
actual fun parseDate(dateString: String): Long {
|
||||||
var isoDateString: String =
|
var isoDateString: String =
|
||||||
try {
|
try {
|
||||||
if (dateString.matches(oldVersionFormat)) {
|
if (dateString.matches(oldVersionFormat)) {
|
||||||
dateString.replace(" ", "T")
|
dateString.replace(" ", "T")
|
||||||
} else if (dateString.matches(newVersionFormat)) {
|
} else if (dateString.matches(newVersionFormat)) {
|
||||||
newVersionFormat.find(dateString)?.groups?.get(1)?.value ?: throw Exception("Couldn't parse $dateString")
|
dateString.split("+")[0]
|
||||||
} else {
|
} else {
|
||||||
throw Exception("Unrecognized format for $dateString")
|
throw Exception("Unrecognized format for $dateString")
|
||||||
}
|
}
|
||||||
} catch (e: Exception) {
|
} catch (e: Exception) {
|
||||||
throw Exception("parseDate failed for $dateString", e)
|
Napier.e("parseDate failed", e, tag = "DateUtils.parseDate")
|
||||||
|
"1991-03-18T03:00:00"
|
||||||
}
|
}
|
||||||
|
|
||||||
return LocalDateTime.parse(isoDateString).toInstant(TimeZone.currentSystemDefault()).toEpochMilliseconds()
|
return LocalDateTime.parse(isoDateString).toInstant(TimeZone.currentSystemDefault()).toEpochMilliseconds()
|
||||||
|
@ -146,14 +146,6 @@ class SelfossModel {
|
|||||||
return txt
|
return txt
|
||||||
}
|
}
|
||||||
|
|
||||||
fun sourceAuthorOnly(): String {
|
|
||||||
var txt = this.sourcetitle.getHtmlDecoded()
|
|
||||||
if (!this.author.isNullOrBlank()) {
|
|
||||||
txt += " (by ${this.author}) "
|
|
||||||
}
|
|
||||||
return txt
|
|
||||||
}
|
|
||||||
|
|
||||||
fun toggleStar(): Item {
|
fun toggleStar(): Item {
|
||||||
this.starred = !this.starred
|
this.starred = !this.starred
|
||||||
return this
|
return this
|
||||||
|
Loading…
Reference in New Issue
Block a user