Compare commits

..

11 Commits

Author SHA1 Message Date
bc20a421ae Merge pull request 'fix: Link not opening.' (#178) from fix-open-link into master
All checks were successful
Check master code / build (push) Successful in 7m47s
Create tag / build (push) Successful in 7m14s
Create tag / createTagAndChangelog (push) Successful in 44s
Create tag / release (push) Successful in 5m13s
Reviewed-on: #178
2025-01-24 21:48:14 +00:00
794500355a refactor: context fragments issues.
All checks were successful
Check PR code / Lint (pull_request) Successful in 3m9s
Check PR code / build (pull_request) Successful in 12m15s
2025-01-24 21:44:20 +01:00
44f9dd53d3 logs: Context issues. 2025-01-24 21:10:01 +01:00
717d6b664c fix: Handle empty url issue, again. 2025-01-24 21:04:15 +01:00
e23289a3dc fix: Link not opening.
Some checks failed
Check PR code / Lint (pull_request) Failing after 7m7s
Check PR code / build (pull_request) Has been skipped
2025-01-24 20:56:04 +01:00
2f5ebe2420 Changelog for v125010201
All checks were successful
Check master code / build (push) Successful in 13m45s
2025-01-20 07:41:09 +00:00
1893904135 fix: Handle empty url issue.
All checks were successful
Check master code / build (push) Successful in 10m53s
Create tag / build (push) Successful in 7m40s
Create tag / createTagAndChangelog (push) Successful in 38s
Create tag / release (push) Successful in 5m3s
2025-01-19 14:49:37 +01:00
a4cb28ba81 Merge pull request 'Removed the floating bar.' (#177) from floating-bar into master
All checks were successful
Check master code / build (push) Successful in 11m40s
Reviewed-on: #177
2025-01-19 13:35:18 +00:00
ae3cada1c7 chore: changing actions in reader fragment.
All checks were successful
Check PR code / Lint (pull_request) Successful in 3m21s
Check PR code / build (pull_request) Successful in 11m38s
2025-01-19 12:54:25 +00:00
309500276f Changelog for v125010131
All checks were successful
Check master code / build (push) Successful in 8m58s
2025-01-13 16:19:05 +00:00
ce255b23cd fix: reload the adapter when it's needed. Fixes #128. (#176)
All checks were successful
Check master code / build (push) Successful in 10m27s
Create tag / build (push) Successful in 7m41s
Create tag / createTagAndChangelog (push) Successful in 48s
Create tag / release (push) Successful in 5m28s
## Types of changes

- [ ] I have read the **CONTRIBUTING** document.
- [ ] My code follows the code style of this project.
- [ ] I have updated the documentation accordingly.
- [ ] I have added tests to cover my changes.
- [ ] All new and existing tests passed.
- [ ] This is **NOT** translation related.

This closes issue #XXX

This is implements feature #YYY

This finishes chore #ZZZ

Reviewed-on: #176
Co-authored-by: Amine <amine.bouabdallaoui@pm.me>
Co-committed-by: Amine <amine.bouabdallaoui@pm.me>
2025-01-13 15:08:39 +00:00
9 changed files with 149 additions and 107 deletions

View File

@ -1,3 +1,20 @@
**v125010201
- fix: Handle empty url issue.
- Merge pull request 'Removed the floating bar.' (#177) from floating-bar into master
- chore: changing actions in reader fragment.
- Changelog for v125010131
--------------------------------------------------------------------
**v125010131
- fix: reload the adapter when it's needed. Fixes #128. (#176)
- feat: basic auth and images loading. Fixes #172. (#175)
- Changelog for v125010111
--------------------------------------------------------------------
**v125010111 **v125010111
- Debug trying to fix context issues. (#174) - Debug trying to fix context issues. (#174)

View File

@ -31,7 +31,7 @@ import bou.amine.apps.readerforselfossv2.android.settings.SettingsActivity
import bou.amine.apps.readerforselfossv2.android.testing.CountingIdlingResourceSingleton import bou.amine.apps.readerforselfossv2.android.testing.CountingIdlingResourceSingleton
import bou.amine.apps.readerforselfossv2.android.utils.bottombar.maybeShow import bou.amine.apps.readerforselfossv2.android.utils.bottombar.maybeShow
import bou.amine.apps.readerforselfossv2.android.utils.bottombar.removeBadge import bou.amine.apps.readerforselfossv2.android.utils.bottombar.removeBadge
import bou.amine.apps.readerforselfossv2.android.utils.openUrlInBrowser import bou.amine.apps.readerforselfossv2.android.utils.openUrlInBrowserAsNewTask
import bou.amine.apps.readerforselfossv2.model.SelfossModel import bou.amine.apps.readerforselfossv2.model.SelfossModel
import bou.amine.apps.readerforselfossv2.repository.Repository import bou.amine.apps.readerforselfossv2.repository.Repository
import bou.amine.apps.readerforselfossv2.service.AppSettingsService import bou.amine.apps.readerforselfossv2.service.AppSettingsService
@ -317,50 +317,44 @@ class HomeActivity :
private fun reloadLayoutManager() { private fun reloadLayoutManager() {
val currentManager = binding.recyclerView.layoutManager val currentManager = binding.recyclerView.layoutManager
val layoutManager: RecyclerView.LayoutManager
// This will only update the layout manager if settings changed fun gridLayoutManager() {
val layoutManager =
GridLayoutManager(
this,
calculateNoOfColumns(),
)
binding.recyclerView.layoutManager = layoutManager
}
fun staggererdGridLayoutManager() {
var layoutManager =
StaggeredGridLayoutManager(
calculateNoOfColumns(),
StaggeredGridLayoutManager.VERTICAL,
)
layoutManager.gapStrategy =
StaggeredGridLayoutManager.GAP_HANDLING_MOVE_ITEMS_BETWEEN_SPANS
binding.recyclerView.layoutManager = layoutManager
}
when (currentManager) { when (currentManager) {
is StaggeredGridLayoutManager -> is StaggeredGridLayoutManager ->
if (!appSettingsService.isCardViewEnabled()) { if (!appSettingsService.isCardViewEnabled()) {
layoutManager = gridLayoutManager()
GridLayoutManager(
this,
calculateNoOfColumns(),
)
binding.recyclerView.layoutManager = layoutManager
} }
is GridLayoutManager -> is GridLayoutManager ->
if (appSettingsService.isCardViewEnabled()) { if (appSettingsService.isCardViewEnabled()) {
layoutManager = staggererdGridLayoutManager()
StaggeredGridLayoutManager(
calculateNoOfColumns(),
StaggeredGridLayoutManager.VERTICAL,
)
layoutManager.gapStrategy =
StaggeredGridLayoutManager.GAP_HANDLING_MOVE_ITEMS_BETWEEN_SPANS
binding.recyclerView.layoutManager = layoutManager
} }
else -> else ->
if (currentManager == null) { if (currentManager == null) {
if (!appSettingsService.isCardViewEnabled()) { if (!appSettingsService.isCardViewEnabled()) {
layoutManager = gridLayoutManager()
GridLayoutManager(
this,
calculateNoOfColumns(),
)
binding.recyclerView.layoutManager = layoutManager
} else { } else {
layoutManager = staggererdGridLayoutManager()
StaggeredGridLayoutManager(
calculateNoOfColumns(),
StaggeredGridLayoutManager.VERTICAL,
)
layoutManager.gapStrategy =
StaggeredGridLayoutManager.GAP_HANDLING_MOVE_ITEMS_BETWEEN_SPANS
binding.recyclerView.layoutManager = layoutManager
} }
} }
} }
@ -485,8 +479,8 @@ class HomeActivity :
} }
private fun handleListResult(appendResults: Boolean = false) { private fun handleListResult(appendResults: Boolean = false) {
val oldManager = binding.recyclerView.layoutManager
if (appendResults) { if (appendResults) {
val oldManager = binding.recyclerView.layoutManager
firstVisible = firstVisible =
when (oldManager) { when (oldManager) {
is StaggeredGridLayoutManager -> is StaggeredGridLayoutManager ->
@ -499,7 +493,13 @@ class HomeActivity :
} }
} }
if (recyclerAdapter == null) { @Suppress("detekt:ComplexCondition")
if (recyclerAdapter == null ||
(
(recyclerAdapter is ItemListAdapter && appSettingsService.isCardViewEnabled()) ||
(recyclerAdapter is ItemCardAdapter && !appSettingsService.isCardViewEnabled())
)
) {
if (appSettingsService.isCardViewEnabled()) { if (appSettingsService.isCardViewEnabled()) {
recyclerAdapter = recyclerAdapter =
ItemCardAdapter( ItemCardAdapter(
@ -599,7 +599,7 @@ class HomeActivity :
override fun onOptionsItemSelected(item: MenuItem): Boolean { override fun onOptionsItemSelected(item: MenuItem): Boolean {
when (item.itemId) { when (item.itemId) {
R.id.issue_tracker -> { R.id.issue_tracker -> {
baseContext.openUrlInBrowser(AppSettingsService.BUG_URL) baseContext.openUrlInBrowserAsNewTask(AppSettingsService.BUG_URL)
return true return true
} }

View File

@ -33,8 +33,9 @@ import bou.amine.apps.readerforselfossv2.android.utils.glide.bitmapFitCenter
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.glide.getGlideImageForResource import bou.amine.apps.readerforselfossv2.android.utils.glide.getGlideImageForResource
import bou.amine.apps.readerforselfossv2.android.utils.isUrlValid import bou.amine.apps.readerforselfossv2.android.utils.isUrlValid
import bou.amine.apps.readerforselfossv2.android.utils.maybeIfContext
import bou.amine.apps.readerforselfossv2.android.utils.openItemUrlInBrowserAsNewTask import bou.amine.apps.readerforselfossv2.android.utils.openItemUrlInBrowserAsNewTask
import bou.amine.apps.readerforselfossv2.android.utils.openUrlInBrowser import bou.amine.apps.readerforselfossv2.android.utils.openUrlInBrowserAsNewTask
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
import bou.amine.apps.readerforselfossv2.model.SelfossModel import bou.amine.apps.readerforselfossv2.model.SelfossModel
@ -117,8 +118,8 @@ class ArticleFragment :
e.sendSilentlyWithAcra() e.sendSilentlyWithAcra()
} }
colorOnSurface = requireContext().getColorFromAttr(R.attr.colorOnSurface) colorOnSurface = getColorFromAttr(R.attr.colorOnSurface)
colorSurface = requireContext().getColorFromAttr(R.attr.colorSurface) colorSurface = getColorFromAttr(R.attr.colorSurface)
contentText = item.content contentText = item.content
contentTitle = item.title.getHtmlDecoded() contentTitle = item.title.getHtmlDecoded()
@ -147,11 +148,11 @@ class ArticleFragment :
handleContent() handleContent()
} catch (e: InflateException) { } catch (e: InflateException) {
e.sendSilentlyWithAcraWithName("webview not available") e.sendSilentlyWithAcraWithName("webview not available")
try { maybeIfContext {
AlertDialog AlertDialog
.Builder(requireContext()) .Builder(it)
.setMessage(requireContext().getString(R.string.webview_dialog_issue_message)) .setMessage(it.getString(R.string.webview_dialog_issue_message))
.setTitle(requireContext().getString(R.string.webview_dialog_issue_title)) .setTitle(it.getString(R.string.webview_dialog_issue_title))
.setPositiveButton( .setPositiveButton(
android.R.string.ok, android.R.string.ok,
) { _, _ -> ) { _, _ ->
@ -159,8 +160,6 @@ class ArticleFragment :
requireActivity().finish() requireActivity().finish()
}.create() }.create()
.show() .show()
} catch (e: IllegalStateException) {
e.sendSilentlyWithAcraWithName("Context required is null")
} }
} }
@ -182,7 +181,7 @@ class ArticleFragment :
if (!contentImage.isEmptyOrNullOrNullString() && context != null) { if (!contentImage.isEmptyOrNullOrNullString() && context != null) {
binding.imageView.visibility = View.VISIBLE binding.imageView.visibility = View.VISIBLE
requireContext().bitmapFitCenter(contentImage, binding.imageView, appSettingsService) maybeIfContext { it.bitmapFitCenter(contentImage, binding.imageView, appSettingsService) }
} else { } else {
binding.imageView.visibility = View.GONE binding.imageView.visibility = View.GONE
} }
@ -194,7 +193,7 @@ class ArticleFragment :
fab.mainFabClosedIconColor = colorOnSurface fab.mainFabClosedIconColor = colorOnSurface
fab.mainFabOpenedIconColor = colorOnSurface fab.mainFabOpenedIconColor = colorOnSurface
handleFloatingToolbarActionItems() maybeIfContext { context -> handleFloatingToolbarActionItems(context) }
fab.setOnActionSelectedListener { actionItem -> fab.setOnActionSelectedListener { actionItem ->
when (actionItem.id) { when (actionItem.id) {
@ -207,12 +206,14 @@ class ArticleFragment :
repository.markAsRead(this@ArticleFragment.item) repository.markAsRead(this@ArticleFragment.item)
} }
this@ArticleFragment.item.unread = false this@ArticleFragment.item.unread = false
Toast maybeIfContext {
.makeText( Toast
requireContext(), .makeText(
R.string.marked_as_read, it,
Toast.LENGTH_LONG, R.string.marked_as_read,
).show() Toast.LENGTH_LONG,
).show()
}
} else { } else {
CoroutineScope(Dispatchers.IO).launch { CoroutineScope(Dispatchers.IO).launch {
repository.unmarkAsRead(this@ArticleFragment.item) repository.unmarkAsRead(this@ArticleFragment.item)
@ -226,7 +227,7 @@ class ArticleFragment :
).show() ).show()
} }
} catch (e: IllegalStateException) { } catch (e: IllegalStateException) {
e.sendSilentlyWithAcraWithName("Context required is null") e.sendSilentlyWithAcraWithName("Toolbar context required is null")
} }
else -> Unit else -> Unit
@ -235,14 +236,14 @@ class ArticleFragment :
} }
} }
private fun handleFloatingToolbarActionItems() { private fun handleFloatingToolbarActionItems(c: Context) {
fab.addHomeMadeActionItem( fab.addHomeMadeActionItem(
R.id.share_action, R.id.share_action,
resources.getDrawable(R.drawable.ic_share_white_24dp), resources.getDrawable(R.drawable.ic_share_white_24dp),
R.string.reader_action_share, R.string.reader_action_share,
colorOnSurface, colorOnSurface,
colorSurface, colorSurface,
requireContext(), c,
) )
fab.addHomeMadeActionItem( fab.addHomeMadeActionItem(
R.id.open_action, R.id.open_action,
@ -250,7 +251,7 @@ class ArticleFragment :
R.string.reader_action_open, R.string.reader_action_open,
colorOnSurface, colorOnSurface,
colorSurface, colorSurface,
requireContext(), c,
) )
fab.addHomeMadeActionItem( fab.addHomeMadeActionItem(
R.id.unread_action, R.id.unread_action,
@ -258,7 +259,7 @@ class ArticleFragment :
R.string.unmark, R.string.unmark,
colorOnSurface, colorOnSurface,
colorSurface, colorSurface,
requireContext(), c,
) )
} }
@ -311,9 +312,11 @@ class ArticleFragment :
} }
private fun handleLeadImage(leadImageUrl: String?) { private fun handleLeadImage(leadImageUrl: String?) {
if (!leadImageUrl.isNullOrEmpty() && context != null) { if (!leadImageUrl.isNullOrEmpty()) {
binding.imageView.visibility = View.VISIBLE binding.imageView.visibility = View.VISIBLE
requireContext().bitmapFitCenter(leadImageUrl, binding.imageView, appSettingsService) maybeIfContext {
it.bitmapFitCenter(leadImageUrl, binding.imageView, appSettingsService)
}
} else { } else {
binding.imageView.visibility = View.GONE binding.imageView.visibility = View.GONE
} }
@ -327,11 +330,10 @@ class ArticleFragment :
view: WebView?, view: WebView?,
url: String, url: String,
): Boolean = ): Boolean =
if (context != null && if (url.isUrlValid() &&
url.isUrlValid() &&
binding.webcontent.hitTestResult.type != WebView.HitTestResult.SRC_IMAGE_ANCHOR_TYPE binding.webcontent.hitTestResult.type != WebView.HitTestResult.SRC_IMAGE_ANCHOR_TYPE
) { ) {
requireContext().openUrlInBrowser(url) maybeIfContext { it.openUrlInBrowserAsNewTask(url) }
true true
} else { } else {
false false
@ -374,23 +376,14 @@ class ArticleFragment :
@Suppress("detekt:LongMethod", "detekt:ImplicitDefaultLocale") @Suppress("detekt:LongMethod", "detekt:ImplicitDefaultLocale")
private fun htmlToWebview() { private fun htmlToWebview() {
val context: Context maybeIfContext {
try {
context = requireContext()
} catch (e: IllegalStateException) {
e.sendSilentlyWithAcraWithName("Context required is null")
return
}
try {
val attrs: IntArray = intArrayOf(android.R.attr.fontFamily) val attrs: IntArray = intArrayOf(android.R.attr.fontFamily)
val a: TypedArray = context.obtainStyledAttributes(resId, attrs) val a: TypedArray = it.obtainStyledAttributes(resId, attrs)
binding.webcontent.settings.standardFontFamily = a.getString(0) binding.webcontent.settings.standardFontFamily = a.getString(0)
binding.webcontent.visibility = View.VISIBLE ""
} catch (e: IllegalStateException) {
e.sendSilentlyWithAcraWithName("Context issue when setting attributes, but context wasn't null before")
} }
binding.webcontent.visibility = View.VISIBLE
val colorSurfaceString = val colorSurfaceString =
String.format( String.format(
@ -483,7 +476,7 @@ class ArticleFragment :
| color: ${ | color: ${
String.format( String.format(
"#%06X", "#%06X",
WHITE_COLOR_HEX and context.resources.getColor(R.color.colorAccent), WHITE_COLOR_HEX and (maybeIfContext { it.resources.getColor(R.color.colorAccent) } as Int),
) )
} !important; } !important;
| } | }
@ -540,10 +533,8 @@ class ArticleFragment :
private fun openInBrowserAfterFailing() { private fun openInBrowserAfterFailing() {
binding.progressBar.visibility = View.GONE binding.progressBar.visibility = View.GONE
try { maybeIfContext {
requireContext().openItemUrlInBrowserAsNewTask(this@ArticleFragment.item) it.openItemUrlInBrowserAsNewTask(this@ArticleFragment.item)
} catch (e: IllegalStateException) {
e.sendSilentlyWithAcraWithName("Context required is null")
} }
} }

View File

@ -1,6 +1,5 @@
package bou.amine.apps.readerforselfossv2.android.fragments package bou.amine.apps.readerforselfossv2.android.fragments
import android.content.Context
import android.graphics.Color import android.graphics.Color
import android.graphics.drawable.Drawable import android.graphics.drawable.Drawable
import android.graphics.drawable.GradientDrawable import android.graphics.drawable.GradientDrawable
@ -17,6 +16,7 @@ import bou.amine.apps.readerforselfossv2.android.R
import bou.amine.apps.readerforselfossv2.android.databinding.FilterFragmentBinding import bou.amine.apps.readerforselfossv2.android.databinding.FilterFragmentBinding
import bou.amine.apps.readerforselfossv2.android.utils.acra.sendSilentlyWithAcraWithName import bou.amine.apps.readerforselfossv2.android.utils.acra.sendSilentlyWithAcraWithName
import bou.amine.apps.readerforselfossv2.android.utils.glide.imageIntoViewTarget import bou.amine.apps.readerforselfossv2.android.utils.glide.imageIntoViewTarget
import bou.amine.apps.readerforselfossv2.android.utils.maybeIfContext
import bou.amine.apps.readerforselfossv2.repository.Repository import bou.amine.apps.readerforselfossv2.repository.Repository
import bou.amine.apps.readerforselfossv2.service.AppSettingsService import bou.amine.apps.readerforselfossv2.service.AppSettingsService
import bou.amine.apps.readerforselfossv2.utils.getColorHexCode import bou.amine.apps.readerforselfossv2.utils.getColorHexCode
@ -60,8 +60,8 @@ class FilterSheetFragment :
try { try {
CoroutineScope(Dispatchers.Main).launch { CoroutineScope(Dispatchers.Main).launch {
handleTagChips(requireContext()) handleTagChips()
handleSourceChips(requireContext()) handleSourceChips()
binding.progressBar2.visibility = GONE binding.progressBar2.visibility = GONE
binding.filterView.visibility = VISIBLE binding.filterView.visibility = VISIBLE
@ -79,29 +79,31 @@ class FilterSheetFragment :
return binding.root return binding.root
} }
private suspend fun handleSourceChips(context: Context) { private suspend fun handleSourceChips() {
val sourceGroup = binding.sourcesGroup val sourceGroup = binding.sourcesGroup
repository.getSourcesDetailsOrStats().forEachIndexed { _, source -> repository.getSourcesDetailsOrStats().forEachIndexed { _, source ->
val c = Chip(context) val c = Chip(context)
c.ellipsize = TextUtils.TruncateAt.END c.ellipsize = TextUtils.TruncateAt.END
context.imageIntoViewTarget( maybeIfContext {
source.getIcon(repository.baseUrl), it.imageIntoViewTarget(
object : ViewTarget<Chip?, Drawable?>(c) { source.getIcon(repository.baseUrl),
override fun onResourceReady( object : ViewTarget<Chip?, Drawable?>(c) {
resource: Drawable, override fun onResourceReady(
transition: Transition<in Drawable?>?, resource: Drawable,
) { transition: Transition<in Drawable?>?,
try { ) {
c.chipIcon = resource try {
} catch (e: Exception) { c.chipIcon = resource
e.sendSilentlyWithAcraWithName("sources > onResourceReady") } catch (e: Exception) {
e.sendSilentlyWithAcraWithName("sources > onResourceReady")
}
} }
} },
}, appSettingsService,
appSettingsService, )
) }
c.text = source.title.getHtmlDecoded() c.text = source.title.getHtmlDecoded()
@ -137,7 +139,7 @@ class FilterSheetFragment :
} }
} }
private suspend fun handleTagChips(context: Context) { private suspend fun handleTagChips() {
val tagGroup = binding.tagsGroup val tagGroup = binding.tagsGroup
val tags = repository.getTags() val tags = repository.getTags()

View File

@ -5,6 +5,7 @@ import android.content.Intent
import android.util.TypedValue import android.util.TypedValue
import androidx.annotation.AttrRes import androidx.annotation.AttrRes
import androidx.annotation.ColorInt import androidx.annotation.ColorInt
import androidx.fragment.app.Fragment
import bou.amine.apps.readerforselfossv2.android.R import bou.amine.apps.readerforselfossv2.android.R
import bou.amine.apps.readerforselfossv2.android.utils.acra.sendSilentlyWithAcraWithName import bou.amine.apps.readerforselfossv2.android.utils.acra.sendSilentlyWithAcraWithName
import bou.amine.apps.readerforselfossv2.utils.toStringUriWithHttp import bou.amine.apps.readerforselfossv2.utils.toStringUriWithHttp
@ -29,15 +30,30 @@ fun Context.shareLink(
} }
@ColorInt @ColorInt
fun Context.getColorFromAttr( fun Fragment.getColorFromAttr(
@AttrRes attrColor: Int, @AttrRes attrColor: Int,
resolveRefs: Boolean = true, resolveRefs: Boolean = true,
): Int { ): Int {
val typedValue = TypedValue() val typedValue = TypedValue()
try { maybeIfContextWithLog { this.requireContext().theme.resolveAttribute(attrColor, typedValue, resolveRefs) }
this.theme.resolveAttribute(attrColor, typedValue, resolveRefs)
} catch (e: Throwable) {
e.sendSilentlyWithAcraWithName("ColorFromAttr")
}
return typedValue.data return typedValue.data
} }
@Suppress("detekt:SwallowedException")
fun Fragment.maybeIfContext(fn: (Context) -> Any): Any? {
try {
return fn(this.requireContext())
} catch (e: Exception) {
// Do nothing
return null
}
}
fun Fragment.maybeIfContextWithLog(fn: (Context) -> Any): Any? {
try {
return fn(this.requireContext())
} catch (e: Exception) {
e.sendSilentlyWithAcraWithName("Fragment context issue...")
return null
}
}

View File

@ -7,6 +7,7 @@ import android.webkit.WebView
import android.widget.ImageView import android.widget.ImageView
import bou.amine.apps.readerforselfossv2.android.utils.CircleImageView import bou.amine.apps.readerforselfossv2.android.utils.CircleImageView
import bou.amine.apps.readerforselfossv2.service.AppSettingsService import bou.amine.apps.readerforselfossv2.service.AppSettingsService
import bou.amine.apps.readerforselfossv2.utils.isEmptyOrNullOrNullString
import com.bumptech.glide.Glide import com.bumptech.glide.Glide
import com.bumptech.glide.load.engine.DiskCacheStrategy import com.bumptech.glide.load.engine.DiskCacheStrategy
import com.bumptech.glide.load.model.GlideUrl import com.bumptech.glide.load.model.GlideUrl
@ -22,8 +23,12 @@ import kotlin.io.encoding.ExperimentalEncodingApi
private const val PRELOAD_IMAGE_TIMEOUT = 10000 private const val PRELOAD_IMAGE_TIMEOUT = 10000
@Suppress("detekt:ReturnCount")
@OptIn(ExperimentalEncodingApi::class) @OptIn(ExperimentalEncodingApi::class)
fun String.toGlideUrl(appSettingsService: AppSettingsService): GlideUrl { fun String.toGlideUrl(appSettingsService: AppSettingsService): Any { // GlideUrl Or String
if (this.isEmptyOrNullOrNullString()) {
return ""
}
if (appSettingsService.getBasicUserName().isNotEmpty()) { if (appSettingsService.getBasicUserName().isNotEmpty()) {
val authString = "${appSettingsService.getBasicUserName()}:${appSettingsService.getBasicPassword()}" val authString = "${appSettingsService.getBasicUserName()}:${appSettingsService.getBasicPassword()}"
val authBuf = Base64.encode(authString.toByteArray(Charsets.UTF_8)) val authBuf = Base64.encode(authString.toByteArray(Charsets.UTF_8))

View File

@ -23,6 +23,7 @@
<string name="wrong_infos">"Controleer de gegevens nogmaals."</string> <string name="wrong_infos">"Controleer de gegevens nogmaals."</string>
<string name="all_posts_not_read">"Fout bij markeren als gelezen"</string> <string name="all_posts_not_read">"Fout bij markeren als gelezen"</string>
<string name="all_posts_read">"Alle artikelen gemarkeerd als gelezen"</string> <string name="all_posts_read">"Alle artikelen gemarkeerd als gelezen"</string>
<string name="undo_string">"Ongedaan maken"</string>
<string name="addStringNoUrl">"Login om bronnen toe te voegen"</string> <string name="addStringNoUrl">"Login om bronnen toe te voegen"</string>
<string name="cant_get_sources">"Kan de lijst met bronnen niet ophalen"</string> <string name="cant_get_sources">"Kan de lijst met bronnen niet ophalen"</string>
<string name="cant_create_source">"Kan bron niet creëeren"</string> <string name="cant_create_source">"Kan bron niet creëeren"</string>
@ -128,5 +129,4 @@
<string name="action_about">"Over"</string> <string name="action_about">"Over"</string>
<string name="marked_as_read">"Artikel gelezen"</string> <string name="marked_as_read">"Artikel gelezen"</string>
<string name="marked_as_unread">"Item unread"</string> <string name="marked_as_unread">"Item unread"</string>
<string name="undo_string">"Ongedaan maken"</string>
</resources> </resources>

View File

@ -0,0 +1,5 @@
**v125010131**
- fix: reload the adapter when it's needed. Fixes #128. (#176)
- feat: basic auth and images loading. Fixes #172. (#175)
- Changelog for v125010111

View File

@ -0,0 +1,6 @@
**v125010201**
- fix: Handle empty url issue.
- Merge pull request 'Removed the floating bar.' (#177) from floating-bar into master
- chore: changing actions in reader fragment.
- Changelog for v125010131