Compare commits
11 Commits
v123051321
...
v123061651
Author | SHA1 | Date | |
---|---|---|---|
50d0b44315 | |||
21b08ed384 | |||
993c4d2ee9 | |||
57a9d51027 | |||
673f0edb8b | |||
7f96798f13 | |||
6e5704a45b | |||
495591159f | |||
718fe7c5ee | |||
ecd23213f9 | |||
e6baed8cb4 |
23
CHANGELOG.md
23
CHANGELOG.md
@ -1,3 +1,26 @@
|
|||||||
|
**v123051471**
|
||||||
|
|
||||||
|
- fix: images could be null.
|
||||||
|
- fix: Check if color is not empty before parsing it.
|
||||||
|
- chore: Removed unused log.
|
||||||
|
- Changelog for v123051331 [CI SKIP]
|
||||||
|
|
||||||
|
--------------------------------------------------------------------
|
||||||
|
|
||||||
|
**v123051331**
|
||||||
|
|
||||||
|
- fix: illegal input.
|
||||||
|
- Changelog for v123051321 [CI SKIP]
|
||||||
|
|
||||||
|
--------------------------------------------------------------------
|
||||||
|
|
||||||
|
**v123051321**
|
||||||
|
|
||||||
|
- debug: Debug null context.
|
||||||
|
- Changelog for v123051301 [CI SKIP]
|
||||||
|
|
||||||
|
--------------------------------------------------------------------
|
||||||
|
|
||||||
**v123051301**
|
**v123051301**
|
||||||
|
|
||||||
- feat: Basic auth from url. Fixes #142 (#143)
|
- feat: Basic auth from url. Fixes #142 (#143)
|
||||||
|
@ -74,7 +74,6 @@ class ReaderActivity : AppCompatActivity(), DIAware {
|
|||||||
try {
|
try {
|
||||||
readItem(allItems[currentItem])
|
readItem(allItems[currentItem])
|
||||||
} catch (e: IndexOutOfBoundsException) {
|
} catch (e: IndexOutOfBoundsException) {
|
||||||
e.sendSilentlyWithAcraWithName("out of bound > size = ${allItems.size} currentItem = $currentItem")
|
|
||||||
finish()
|
finish()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -27,6 +27,7 @@ import bou.amine.apps.readerforselfossv2.android.model.toModel
|
|||||||
import bou.amine.apps.readerforselfossv2.android.model.toParcelable
|
import bou.amine.apps.readerforselfossv2.android.model.toParcelable
|
||||||
import bou.amine.apps.readerforselfossv2.android.sendSilentlyWithAcraWithName
|
import bou.amine.apps.readerforselfossv2.android.sendSilentlyWithAcraWithName
|
||||||
import bou.amine.apps.readerforselfossv2.android.utils.glide.getBitmapInputStream
|
import bou.amine.apps.readerforselfossv2.android.utils.glide.getBitmapInputStream
|
||||||
|
import bou.amine.apps.readerforselfossv2.android.utils.isUrlValid
|
||||||
import bou.amine.apps.readerforselfossv2.android.utils.openInBrowserAsNewTask
|
import bou.amine.apps.readerforselfossv2.android.utils.openInBrowserAsNewTask
|
||||||
import bou.amine.apps.readerforselfossv2.android.utils.shareLink
|
import bou.amine.apps.readerforselfossv2.android.utils.shareLink
|
||||||
import bou.amine.apps.readerforselfossv2.model.MercuryModel
|
import bou.amine.apps.readerforselfossv2.model.MercuryModel
|
||||||
@ -314,7 +315,7 @@ class ArticleFragment : Fragment(), DIAware {
|
|||||||
binding.webcontent.webViewClient = object : WebViewClient() {
|
binding.webcontent.webViewClient = object : WebViewClient() {
|
||||||
@Deprecated("Deprecated in Java")
|
@Deprecated("Deprecated in Java")
|
||||||
override fun shouldOverrideUrlLoading(view: WebView?, url: String): Boolean {
|
override fun shouldOverrideUrlLoading(view: WebView?, url: String): Boolean {
|
||||||
return if (context != null && binding.webcontent.hitTestResult.type != WebView.HitTestResult.SRC_IMAGE_ANCHOR_TYPE) {
|
return if (context != null && url.isUrlValid() && binding.webcontent.hitTestResult.type != WebView.HitTestResult.SRC_IMAGE_ANCHOR_TYPE) {
|
||||||
try {
|
try {
|
||||||
requireContext().startActivity(Intent(Intent.ACTION_VIEW, Uri.parse(url)))
|
requireContext().startActivity(Intent(Intent.ACTION_VIEW, Uri.parse(url)))
|
||||||
} catch (e: ActivityNotFoundException) {
|
} catch (e: ActivityNotFoundException) {
|
||||||
@ -553,8 +554,8 @@ class ArticleFragment : Fragment(), DIAware {
|
|||||||
}
|
}
|
||||||
|
|
||||||
fun performClick(): Boolean {
|
fun performClick(): Boolean {
|
||||||
if (binding.webcontent.hitTestResult.type == WebView.HitTestResult.IMAGE_TYPE ||
|
if (allImages != null && (binding.webcontent.hitTestResult.type == WebView.HitTestResult.IMAGE_TYPE ||
|
||||||
binding.webcontent.hitTestResult.type == WebView.HitTestResult.SRC_IMAGE_ANCHOR_TYPE
|
binding.webcontent.hitTestResult.type == WebView.HitTestResult.SRC_IMAGE_ANCHOR_TYPE)
|
||||||
) {
|
) {
|
||||||
|
|
||||||
val position: Int = allImages.indexOf(binding.webcontent.hitTestResult.extra)
|
val position: Int = allImages.indexOf(binding.webcontent.hitTestResult.extra)
|
||||||
|
@ -149,6 +149,7 @@ class FilterSheetFragment : BottomSheetDialogFragment(), DIAware {
|
|||||||
c.ellipsize = TextUtils.TruncateAt.END
|
c.ellipsize = TextUtils.TruncateAt.END
|
||||||
c.text = tag.tag
|
c.text = tag.tag
|
||||||
|
|
||||||
|
if (tag.color.isNotEmpty()) {
|
||||||
try {
|
try {
|
||||||
val gd = GradientDrawable()
|
val gd = GradientDrawable()
|
||||||
val gdColor = try {
|
val gdColor = try {
|
||||||
@ -165,6 +166,7 @@ class FilterSheetFragment : BottomSheetDialogFragment(), DIAware {
|
|||||||
} catch (e: Exception) {
|
} catch (e: Exception) {
|
||||||
e.sendSilentlyWithAcraWithName("tags > GradientDrawable")
|
e.sendSilentlyWithAcraWithName("tags > GradientDrawable")
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
c.setOnCloseIconClickListener {
|
c.setOnCloseIconClickListener {
|
||||||
(it as Chip).isCloseIconVisible = false
|
(it as Chip).isCloseIconVisible = false
|
||||||
|
@ -33,8 +33,8 @@
|
|||||||
<string name="addStringNoUrl">"Accede pra engadir fontes."</string>
|
<string name="addStringNoUrl">"Accede pra engadir fontes."</string>
|
||||||
<string name="cant_get_sources">"Non se pode obter a lista de fontes."</string>
|
<string name="cant_get_sources">"Non se pode obter a lista de fontes."</string>
|
||||||
<string name="cant_create_source">"Non se pode crear unha fonte."</string>
|
<string name="cant_create_source">"Non se pode crear unha fonte."</string>
|
||||||
<string name="cant_get_spouts_no_network">"Can't get spouts list because of a network issue."</string>
|
<string name="cant_get_spouts_no_network">"Non se pode obter a lista de spouts por mor dun erro de rede."</string>
|
||||||
<string name="cant_get_spouts">"Can't get spouts list. There may ben an api issue."</string>
|
<string name="cant_get_spouts">"Non se pode obter a lista de spoits. Pode que haxa algún problema coa api."</string>
|
||||||
<string name="form_not_complete">"O formulario non está completo"</string>
|
<string name="form_not_complete">"O formulario non está completo"</string>
|
||||||
<string name="pref_header_links">"Ligazóns"</string>
|
<string name="pref_header_links">"Ligazóns"</string>
|
||||||
<string name="issue_tracker_link">"Rastrexador de Incidencias"</string>
|
<string name="issue_tracker_link">"Rastrexador de Incidencias"</string>
|
||||||
@ -116,16 +116,16 @@
|
|||||||
<string name="reader_static_bar_on">A barra inferior mostrarase sempre</string>
|
<string name="reader_static_bar_on">A barra inferior mostrarase sempre</string>
|
||||||
<string name="reader_static_bar_off">A barra inferior pode mostrarse a través do botón flotante</string>
|
<string name="reader_static_bar_off">A barra inferior pode mostrarse a través do botón flotante</string>
|
||||||
<string name="remove_source">Eliminar fonte</string>
|
<string name="remove_source">Eliminar fonte</string>
|
||||||
<string name="pref_theme_title">Light/Dark mode</string>
|
<string name="pref_theme_title">Modo Claro/Escuro</string>
|
||||||
<string name="mode_dark">Dark mode</string>
|
<string name="mode_dark">Modo escuro</string>
|
||||||
<string name="mode_system">Follow the system setting</string>
|
<string name="mode_system">Seguir axustes do sistema</string>
|
||||||
<string name="mode_light">Light mode</string>
|
<string name="mode_light">Modo claro</string>
|
||||||
<string name="gdpr_dialog_title">The app does not share any personal data about you.</string>
|
<string name="gdpr_dialog_title">A aplicación non comparte ningún dato persoal seu.</string>
|
||||||
<string name="gdpr_dialog_message"><![CDATA[Crash reports sending is now enabled. It can be disabled from the settings page. Keep in mind that crash reports are essential for the app development.]]></string>
|
<string name="gdpr_dialog_message"><![CDATA[O envío de informes de erros está habilitado. Pode deshabilitarse dende a páxina de axustes. Ten en conta que os informes de erros son esenciais para o desenvolvemento da aplicación.]]></string>
|
||||||
<string name="crash_toast_text">A crash occured. Sending the details to the developper.</string>
|
<string name="crash_toast_text">Ocurriu un erro. Enviando os detalles o desenvolvedor.</string>
|
||||||
<string name="pref_switch_disable_acra">"Disable automatic bug reporting. "</string>
|
<string name="pref_switch_disable_acra">"Deshabilitar o reporte automático de erros. "</string>
|
||||||
<string name="menu_home_filter">Filters</string>
|
<string name="menu_home_filter">Filtros</string>
|
||||||
<string name="application_selfoss_only">This app only works with a Selfoss instance, and no other RSS feed.</string>
|
<string name="application_selfoss_only">Esta aplicación só funciona cunha instancia de Selfoss, e con ningún outro filtro RSS.</string>
|
||||||
<string name="menu_home_sources">Sources</string>
|
<string name="menu_home_sources">Sources</string>
|
||||||
<string name="update_source">Update source</string>
|
<string name="update_source">Update source</string>
|
||||||
</resources>
|
</resources>
|
||||||
|
@ -90,7 +90,7 @@
|
|||||||
<string name="pref_switch_items_caching">Save items for offline use</string>
|
<string name="pref_switch_items_caching">Save items for offline use</string>
|
||||||
<string name="pref_switch_update_sources">Check for new sources and tags</string>
|
<string name="pref_switch_update_sources">Check for new sources and tags</string>
|
||||||
<string name="pref_switch_update_sources_summary">Disable this if your server is receiving excessive amounts of database queries.</string>
|
<string name="pref_switch_update_sources_summary">Disable this if your server is receiving excessive amounts of database queries.</string>
|
||||||
<string name="network_connectivity_lost">"Network connection lost"</string>
|
<string name="network_connectivity_lost">"Koneksi jaringan hilang"</string>
|
||||||
<string name="network_connectivity_retrieved">"Network connection is now available"</string>
|
<string name="network_connectivity_retrieved">"Network connection is now available"</string>
|
||||||
<string name="pref_switch_periodic_refresh">Sync articles</string>
|
<string name="pref_switch_periodic_refresh">Sync articles</string>
|
||||||
<string name="pref_switch_periodic_refresh_off">Articles will not be synced in the background</string>
|
<string name="pref_switch_periodic_refresh_off">Articles will not be synced in the background</string>
|
||||||
|
@ -125,7 +125,7 @@
|
|||||||
<string name="crash_toast_text">发生崩溃。请将细节发送给开发人员。</string>
|
<string name="crash_toast_text">发生崩溃。请将细节发送给开发人员。</string>
|
||||||
<string name="pref_switch_disable_acra">"禁用自动错误报告 "</string>
|
<string name="pref_switch_disable_acra">"禁用自动错误报告 "</string>
|
||||||
<string name="menu_home_filter">筛选器</string>
|
<string name="menu_home_filter">筛选器</string>
|
||||||
<string name="application_selfoss_only">This app only works with a Selfoss instance, and no other RSS feed.</string>
|
<string name="application_selfoss_only">此应用只适用于 Selfoss 实例,不适用于其他 RSS 。</string>
|
||||||
<string name="menu_home_sources">Sources</string>
|
<string name="menu_home_sources">源</string>
|
||||||
<string name="update_source">Update source</string>
|
<string name="update_source">更新源</string>
|
||||||
</resources>
|
</resources>
|
||||||
|
@ -6,12 +6,12 @@ class MercuryModel {
|
|||||||
|
|
||||||
@Serializable
|
@Serializable
|
||||||
class ParsedContent(
|
class ParsedContent(
|
||||||
val title: String?,
|
val title: String? = null,
|
||||||
val content: String?,
|
val content: String? = null,
|
||||||
val lead_image_url: String?, // NOSONAR
|
val lead_image_url: String? = null, // NOSONAR
|
||||||
val url: String?,
|
val url: String? = null,
|
||||||
val error: Boolean?,
|
val error: Boolean? = null,
|
||||||
val message: String?,
|
val message: String? = null,
|
||||||
val failed: Boolean?
|
val failed: Boolean? = null
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
@ -24,8 +24,8 @@ class SelfossModel {
|
|||||||
@Serializable
|
@Serializable
|
||||||
class Stats(
|
class Stats(
|
||||||
val total: Int,
|
val total: Int,
|
||||||
val unread: Int?,
|
val unread: Int? = null,
|
||||||
val starred: Int?
|
val starred: Int? = null
|
||||||
)
|
)
|
||||||
|
|
||||||
@Serializable
|
@Serializable
|
||||||
@ -36,9 +36,9 @@ class SelfossModel {
|
|||||||
|
|
||||||
@Serializable
|
@Serializable
|
||||||
data class ApiInformation(
|
data class ApiInformation(
|
||||||
val version: String?,
|
val version: String? = null,
|
||||||
val apiversion: String?,
|
val apiversion: String? = null,
|
||||||
val configuration: ApiConfiguration?
|
val configuration: ApiConfiguration? = null
|
||||||
) {
|
) {
|
||||||
fun getApiMajorVersion(): Int {
|
fun getApiMajorVersion(): Int {
|
||||||
var versionNumber = 0
|
var versionNumber = 0
|
||||||
@ -54,9 +54,9 @@ class SelfossModel {
|
|||||||
@Serializable
|
@Serializable
|
||||||
data class ApiConfiguration(
|
data class ApiConfiguration(
|
||||||
@Serializable(with = BooleanSerializer::class)
|
@Serializable(with = BooleanSerializer::class)
|
||||||
val publicMode: Boolean?,
|
val publicMode: Boolean? = null,
|
||||||
@Serializable(with = BooleanSerializer::class)
|
@Serializable(with = BooleanSerializer::class)
|
||||||
val authEnabled: Boolean?
|
val authEnabled: Boolean? = null
|
||||||
) {
|
) {
|
||||||
fun isAuthEnabled() = authEnabled ?: true
|
fun isAuthEnabled() = authEnabled ?: true
|
||||||
|
|
||||||
@ -75,7 +75,7 @@ class SelfossModel {
|
|||||||
data class SourceStats(
|
data class SourceStats(
|
||||||
override val id: Int,
|
override val id: Int,
|
||||||
override var title: String,
|
override var title: String,
|
||||||
override var unread: Int?,
|
override var unread: Int? = null,
|
||||||
override var error: String? = null,
|
override var error: String? = null,
|
||||||
override var icon: String? = null
|
override var icon: String? = null
|
||||||
) : Source
|
) : Source
|
||||||
@ -86,11 +86,11 @@ class SelfossModel {
|
|||||||
override var title: String,
|
override var title: String,
|
||||||
override var unread: Int? = null,
|
override var unread: Int? = null,
|
||||||
@Serializable(with = TagsListSerializer::class)
|
@Serializable(with = TagsListSerializer::class)
|
||||||
var tags: List<String>?,
|
var tags: List<String>? = null,
|
||||||
var spout: String?,
|
var spout: String? = null,
|
||||||
override var error: String?,
|
override var error: String? = null,
|
||||||
override var icon: String?,
|
override var icon: String? = null,
|
||||||
var params: SourceParams?
|
var params: SourceParams? = null
|
||||||
) : Source
|
) : Source
|
||||||
|
|
||||||
@Serializable
|
@Serializable
|
||||||
@ -107,13 +107,13 @@ class SelfossModel {
|
|||||||
var unread: Boolean,
|
var unread: Boolean,
|
||||||
@Serializable(with = BooleanSerializer::class)
|
@Serializable(with = BooleanSerializer::class)
|
||||||
var starred: Boolean,
|
var starred: Boolean,
|
||||||
val thumbnail: String?,
|
val thumbnail: String? = null,
|
||||||
val icon: String?,
|
val icon: String? = null,
|
||||||
val link: String,
|
val link: String,
|
||||||
val sourcetitle: String,
|
val sourcetitle: String,
|
||||||
@Serializable(with = TagsListSerializer::class)
|
@Serializable(with = TagsListSerializer::class)
|
||||||
val tags: List<String>,
|
val tags: List<String>,
|
||||||
val author: String?
|
val author: String? = null
|
||||||
) {
|
) {
|
||||||
fun getLinkDecoded(): String {
|
fun getLinkDecoded(): String {
|
||||||
var stringUrl: String
|
var stringUrl: String
|
||||||
|
@ -36,6 +36,7 @@ class SelfossApi(private val appSettingsService: AppSettingsService) {
|
|||||||
prettyPrint = true
|
prettyPrint = true
|
||||||
isLenient = true
|
isLenient = true
|
||||||
ignoreUnknownKeys = true
|
ignoreUnknownKeys = true
|
||||||
|
explicitNulls = false
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
install(Logging) {
|
install(Logging) {
|
||||||
|
Reference in New Issue
Block a user