Compare commits
No commits in common. "794500355ac9f242060c65a40bbaf1829425fd88" and "e23289a3dca16187b47afb272932d2c6eae1a719" have entirely different histories.
794500355a
...
e23289a3dc
@ -33,7 +33,6 @@ 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.openUrlInBrowserAsNewTask
|
import bou.amine.apps.readerforselfossv2.android.utils.openUrlInBrowserAsNewTask
|
||||||
import bou.amine.apps.readerforselfossv2.android.utils.shareLink
|
import bou.amine.apps.readerforselfossv2.android.utils.shareLink
|
||||||
@ -118,8 +117,8 @@ class ArticleFragment :
|
|||||||
e.sendSilentlyWithAcra()
|
e.sendSilentlyWithAcra()
|
||||||
}
|
}
|
||||||
|
|
||||||
colorOnSurface = getColorFromAttr(R.attr.colorOnSurface)
|
colorOnSurface = requireContext().getColorFromAttr(R.attr.colorOnSurface)
|
||||||
colorSurface = getColorFromAttr(R.attr.colorSurface)
|
colorSurface = requireContext().getColorFromAttr(R.attr.colorSurface)
|
||||||
|
|
||||||
contentText = item.content
|
contentText = item.content
|
||||||
contentTitle = item.title.getHtmlDecoded()
|
contentTitle = item.title.getHtmlDecoded()
|
||||||
@ -148,11 +147,11 @@ class ArticleFragment :
|
|||||||
handleContent()
|
handleContent()
|
||||||
} catch (e: InflateException) {
|
} catch (e: InflateException) {
|
||||||
e.sendSilentlyWithAcraWithName("webview not available")
|
e.sendSilentlyWithAcraWithName("webview not available")
|
||||||
maybeIfContext {
|
try {
|
||||||
AlertDialog
|
AlertDialog
|
||||||
.Builder(it)
|
.Builder(requireContext())
|
||||||
.setMessage(it.getString(R.string.webview_dialog_issue_message))
|
.setMessage(requireContext().getString(R.string.webview_dialog_issue_message))
|
||||||
.setTitle(it.getString(R.string.webview_dialog_issue_title))
|
.setTitle(requireContext().getString(R.string.webview_dialog_issue_title))
|
||||||
.setPositiveButton(
|
.setPositiveButton(
|
||||||
android.R.string.ok,
|
android.R.string.ok,
|
||||||
) { _, _ ->
|
) { _, _ ->
|
||||||
@ -160,6 +159,8 @@ class ArticleFragment :
|
|||||||
requireActivity().finish()
|
requireActivity().finish()
|
||||||
}.create()
|
}.create()
|
||||||
.show()
|
.show()
|
||||||
|
} catch (e: IllegalStateException) {
|
||||||
|
e.sendSilentlyWithAcraWithName("Context required is null")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -181,7 +182,7 @@ class ArticleFragment :
|
|||||||
|
|
||||||
if (!contentImage.isEmptyOrNullOrNullString() && context != null) {
|
if (!contentImage.isEmptyOrNullOrNullString() && context != null) {
|
||||||
binding.imageView.visibility = View.VISIBLE
|
binding.imageView.visibility = View.VISIBLE
|
||||||
maybeIfContext { it.bitmapFitCenter(contentImage, binding.imageView, appSettingsService) }
|
requireContext().bitmapFitCenter(contentImage, binding.imageView, appSettingsService)
|
||||||
} else {
|
} else {
|
||||||
binding.imageView.visibility = View.GONE
|
binding.imageView.visibility = View.GONE
|
||||||
}
|
}
|
||||||
@ -193,7 +194,7 @@ class ArticleFragment :
|
|||||||
fab.mainFabClosedIconColor = colorOnSurface
|
fab.mainFabClosedIconColor = colorOnSurface
|
||||||
fab.mainFabOpenedIconColor = colorOnSurface
|
fab.mainFabOpenedIconColor = colorOnSurface
|
||||||
|
|
||||||
maybeIfContext { context -> handleFloatingToolbarActionItems(context) }
|
handleFloatingToolbarActionItems()
|
||||||
|
|
||||||
fab.setOnActionSelectedListener { actionItem ->
|
fab.setOnActionSelectedListener { actionItem ->
|
||||||
when (actionItem.id) {
|
when (actionItem.id) {
|
||||||
@ -206,14 +207,12 @@ class ArticleFragment :
|
|||||||
repository.markAsRead(this@ArticleFragment.item)
|
repository.markAsRead(this@ArticleFragment.item)
|
||||||
}
|
}
|
||||||
this@ArticleFragment.item.unread = false
|
this@ArticleFragment.item.unread = false
|
||||||
maybeIfContext {
|
|
||||||
Toast
|
Toast
|
||||||
.makeText(
|
.makeText(
|
||||||
it,
|
requireContext(),
|
||||||
R.string.marked_as_read,
|
R.string.marked_as_read,
|
||||||
Toast.LENGTH_LONG,
|
Toast.LENGTH_LONG,
|
||||||
).show()
|
).show()
|
||||||
}
|
|
||||||
} else {
|
} else {
|
||||||
CoroutineScope(Dispatchers.IO).launch {
|
CoroutineScope(Dispatchers.IO).launch {
|
||||||
repository.unmarkAsRead(this@ArticleFragment.item)
|
repository.unmarkAsRead(this@ArticleFragment.item)
|
||||||
@ -227,7 +226,7 @@ class ArticleFragment :
|
|||||||
).show()
|
).show()
|
||||||
}
|
}
|
||||||
} catch (e: IllegalStateException) {
|
} catch (e: IllegalStateException) {
|
||||||
e.sendSilentlyWithAcraWithName("Toolbar context required is null")
|
e.sendSilentlyWithAcraWithName("Context required is null")
|
||||||
}
|
}
|
||||||
|
|
||||||
else -> Unit
|
else -> Unit
|
||||||
@ -236,14 +235,14 @@ class ArticleFragment :
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun handleFloatingToolbarActionItems(c: Context) {
|
private fun handleFloatingToolbarActionItems() {
|
||||||
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,
|
||||||
c,
|
requireContext(),
|
||||||
)
|
)
|
||||||
fab.addHomeMadeActionItem(
|
fab.addHomeMadeActionItem(
|
||||||
R.id.open_action,
|
R.id.open_action,
|
||||||
@ -251,7 +250,7 @@ class ArticleFragment :
|
|||||||
R.string.reader_action_open,
|
R.string.reader_action_open,
|
||||||
colorOnSurface,
|
colorOnSurface,
|
||||||
colorSurface,
|
colorSurface,
|
||||||
c,
|
requireContext(),
|
||||||
)
|
)
|
||||||
fab.addHomeMadeActionItem(
|
fab.addHomeMadeActionItem(
|
||||||
R.id.unread_action,
|
R.id.unread_action,
|
||||||
@ -259,7 +258,7 @@ class ArticleFragment :
|
|||||||
R.string.unmark,
|
R.string.unmark,
|
||||||
colorOnSurface,
|
colorOnSurface,
|
||||||
colorSurface,
|
colorSurface,
|
||||||
c,
|
requireContext(),
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -312,11 +311,9 @@ class ArticleFragment :
|
|||||||
}
|
}
|
||||||
|
|
||||||
private fun handleLeadImage(leadImageUrl: String?) {
|
private fun handleLeadImage(leadImageUrl: String?) {
|
||||||
if (!leadImageUrl.isNullOrEmpty()) {
|
if (!leadImageUrl.isNullOrEmpty() && context != null) {
|
||||||
binding.imageView.visibility = View.VISIBLE
|
binding.imageView.visibility = View.VISIBLE
|
||||||
maybeIfContext {
|
requireContext().bitmapFitCenter(leadImageUrl, binding.imageView, appSettingsService)
|
||||||
it.bitmapFitCenter(leadImageUrl, binding.imageView, appSettingsService)
|
|
||||||
}
|
|
||||||
} else {
|
} else {
|
||||||
binding.imageView.visibility = View.GONE
|
binding.imageView.visibility = View.GONE
|
||||||
}
|
}
|
||||||
@ -330,10 +327,11 @@ class ArticleFragment :
|
|||||||
view: WebView?,
|
view: WebView?,
|
||||||
url: String,
|
url: String,
|
||||||
): Boolean =
|
): Boolean =
|
||||||
if (url.isUrlValid() &&
|
if (context != null &&
|
||||||
|
url.isUrlValid() &&
|
||||||
binding.webcontent.hitTestResult.type != WebView.HitTestResult.SRC_IMAGE_ANCHOR_TYPE
|
binding.webcontent.hitTestResult.type != WebView.HitTestResult.SRC_IMAGE_ANCHOR_TYPE
|
||||||
) {
|
) {
|
||||||
maybeIfContext { it.openUrlInBrowserAsNewTask(url) }
|
requireContext().openUrlInBrowserAsNewTask(url)
|
||||||
true
|
true
|
||||||
} else {
|
} else {
|
||||||
false
|
false
|
||||||
@ -376,14 +374,23 @@ class ArticleFragment :
|
|||||||
|
|
||||||
@Suppress("detekt:LongMethod", "detekt:ImplicitDefaultLocale")
|
@Suppress("detekt:LongMethod", "detekt:ImplicitDefaultLocale")
|
||||||
private fun htmlToWebview() {
|
private fun htmlToWebview() {
|
||||||
maybeIfContext {
|
val context: Context
|
||||||
|
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 = it.obtainStyledAttributes(resId, attrs)
|
val a: TypedArray = context.obtainStyledAttributes(resId, attrs)
|
||||||
|
|
||||||
binding.webcontent.settings.standardFontFamily = a.getString(0)
|
binding.webcontent.settings.standardFontFamily = a.getString(0)
|
||||||
""
|
|
||||||
}
|
|
||||||
binding.webcontent.visibility = View.VISIBLE
|
binding.webcontent.visibility = View.VISIBLE
|
||||||
|
} catch (e: IllegalStateException) {
|
||||||
|
e.sendSilentlyWithAcraWithName("Context issue when setting attributes, but context wasn't null before")
|
||||||
|
}
|
||||||
|
|
||||||
val colorSurfaceString =
|
val colorSurfaceString =
|
||||||
String.format(
|
String.format(
|
||||||
@ -476,7 +483,7 @@ class ArticleFragment :
|
|||||||
| color: ${
|
| color: ${
|
||||||
String.format(
|
String.format(
|
||||||
"#%06X",
|
"#%06X",
|
||||||
WHITE_COLOR_HEX and (maybeIfContext { it.resources.getColor(R.color.colorAccent) } as Int),
|
WHITE_COLOR_HEX and context.resources.getColor(R.color.colorAccent),
|
||||||
)
|
)
|
||||||
} !important;
|
} !important;
|
||||||
| }
|
| }
|
||||||
@ -533,8 +540,10 @@ class ArticleFragment :
|
|||||||
|
|
||||||
private fun openInBrowserAfterFailing() {
|
private fun openInBrowserAfterFailing() {
|
||||||
binding.progressBar.visibility = View.GONE
|
binding.progressBar.visibility = View.GONE
|
||||||
maybeIfContext {
|
try {
|
||||||
it.openItemUrlInBrowserAsNewTask(this@ArticleFragment.item)
|
requireContext().openItemUrlInBrowserAsNewTask(this@ArticleFragment.item)
|
||||||
|
} catch (e: IllegalStateException) {
|
||||||
|
e.sendSilentlyWithAcraWithName("Context required is null")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
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
|
||||||
@ -16,7 +17,6 @@ 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()
|
handleTagChips(requireContext())
|
||||||
handleSourceChips()
|
handleSourceChips(requireContext())
|
||||||
|
|
||||||
binding.progressBar2.visibility = GONE
|
binding.progressBar2.visibility = GONE
|
||||||
binding.filterView.visibility = VISIBLE
|
binding.filterView.visibility = VISIBLE
|
||||||
@ -79,15 +79,14 @@ class FilterSheetFragment :
|
|||||||
return binding.root
|
return binding.root
|
||||||
}
|
}
|
||||||
|
|
||||||
private suspend fun handleSourceChips() {
|
private suspend fun handleSourceChips(context: Context) {
|
||||||
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
|
||||||
|
|
||||||
maybeIfContext {
|
context.imageIntoViewTarget(
|
||||||
it.imageIntoViewTarget(
|
|
||||||
source.getIcon(repository.baseUrl),
|
source.getIcon(repository.baseUrl),
|
||||||
object : ViewTarget<Chip?, Drawable?>(c) {
|
object : ViewTarget<Chip?, Drawable?>(c) {
|
||||||
override fun onResourceReady(
|
override fun onResourceReady(
|
||||||
@ -103,7 +102,6 @@ class FilterSheetFragment :
|
|||||||
},
|
},
|
||||||
appSettingsService,
|
appSettingsService,
|
||||||
)
|
)
|
||||||
}
|
|
||||||
|
|
||||||
c.text = source.title.getHtmlDecoded()
|
c.text = source.title.getHtmlDecoded()
|
||||||
|
|
||||||
@ -139,7 +137,7 @@ class FilterSheetFragment :
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private suspend fun handleTagChips() {
|
private suspend fun handleTagChips(context: Context) {
|
||||||
val tagGroup = binding.tagsGroup
|
val tagGroup = binding.tagsGroup
|
||||||
|
|
||||||
val tags = repository.getTags()
|
val tags = repository.getTags()
|
||||||
|
@ -5,7 +5,6 @@ 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
|
||||||
@ -30,30 +29,15 @@ fun Context.shareLink(
|
|||||||
}
|
}
|
||||||
|
|
||||||
@ColorInt
|
@ColorInt
|
||||||
fun Fragment.getColorFromAttr(
|
fun Context.getColorFromAttr(
|
||||||
@AttrRes attrColor: Int,
|
@AttrRes attrColor: Int,
|
||||||
resolveRefs: Boolean = true,
|
resolveRefs: Boolean = true,
|
||||||
): Int {
|
): Int {
|
||||||
val typedValue = TypedValue()
|
val typedValue = TypedValue()
|
||||||
maybeIfContextWithLog { this.requireContext().theme.resolveAttribute(attrColor, typedValue, resolveRefs) }
|
try {
|
||||||
|
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
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
@ -23,11 +23,10 @@ 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): Any { // GlideUrl Or String
|
fun String.toGlideUrl(appSettingsService: AppSettingsService): GlideUrl {
|
||||||
if (this.isEmptyOrNullOrNullString()) {
|
if (this.isEmptyOrNullOrNullString()) {
|
||||||
return ""
|
return GlideUrl("")
|
||||||
}
|
}
|
||||||
if (appSettingsService.getBasicUserName().isNotEmpty()) {
|
if (appSettingsService.getBasicUserName().isNotEmpty()) {
|
||||||
val authString = "${appSettingsService.getBasicUserName()}:${appSettingsService.getBasicPassword()}"
|
val authString = "${appSettingsService.getBasicUserName()}:${appSettingsService.getBasicPassword()}"
|
||||||
|
Loading…
x
Reference in New Issue
Block a user