Compare commits
	
		
			24 Commits
		
	
	
		
			v123010281
			...
			v123030681
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 
						 | 
					d9d057c8dc | ||
| 
						 | 
					1f3fa0c4a6 | ||
| 
						 | 
					dea3def385 | ||
| 
						 | 
					f72ef2f5d4 | ||
| 
						 | 
					f28cb759df | ||
| 
						 | 
					b9d69c3e64 | ||
| 
						 | 
					c2a1c9eaac | ||
| 
						 | 
					bf37209a15 | ||
| 
						 | 
					2c558fe6fd | ||
| 
						 | 
					ad88011454 | ||
| 
						 | 
					559c17bc1d | ||
| 
						 | 
					ab9c46f0eb | ||
| 
						 | 
					aa799d2ca8 | ||
| 
						 | 
					177c978474 | ||
| 
						 | 
					39b9991413 | ||
| 
						 | 
					b303f110f1 | ||
| 
						 | 
					f851941a6a | ||
| 
						 | 
					a313552976 | ||
| 
						 | 
					6ac97ed3fe | ||
| 
						 | 
					d583b937b7 | ||
| 
						 | 
					15b9a2d935 | ||
| 
						 | 
					5a8ce15961 | ||
| e1c64cef46 | |||
| ee064f3cb4 | 
@@ -48,13 +48,14 @@ steps:
 | 
			
		||||
    commands:
 | 
			
		||||
      - apt-get update && apt-get install -y git
 | 
			
		||||
      - git fetch --tags -p
 | 
			
		||||
      - PREV=$(git describe --tags --abbrev=0)
 | 
			
		||||
      - ./build.sh --publish --from-ci
 | 
			
		||||
      - git remote add pushing https://$GITEA_USR:$GITEA_PASS@gitea.amine-louveau.fr/Louvorg/ReaderForSelfoss-multiplatform.git
 | 
			
		||||
      - VER=$(git describe --tags --abbrev=0)
 | 
			
		||||
      - CHANGELOG=$(git log $VER..HEAD --pretty="- %s")
 | 
			
		||||
      - CHANGELOG=$(git log $PREV..HEAD --pretty="- %s")
 | 
			
		||||
      - echo "**$VER**\n\n$CHANGELOG\n\n--------------------------------------------------------------------\n\n$(cat CHANGELOG.md)" > CHANGELOG.md
 | 
			
		||||
      - git add CHANGELOG.md
 | 
			
		||||
      - git commit -m "Changelog for $VER [CI SKIP]"
 | 
			
		||||
      - ./build.sh --publish --from-ci
 | 
			
		||||
      - git remote add pushing https://$GITEA_USR:$GITEA_PASS@gitea.amine-louveau.fr/Louvorg/ReaderForSelfoss-multiplatform.git
 | 
			
		||||
      - git push pushing master
 | 
			
		||||
      - git push pushing --tags
 | 
			
		||||
    environment:
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										49
									
								
								CHANGELOG.md
									
									
									
									
									
								
							
							
						
						
									
										49
									
								
								CHANGELOG.md
									
									
									
									
									
								
							@@ -1,3 +1,52 @@
 | 
			
		||||
**v123030621**
 | 
			
		||||
 | 
			
		||||
- fix: url required issue.
 | 
			
		||||
- fix: Canvas reused issue.
 | 
			
		||||
- Changelog for v123020572 [CI SKIP]
 | 
			
		||||
 | 
			
		||||
--------------------------------------------------------------------
 | 
			
		||||
 | 
			
		||||
**v123020572**
 | 
			
		||||
 | 
			
		||||
- fix: requirecontext issues ?
 | 
			
		||||
- debug: activity not found exception.
 | 
			
		||||
- Changelog for v123020571 [CI SKIP]
 | 
			
		||||
 | 
			
		||||
--------------------------------------------------------------------
 | 
			
		||||
 | 
			
		||||
**v123020571**
 | 
			
		||||
 | 
			
		||||
- chore: remove errors logging.
 | 
			
		||||
- fix: quickfix for url param not provided for some sources.
 | 
			
		||||
- Update 'CHANGELOG.md'
 | 
			
		||||
- Changelog for v123020523 [CI SKIP]
 | 
			
		||||
 | 
			
		||||
--------------------------------------------------------------------
 | 
			
		||||
 | 
			
		||||
**v123020523**
 | 
			
		||||
 | 
			
		||||
- fix: Git changelog.
 | 
			
		||||
 | 
			
		||||
--------------------------------------------------------------------
 | 
			
		||||
 | 
			
		||||
**v123020491**
 | 
			
		||||
 | 
			
		||||
- fix: Fixed acra bug reporting.
 | 
			
		||||
 | 
			
		||||
--------------------------------------------------------------------
 | 
			
		||||
 | 
			
		||||
**v123010301**
 | 
			
		||||
 | 
			
		||||
- Chore: acra config.
 | 
			
		||||
 | 
			
		||||
--------------------------------------------------------------------
 | 
			
		||||
 | 
			
		||||
**v123010281**
 | 
			
		||||
 | 
			
		||||
- improvement: Improve right to left support (#130) Co-authored-by: davidoskky <davidoskky@hidden.hidden> Co-committed-by: davidoskky <davidoskky@hidden.hidden>
 | 
			
		||||
 | 
			
		||||
--------------------------------------------------------------------
 | 
			
		||||
 | 
			
		||||
**v123010261**
 | 
			
		||||
 | 
			
		||||
- feat: Handle public instances (#126) Co-authored-by: davidoskky <davidoskky@hidden.hidden> Co-committed-by: davidoskky <davidoskky@hidden.hidden>
 | 
			
		||||
 
 | 
			
		||||
@@ -28,7 +28,7 @@ fun gitVersion(): String {
 | 
			
		||||
    val maybeTagOfCurrentCommit = execWithOutput("git -C ../ describe --contains HEAD", true)
 | 
			
		||||
    process = if (maybeTagOfCurrentCommit.isEmpty()) {
 | 
			
		||||
        println("No tag on current commit. Will take the latest one.")
 | 
			
		||||
        execWithOutput("git -C ../ for-each-ref refs/tags --sort=-authordate --format='%(refname:short)' --count=1")
 | 
			
		||||
        execWithOutput("git -C ../ for-each-ref refs/tags --sort=-refname --format='%(refname:short)' --count=1")
 | 
			
		||||
    } else {
 | 
			
		||||
        println("Tag found on current commit")
 | 
			
		||||
        execWithOutput("git -C ../ describe --contains HEAD")
 | 
			
		||||
@@ -145,8 +145,8 @@ dependencies {
 | 
			
		||||
    implementation("com.amulyakhare:com.amulyakhare.textdrawable:1.0.1")
 | 
			
		||||
 | 
			
		||||
    // glide
 | 
			
		||||
    kapt("com.github.bumptech.glide:compiler:4.14.2")
 | 
			
		||||
    implementation("com.github.bumptech.glide:okhttp3-integration:4.14.2")
 | 
			
		||||
    kapt("com.github.bumptech.glide:compiler:4.15.0")
 | 
			
		||||
    implementation("com.github.bumptech.glide:okhttp3-integration:4.15.0")
 | 
			
		||||
 | 
			
		||||
    // Themes
 | 
			
		||||
    implementation("com.github.rubensousa:floatingtoolbar:1.5.1")
 | 
			
		||||
 
 | 
			
		||||
@@ -34,6 +34,7 @@ import org.kodein.di.*
 | 
			
		||||
class MyApp : MultiDexApplication(), DIAware {
 | 
			
		||||
 | 
			
		||||
    override val di by DI.lazy {
 | 
			
		||||
        bind<AppSettingsService>() with singleton { AppSettingsService(ACRA.isACRASenderServiceProcess()) }
 | 
			
		||||
        import(networkModule)
 | 
			
		||||
        bind<DriverFactory>() with singleton { DriverFactory(applicationContext) }
 | 
			
		||||
        bind<ReaderForSelfossDB>() with singleton { ReaderForSelfossDB(driverFactory.createDriver()) }
 | 
			
		||||
@@ -130,8 +131,8 @@ class MyApp : MultiDexApplication(), DIAware {
 | 
			
		||||
            httpSender {
 | 
			
		||||
                uri =
 | 
			
		||||
                    "https://bugs.amine-louveau.fr/report" /*best guess, you may need to adjust this*/
 | 
			
		||||
                basicAuthLogin = "LMTlLZuazADohTCm"
 | 
			
		||||
                basicAuthPassword = "he6ghHp83F0PYPfh"
 | 
			
		||||
                basicAuthLogin = "qMEscjj89Gwt6cPR"
 | 
			
		||||
                basicAuthPassword = "Yo58QFlGzFaWlBzP"
 | 
			
		||||
                httpMethod = HttpSender.Method.POST
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 
 | 
			
		||||
@@ -1,5 +1,6 @@
 | 
			
		||||
package bou.amine.apps.readerforselfossv2.android.fragments
 | 
			
		||||
 | 
			
		||||
import android.content.ActivityNotFoundException
 | 
			
		||||
import android.content.Intent
 | 
			
		||||
import android.content.res.ColorStateList
 | 
			
		||||
import android.content.res.TypedArray
 | 
			
		||||
@@ -150,17 +151,19 @@ class ArticleFragment : Fragment(), DIAware {
 | 
			
		||||
 | 
			
		||||
        } catch (e: InflateException) {
 | 
			
		||||
            e.sendSilentlyWithAcraWithName("webview not available")
 | 
			
		||||
            AlertDialog.Builder(requireContext())
 | 
			
		||||
                .setMessage(requireContext().getString(R.string.webview_dialog_issue_message))
 | 
			
		||||
                .setTitle(requireContext().getString(R.string.webview_dialog_issue_title))
 | 
			
		||||
                .setPositiveButton(
 | 
			
		||||
                    android.R.string.ok
 | 
			
		||||
                ) { _, _ ->
 | 
			
		||||
                    appSettingsService.disableArticleViewer()
 | 
			
		||||
                    requireActivity().finish()
 | 
			
		||||
                }
 | 
			
		||||
                .create()
 | 
			
		||||
                .show()
 | 
			
		||||
            if (context != null) {
 | 
			
		||||
                AlertDialog.Builder(requireContext())
 | 
			
		||||
                    .setMessage(requireContext().getString(R.string.webview_dialog_issue_message))
 | 
			
		||||
                    .setTitle(requireContext().getString(R.string.webview_dialog_issue_title))
 | 
			
		||||
                    .setPositiveButton(
 | 
			
		||||
                        android.R.string.ok
 | 
			
		||||
                    ) { _, _ ->
 | 
			
		||||
                        appSettingsService.disableArticleViewer()
 | 
			
		||||
                        requireActivity().finish()
 | 
			
		||||
                    }
 | 
			
		||||
                    .create()
 | 
			
		||||
                    .show()
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        return binding.root
 | 
			
		||||
@@ -304,10 +307,16 @@ class ArticleFragment : Fragment(), DIAware {
 | 
			
		||||
        binding.webcontent.webViewClient = object : WebViewClient() {
 | 
			
		||||
            @Deprecated("Deprecated in Java")
 | 
			
		||||
            override fun shouldOverrideUrlLoading(view: WebView?, url: String): Boolean {
 | 
			
		||||
                if (binding.webcontent.hitTestResult.type != WebView.HitTestResult.SRC_IMAGE_ANCHOR_TYPE) {
 | 
			
		||||
                    requireContext().startActivity(Intent(Intent.ACTION_VIEW, Uri.parse(url)))
 | 
			
		||||
                return if (context != null && binding.webcontent.hitTestResult.type != WebView.HitTestResult.SRC_IMAGE_ANCHOR_TYPE) {
 | 
			
		||||
                    try {
 | 
			
		||||
                        requireContext().startActivity(Intent(Intent.ACTION_VIEW, Uri.parse(url)))
 | 
			
		||||
                    } catch (e: ActivityNotFoundException) {
 | 
			
		||||
                        e.sendSilentlyWithAcraWithName("activityNotFound > $url")
 | 
			
		||||
                    }
 | 
			
		||||
                    true
 | 
			
		||||
                } else {
 | 
			
		||||
                    false
 | 
			
		||||
                }
 | 
			
		||||
                return true
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            @Deprecated("Deprecated in Java")
 | 
			
		||||
@@ -325,7 +334,7 @@ class ArticleFragment : Fragment(), DIAware {
 | 
			
		||||
                            getBitmapInputStream(image, Bitmap.CompressFormat.JPEG)
 | 
			
		||||
                        )
 | 
			
		||||
                    } catch (e: ExecutionException) {
 | 
			
		||||
                        e.sendSilentlyWithAcraWithName("shouldInterceptRequest > jpeg > $url")
 | 
			
		||||
                        // Do nothing
 | 
			
		||||
                    }
 | 
			
		||||
                } else if (url.lowercase(Locale.US).contains(".png")) {
 | 
			
		||||
                    try {
 | 
			
		||||
@@ -337,7 +346,7 @@ class ArticleFragment : Fragment(), DIAware {
 | 
			
		||||
                            getBitmapInputStream(image, Bitmap.CompressFormat.PNG)
 | 
			
		||||
                        )
 | 
			
		||||
                    } catch (e: ExecutionException) {
 | 
			
		||||
                        e.sendSilentlyWithAcraWithName("shouldInterceptRequest > png > $url")
 | 
			
		||||
                        // Do nothing
 | 
			
		||||
                    }
 | 
			
		||||
                } else if (url.lowercase(Locale.US).contains(".webp")) {
 | 
			
		||||
                    try {
 | 
			
		||||
@@ -349,7 +358,7 @@ class ArticleFragment : Fragment(), DIAware {
 | 
			
		||||
                            getBitmapInputStream(image, Bitmap.CompressFormat.WEBP)
 | 
			
		||||
                        )
 | 
			
		||||
                    } catch (e: ExecutionException) {
 | 
			
		||||
                        e.sendSilentlyWithAcraWithName("shouldInterceptRequest > webp > $url")
 | 
			
		||||
                        // Do nothing
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
@@ -359,74 +368,74 @@ class ArticleFragment : Fragment(), DIAware {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private fun htmlToWebview() {
 | 
			
		||||
 | 
			
		||||
        val attrs: IntArray = intArrayOf(android.R.attr.fontFamily)
 | 
			
		||||
        val a: TypedArray = requireContext().obtainStyledAttributes(resId, attrs)
 | 
			
		||||
        if (context != null) {
 | 
			
		||||
            val attrs: IntArray = intArrayOf(android.R.attr.fontFamily)
 | 
			
		||||
            val a: TypedArray = requireContext().obtainStyledAttributes(resId, attrs)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
        binding.webcontent.settings.standardFontFamily = a.getString(0)
 | 
			
		||||
        binding.webcontent.visibility = View.VISIBLE
 | 
			
		||||
            binding.webcontent.settings.standardFontFamily = a.getString(0)
 | 
			
		||||
            binding.webcontent.visibility = View.VISIBLE
 | 
			
		||||
 | 
			
		||||
        val colorOnSurface = TypedValue()
 | 
			
		||||
        requireContext().theme.resolveAttribute(R.attr.colorOnSurface, colorOnSurface, true)
 | 
			
		||||
            val colorOnSurface = TypedValue()
 | 
			
		||||
            requireContext().theme.resolveAttribute(R.attr.colorOnSurface, colorOnSurface, true)
 | 
			
		||||
 | 
			
		||||
        val colorSurface = TypedValue()
 | 
			
		||||
        requireContext().theme.resolveAttribute(R.attr.colorSurface, colorSurface, true)
 | 
			
		||||
            val colorSurface = TypedValue()
 | 
			
		||||
            requireContext().theme.resolveAttribute(R.attr.colorSurface, colorSurface, true)
 | 
			
		||||
 | 
			
		||||
        binding.webcontent.settings.useWideViewPort = true
 | 
			
		||||
        binding.webcontent.settings.loadWithOverviewMode = true
 | 
			
		||||
        binding.webcontent.settings.javaScriptEnabled = false
 | 
			
		||||
            binding.webcontent.settings.useWideViewPort = true
 | 
			
		||||
            binding.webcontent.settings.loadWithOverviewMode = true
 | 
			
		||||
            binding.webcontent.settings.javaScriptEnabled = false
 | 
			
		||||
 | 
			
		||||
        handleImageLoading()
 | 
			
		||||
            handleImageLoading()
 | 
			
		||||
 | 
			
		||||
        val gestureDetector =
 | 
			
		||||
            GestureDetector(activity, object : GestureDetector.SimpleOnGestureListener() {
 | 
			
		||||
                override fun onSingleTapUp(e: MotionEvent): Boolean {
 | 
			
		||||
                    return performClick()
 | 
			
		||||
                }
 | 
			
		||||
            })
 | 
			
		||||
            val gestureDetector =
 | 
			
		||||
                GestureDetector(activity, object : GestureDetector.SimpleOnGestureListener() {
 | 
			
		||||
                    override fun onSingleTapUp(e: MotionEvent): Boolean {
 | 
			
		||||
                        return performClick()
 | 
			
		||||
                    }
 | 
			
		||||
                })
 | 
			
		||||
 | 
			
		||||
        binding.webcontent.setOnTouchListener { _, event -> gestureDetector.onTouchEvent(event) }
 | 
			
		||||
            binding.webcontent.setOnTouchListener { _, event -> gestureDetector.onTouchEvent(event) }
 | 
			
		||||
 | 
			
		||||
        binding.webcontent.settings.layoutAlgorithm =
 | 
			
		||||
            WebSettings.LayoutAlgorithm.TEXT_AUTOSIZING
 | 
			
		||||
            binding.webcontent.settings.layoutAlgorithm =
 | 
			
		||||
                WebSettings.LayoutAlgorithm.TEXT_AUTOSIZING
 | 
			
		||||
 | 
			
		||||
        var baseUrl: String? = null
 | 
			
		||||
            var baseUrl: String? = null
 | 
			
		||||
 | 
			
		||||
        try {
 | 
			
		||||
            val itemUrl = URL(url)
 | 
			
		||||
            baseUrl = itemUrl.protocol + "://" + itemUrl.host
 | 
			
		||||
        } catch (e: MalformedURLException) {
 | 
			
		||||
            e.sendSilentlyWithAcraWithName("htmlToWebview > item url")
 | 
			
		||||
        }
 | 
			
		||||
            try {
 | 
			
		||||
                val itemUrl = URL(url)
 | 
			
		||||
                baseUrl = itemUrl.protocol + "://" + itemUrl.host
 | 
			
		||||
            } catch (e: MalformedURLException) {
 | 
			
		||||
                e.sendSilentlyWithAcraWithName("htmlToWebview > item url")
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
        val fontName = when (font) {
 | 
			
		||||
            getString(R.string.open_sans_font_id) -> "Open Sans"
 | 
			
		||||
            getString(R.string.roboto_font_id) -> "Roboto"
 | 
			
		||||
            getString(R.string.source_code_pro_font_id) -> "Source Code Pro"
 | 
			
		||||
            else -> ""
 | 
			
		||||
        }
 | 
			
		||||
            val fontName = when (font) {
 | 
			
		||||
                getString(R.string.open_sans_font_id) -> "Open Sans"
 | 
			
		||||
                getString(R.string.roboto_font_id) -> "Roboto"
 | 
			
		||||
                getString(R.string.source_code_pro_font_id) -> "Source Code Pro"
 | 
			
		||||
                else -> ""
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
        val fontLinkAndStyle = if (font.isNotEmpty()) {
 | 
			
		||||
            """<link href="https://fonts.googleapis.com/css?family=${
 | 
			
		||||
                fontName.replace(
 | 
			
		||||
                    " ",
 | 
			
		||||
                    "+"
 | 
			
		||||
                )
 | 
			
		||||
            }" rel="stylesheet">
 | 
			
		||||
            val fontLinkAndStyle = if (font.isNotEmpty()) {
 | 
			
		||||
                """<link href="https://fonts.googleapis.com/css?family=${
 | 
			
		||||
                    fontName.replace(
 | 
			
		||||
                        " ",
 | 
			
		||||
                        "+"
 | 
			
		||||
                    )
 | 
			
		||||
                }" rel="stylesheet">
 | 
			
		||||
                |<style>
 | 
			
		||||
                |   * {
 | 
			
		||||
                |       font-family: '$fontName';
 | 
			
		||||
                |   }
 | 
			
		||||
                |</style>
 | 
			
		||||
            """.trimMargin()
 | 
			
		||||
        } else {
 | 
			
		||||
            ""
 | 
			
		||||
        }
 | 
			
		||||
            } else {
 | 
			
		||||
                ""
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
        binding.webcontent.loadDataWithBaseURL(
 | 
			
		||||
            baseUrl,
 | 
			
		||||
            """<html>
 | 
			
		||||
            binding.webcontent.loadDataWithBaseURL(
 | 
			
		||||
                baseUrl,
 | 
			
		||||
                """<html>
 | 
			
		||||
                |<head>
 | 
			
		||||
                |   <meta name="viewport" content="width=device-width, initial-scale=1">
 | 
			
		||||
                |   <style>
 | 
			
		||||
@@ -438,11 +447,11 @@ class ArticleFragment : Fragment(), DIAware {
 | 
			
		||||
                |      }
 | 
			
		||||
                |      a {
 | 
			
		||||
                |        color: ${
 | 
			
		||||
                String.format(
 | 
			
		||||
                    "#%06X",
 | 
			
		||||
                    0xFFFFFF and resources.getColor(R.color.colorAccent)
 | 
			
		||||
                )
 | 
			
		||||
            } !important;
 | 
			
		||||
                    String.format(
 | 
			
		||||
                        "#%06X",
 | 
			
		||||
                        0xFFFFFF and resources.getColor(R.color.colorAccent)
 | 
			
		||||
                    )
 | 
			
		||||
                } !important;
 | 
			
		||||
                |      }
 | 
			
		||||
                |      *:not(a) {
 | 
			
		||||
                |        color: ${String.format("#%06X", 0xFFFFFF and colorOnSurface.data)};
 | 
			
		||||
@@ -454,25 +463,25 @@ class ArticleFragment : Fragment(), DIAware {
 | 
			
		||||
                |        overflow:hidden;
 | 
			
		||||
                |        line-height: 1.5em;
 | 
			
		||||
                |        background-color: ${
 | 
			
		||||
                String.format(
 | 
			
		||||
                    "#%06X",
 | 
			
		||||
                    0xFFFFFF and colorSurface.data
 | 
			
		||||
                )
 | 
			
		||||
            };
 | 
			
		||||
                    String.format(
 | 
			
		||||
                        "#%06X",
 | 
			
		||||
                        0xFFFFFF and colorSurface.data
 | 
			
		||||
                    )
 | 
			
		||||
                };
 | 
			
		||||
                |      }
 | 
			
		||||
                |      body, html {
 | 
			
		||||
                |        background-color: ${
 | 
			
		||||
                String.format(
 | 
			
		||||
                    "#%06X",
 | 
			
		||||
                    0xFFFFFF and colorSurface.data
 | 
			
		||||
                )
 | 
			
		||||
            } !important;
 | 
			
		||||
                    String.format(
 | 
			
		||||
                        "#%06X",
 | 
			
		||||
                        0xFFFFFF and colorSurface.data
 | 
			
		||||
                    )
 | 
			
		||||
                } !important;
 | 
			
		||||
                |        border-color: ${
 | 
			
		||||
                String.format(
 | 
			
		||||
                    "#%06X",
 | 
			
		||||
                    0xFFFFFF and colorSurface.data
 | 
			
		||||
                )
 | 
			
		||||
            }  !important;
 | 
			
		||||
                    String.format(
 | 
			
		||||
                        "#%06X",
 | 
			
		||||
                        0xFFFFFF and colorSurface.data
 | 
			
		||||
                    )
 | 
			
		||||
                }  !important;
 | 
			
		||||
                |        padding: 0 !important;
 | 
			
		||||
                |        margin: 0 !important;
 | 
			
		||||
                |      }
 | 
			
		||||
@@ -483,11 +492,11 @@ class ArticleFragment : Fragment(), DIAware {
 | 
			
		||||
                |        white-space: pre-wrap;
 | 
			
		||||
                |        width:100%;
 | 
			
		||||
                |        background-color: ${
 | 
			
		||||
                String.format(
 | 
			
		||||
                    "#%06X",
 | 
			
		||||
                    0xFFFFFF and colorSurface.data
 | 
			
		||||
                )
 | 
			
		||||
            };
 | 
			
		||||
                    String.format(
 | 
			
		||||
                        "#%06X",
 | 
			
		||||
                        0xFFFFFF and colorSurface.data
 | 
			
		||||
                    )
 | 
			
		||||
                };
 | 
			
		||||
                |      }
 | 
			
		||||
                |   </style>
 | 
			
		||||
                |   $fontLinkAndStyle
 | 
			
		||||
@@ -495,10 +504,11 @@ class ArticleFragment : Fragment(), DIAware {
 | 
			
		||||
                |<body>
 | 
			
		||||
                |   $contentText
 | 
			
		||||
                |</body>""".trimMargin(),
 | 
			
		||||
            "text/html",
 | 
			
		||||
            "utf-8",
 | 
			
		||||
            null
 | 
			
		||||
        )
 | 
			
		||||
                "text/html",
 | 
			
		||||
                "utf-8",
 | 
			
		||||
                null
 | 
			
		||||
            )
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    fun scrollDown() {
 | 
			
		||||
 
 | 
			
		||||
@@ -20,10 +20,8 @@ import bou.amine.apps.readerforselfossv2.repository.Repository
 | 
			
		||||
import bou.amine.apps.readerforselfossv2.utils.getHtmlDecoded
 | 
			
		||||
import bou.amine.apps.readerforselfossv2.utils.getIcon
 | 
			
		||||
import com.bumptech.glide.Glide
 | 
			
		||||
import com.bumptech.glide.load.DataSource
 | 
			
		||||
import com.bumptech.glide.load.engine.GlideException
 | 
			
		||||
import com.bumptech.glide.request.RequestListener
 | 
			
		||||
import com.bumptech.glide.request.target.Target
 | 
			
		||||
import com.bumptech.glide.request.target.ViewTarget
 | 
			
		||||
import com.bumptech.glide.request.transition.Transition
 | 
			
		||||
import com.google.android.material.bottomsheet.BottomSheetDialogFragment
 | 
			
		||||
import com.google.android.material.chip.Chip
 | 
			
		||||
import kotlinx.coroutines.CoroutineScope
 | 
			
		||||
@@ -90,31 +88,19 @@ class FilterSheetFragment : BottomSheetDialogFragment(), DIAware {
 | 
			
		||||
 | 
			
		||||
            Glide.with(context)
 | 
			
		||||
                .load(source.getIcon(repository.baseUrl))
 | 
			
		||||
                .listener(object : RequestListener<Drawable?> {
 | 
			
		||||
                    override fun onLoadFailed(
 | 
			
		||||
                        e: GlideException?,
 | 
			
		||||
                        model: Any?,
 | 
			
		||||
                        target: Target<Drawable?>?,
 | 
			
		||||
                        isFirstResource: Boolean
 | 
			
		||||
                    ): Boolean {
 | 
			
		||||
                        return false
 | 
			
		||||
                    }
 | 
			
		||||
 | 
			
		||||
                .into(object : ViewTarget<Chip?, Drawable?>(c) {
 | 
			
		||||
                    override fun onResourceReady(
 | 
			
		||||
                        resource: Drawable?,
 | 
			
		||||
                        model: Any?,
 | 
			
		||||
                        target: Target<Drawable?>?,
 | 
			
		||||
                        dataSource: DataSource?,
 | 
			
		||||
                        isFirstResource: Boolean
 | 
			
		||||
                    ): Boolean {
 | 
			
		||||
                        resource: Drawable,
 | 
			
		||||
                        transition: Transition<in Drawable?>?
 | 
			
		||||
                    ) {
 | 
			
		||||
                        try {
 | 
			
		||||
                            c.chipIcon = resource
 | 
			
		||||
                        } catch (e: Exception) {
 | 
			
		||||
                            e.sendSilentlyWithAcraWithName("sources > onResourceReady")
 | 
			
		||||
                        }
 | 
			
		||||
                        return false
 | 
			
		||||
                    }
 | 
			
		||||
                }).preload()
 | 
			
		||||
 | 
			
		||||
                })
 | 
			
		||||
 | 
			
		||||
            c.text = source.title.getHtmlDecoded()
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -1,13 +1,12 @@
 | 
			
		||||
<?xml version="1.0" encoding="utf-8"?>
 | 
			
		||||
<androidx.drawerlayout.widget.DrawerLayout
 | 
			
		||||
    xmlns:android="http://schemas.android.com/apk/res/android"
 | 
			
		||||
<androidx.drawerlayout.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android"
 | 
			
		||||
    xmlns:app="http://schemas.android.com/apk/res-auto"
 | 
			
		||||
    xmlns:tools="http://schemas.android.com/tools"
 | 
			
		||||
    android:id="@+id/drawerContainer"
 | 
			
		||||
    android:layout_width="match_parent"
 | 
			
		||||
    android:layout_height="match_parent"
 | 
			
		||||
    tools:context="bou.amine.apps.readerforselfossv2.android.HomeActivity"
 | 
			
		||||
    android:fitsSystemWindows="true"
 | 
			
		||||
    xmlns:app="http://schemas.android.com/apk/res-auto">
 | 
			
		||||
    tools:context="bou.amine.apps.readerforselfossv2.android.HomeActivity">
 | 
			
		||||
 | 
			
		||||
    <androidx.coordinatorlayout.widget.CoordinatorLayout
 | 
			
		||||
        android:id="@+id/coordLayout"
 | 
			
		||||
@@ -28,12 +27,14 @@
 | 
			
		||||
                    android:layout_width="match_parent"
 | 
			
		||||
                    android:layout_height="wrap_content">
 | 
			
		||||
 | 
			
		||||
                    <androidx.appcompat.widget.Toolbar app:popupTheme="?attr/toolbarPopupTheme" android:theme="@style/ToolBarStyle"
 | 
			
		||||
                    <androidx.appcompat.widget.Toolbar
 | 
			
		||||
                        android:id="@+id/toolBar"
 | 
			
		||||
                        android:layout_width="match_parent"
 | 
			
		||||
                        android:layout_height="?attr/actionBarSize"
 | 
			
		||||
                        android:theme="@style/ToolBarStyle"
 | 
			
		||||
                        app:popupTheme="?attr/toolbarPopupTheme"
 | 
			
		||||
 | 
			
		||||
                         />
 | 
			
		||||
                        />
 | 
			
		||||
 | 
			
		||||
                </com.google.android.material.appbar.AppBarLayout>
 | 
			
		||||
 | 
			
		||||
@@ -45,19 +46,19 @@
 | 
			
		||||
                    <LinearLayout
 | 
			
		||||
                        android:layout_width="match_parent"
 | 
			
		||||
                        android:layout_height="match_parent"
 | 
			
		||||
                        android:orientation="vertical"
 | 
			
		||||
                        android:background="?android:attr/windowBackground">
 | 
			
		||||
                        android:background="?android:attr/windowBackground"
 | 
			
		||||
                        android:orientation="vertical">
 | 
			
		||||
 | 
			
		||||
                        <TextView
 | 
			
		||||
                            android:id="@+id/emptyText"
 | 
			
		||||
                            android:layout_width="match_parent"
 | 
			
		||||
                            android:layout_height="wrap_content"
 | 
			
		||||
                            android:background="@android:color/transparent"
 | 
			
		||||
                            android:gravity="center_horizontal"
 | 
			
		||||
                            android:paddingTop="100dp"
 | 
			
		||||
                            android:text="@string/nothing_here"
 | 
			
		||||
                            android:textAlignment="center"
 | 
			
		||||
                            android:textAppearance="@style/TextAppearance.AppCompat.Headline"
 | 
			
		||||
                            android:background="@android:color/transparent"
 | 
			
		||||
                            android:visibility="gone" />
 | 
			
		||||
 | 
			
		||||
                        <androidx.recyclerview.widget.RecyclerView
 | 
			
		||||
@@ -69,7 +70,7 @@
 | 
			
		||||
                            android:paddingBottom="60dp"
 | 
			
		||||
                            android:scrollbars="vertical"
 | 
			
		||||
                            app:layout_behavior="@string/appbar_scrolling_view_behavior"
 | 
			
		||||
                            tools:listitem="@layout/list_item"/>
 | 
			
		||||
                            tools:listitem="@layout/list_item" />
 | 
			
		||||
                    </LinearLayout>
 | 
			
		||||
 | 
			
		||||
                </androidx.swiperefreshlayout.widget.SwipeRefreshLayout>
 | 
			
		||||
@@ -77,6 +78,7 @@
 | 
			
		||||
            </LinearLayout>
 | 
			
		||||
 | 
			
		||||
        </androidx.coordinatorlayout.widget.CoordinatorLayout>
 | 
			
		||||
 | 
			
		||||
        <com.ashokvarma.bottomnavigation.BottomNavigationBar
 | 
			
		||||
            android:id="@+id/bottomBar"
 | 
			
		||||
            android:layout_width="match_parent"
 | 
			
		||||
 
 | 
			
		||||
@@ -1,31 +1,30 @@
 | 
			
		||||
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 | 
			
		||||
    xmlns:app="http://schemas.android.com/apk/res-auto"
 | 
			
		||||
    xmlns:tools="http://schemas.android.com/tools"
 | 
			
		||||
    android:layout_width="match_parent"
 | 
			
		||||
    android:layout_height="match_parent"
 | 
			
		||||
    xmlns:app="http://schemas.android.com/apk/res-auto"
 | 
			
		||||
    android:gravity="center_horizontal"
 | 
			
		||||
    android:orientation="vertical"
 | 
			
		||||
    tools:context="bou.amine.apps.readerforselfossv2.android.LoginActivity">
 | 
			
		||||
 | 
			
		||||
    <com.google.android.material.appbar.AppBarLayout
 | 
			
		||||
        android:layout_width="match_parent"
 | 
			
		||||
        android:layout_height="wrap_content">
 | 
			
		||||
 | 
			
		||||
        <androidx.appcompat.widget.Toolbar app:popupTheme="?attr/toolbarPopupTheme" android:theme="@style/ToolBarStyle"
 | 
			
		||||
        <androidx.appcompat.widget.Toolbar
 | 
			
		||||
            android:id="@+id/toolbar"
 | 
			
		||||
            android:layout_width="match_parent"
 | 
			
		||||
            android:layout_height="?attr/actionBarSize"
 | 
			
		||||
 | 
			
		||||
             />
 | 
			
		||||
            android:theme="@style/ToolBarStyle"
 | 
			
		||||
            app:popupTheme="?attr/toolbarPopupTheme" />
 | 
			
		||||
 | 
			
		||||
    </com.google.android.material.appbar.AppBarLayout>
 | 
			
		||||
 | 
			
		||||
    <LinearLayout
 | 
			
		||||
        android:layout_width="match_parent"
 | 
			
		||||
        android:layout_height="match_parent"
 | 
			
		||||
        android:orientation="vertical"
 | 
			
		||||
        android:paddingBottom="@dimen/activity_vertical_margin"
 | 
			
		||||
        android:paddingLeft="@dimen/activity_horizontal_margin"
 | 
			
		||||
        android:paddingRight="@dimen/activity_horizontal_margin"
 | 
			
		||||
        android:paddingTop="@dimen/activity_vertical_margin">
 | 
			
		||||
        android:padding="@dimen/activity_horizontal_margin">
 | 
			
		||||
        <!-- Login progress -->
 | 
			
		||||
        <ProgressBar
 | 
			
		||||
            android:id="@+id/loginProgress"
 | 
			
		||||
@@ -33,67 +32,65 @@
 | 
			
		||||
            android:layout_width="wrap_content"
 | 
			
		||||
            android:layout_height="wrap_content"
 | 
			
		||||
            android:layout_marginBottom="8dp"
 | 
			
		||||
            android:visibility="gone"/>
 | 
			
		||||
            android:visibility="gone" />
 | 
			
		||||
 | 
			
		||||
        <ScrollView
 | 
			
		||||
        <LinearLayout
 | 
			
		||||
            android:id="@+id/loginForm"
 | 
			
		||||
            android:layout_width="match_parent"
 | 
			
		||||
            android:layout_height="match_parent">
 | 
			
		||||
            android:layout_height="wrap_content"
 | 
			
		||||
            android:orientation="vertical">
 | 
			
		||||
 | 
			
		||||
            <LinearLayout
 | 
			
		||||
            <EditText
 | 
			
		||||
                android:id="@+id/urlView"
 | 
			
		||||
                android:layout_width="match_parent"
 | 
			
		||||
                android:layout_height="wrap_content"
 | 
			
		||||
                android:orientation="vertical">
 | 
			
		||||
                android:hint="@string/prompt_url"
 | 
			
		||||
                android:imeOptions="actionUnspecified"
 | 
			
		||||
                android:importantForAutofill="no"
 | 
			
		||||
                android:inputType="textUri"
 | 
			
		||||
                android:maxLines="1"
 | 
			
		||||
                android:minHeight="48dp" />
 | 
			
		||||
 | 
			
		||||
                <EditText
 | 
			
		||||
                    android:id="@+id/urlView"
 | 
			
		||||
                    android:layout_width="match_parent"
 | 
			
		||||
                    android:layout_height="wrap_content"
 | 
			
		||||
                    android:hint="@string/prompt_url"
 | 
			
		||||
                    android:imeOptions="actionUnspecified"
 | 
			
		||||
                    android:importantForAutofill="no"
 | 
			
		||||
                    android:inputType="textUri"
 | 
			
		||||
                    android:maxLines="1" />
 | 
			
		||||
            <com.google.android.material.switchmaterial.SwitchMaterial
 | 
			
		||||
                android:id="@+id/withLogin"
 | 
			
		||||
                android:layout_width="match_parent"
 | 
			
		||||
                android:layout_height="wrap_content"
 | 
			
		||||
                android:text="@string/withLoginSwitch"
 | 
			
		||||
                android:textAlignment="viewStart" />
 | 
			
		||||
 | 
			
		||||
                <com.google.android.material.switchmaterial.SwitchMaterial
 | 
			
		||||
                    android:text="@string/withLoginSwitch"
 | 
			
		||||
                    android:layout_width="match_parent"
 | 
			
		||||
                    android:layout_height="0dp"
 | 
			
		||||
                    android:id="@+id/withLogin"
 | 
			
		||||
                    android:layout_weight="1"/>
 | 
			
		||||
            <EditText
 | 
			
		||||
                android:id="@+id/loginView"
 | 
			
		||||
                android:layout_width="match_parent"
 | 
			
		||||
                android:layout_height="wrap_content"
 | 
			
		||||
                android:autofillHints="username"
 | 
			
		||||
                android:hint="@string/prompt_login"
 | 
			
		||||
                android:inputType="text"
 | 
			
		||||
                android:maxLines="1"
 | 
			
		||||
                android:minHeight="48dp"
 | 
			
		||||
                android:visibility="gone" />
 | 
			
		||||
 | 
			
		||||
                <EditText
 | 
			
		||||
                    android:id="@+id/loginView"
 | 
			
		||||
                    android:layout_width="match_parent"
 | 
			
		||||
                    android:layout_height="wrap_content"
 | 
			
		||||
                    android:autofillHints="username"
 | 
			
		||||
                    android:hint="@string/prompt_login"
 | 
			
		||||
                    android:inputType="text"
 | 
			
		||||
                    android:maxLines="1"
 | 
			
		||||
                    android:visibility="gone" />
 | 
			
		||||
            <EditText
 | 
			
		||||
                android:id="@+id/passwordView"
 | 
			
		||||
                android:layout_width="match_parent"
 | 
			
		||||
                android:layout_height="wrap_content"
 | 
			
		||||
                android:autofillHints="password"
 | 
			
		||||
                android:hint="@string/prompt_password"
 | 
			
		||||
                android:inputType="textPassword"
 | 
			
		||||
                android:maxLines="1"
 | 
			
		||||
                android:minHeight="48dp"
 | 
			
		||||
                android:visibility="gone" />
 | 
			
		||||
 | 
			
		||||
                <EditText
 | 
			
		||||
                    android:id="@+id/passwordView"
 | 
			
		||||
                    android:layout_width="match_parent"
 | 
			
		||||
                    android:layout_height="wrap_content"
 | 
			
		||||
                    android:autofillHints="password"
 | 
			
		||||
                    android:hint="@string/prompt_password"
 | 
			
		||||
                    android:inputType="textPassword"
 | 
			
		||||
                    android:maxLines="1"
 | 
			
		||||
                    android:visibility="gone" />
 | 
			
		||||
            <Button
 | 
			
		||||
                android:id="@+id/signInButton"
 | 
			
		||||
                style="?android:textAppearanceSmall"
 | 
			
		||||
                android:layout_width="match_parent"
 | 
			
		||||
                android:layout_height="wrap_content"
 | 
			
		||||
                android:layout_marginTop="16dp"
 | 
			
		||||
                android:layout_marginBottom="16dp"
 | 
			
		||||
                android:text="@string/action_sign_in"
 | 
			
		||||
                android:textStyle="bold" />
 | 
			
		||||
 | 
			
		||||
                <Button
 | 
			
		||||
                    android:id="@+id/signInButton"
 | 
			
		||||
                    style="?android:textAppearanceSmall"
 | 
			
		||||
                    android:layout_width="match_parent"
 | 
			
		||||
                    android:layout_height="wrap_content"
 | 
			
		||||
                    android:layout_marginTop="16dp"
 | 
			
		||||
                    android:layout_marginBottom="16dp"
 | 
			
		||||
                    android:text="@string/action_sign_in"
 | 
			
		||||
                    android:textStyle="bold" />
 | 
			
		||||
 | 
			
		||||
            </LinearLayout>
 | 
			
		||||
        </ScrollView>
 | 
			
		||||
        </LinearLayout>
 | 
			
		||||
    </LinearLayout>
 | 
			
		||||
 | 
			
		||||
</LinearLayout>
 | 
			
		||||
 
 | 
			
		||||
@@ -24,7 +24,8 @@
 | 
			
		||||
        android:layout_width="match_parent"
 | 
			
		||||
        android:layout_height="match_parent"
 | 
			
		||||
        android:scrollbars="vertical"
 | 
			
		||||
        app:layout_behavior="@string/appbar_scrolling_view_behavior">
 | 
			
		||||
        app:layout_behavior="@string/appbar_scrolling_view_behavior"
 | 
			
		||||
        tools:listitem="@layout/source_list_item">
 | 
			
		||||
    </androidx.recyclerview.widget.RecyclerView>
 | 
			
		||||
 | 
			
		||||
    <com.google.android.material.floatingactionbutton.FloatingActionButton
 | 
			
		||||
 
 | 
			
		||||
@@ -17,100 +17,83 @@
 | 
			
		||||
            <androidx.appcompat.widget.Toolbar app:popupTheme="?attr/toolbarPopupTheme" android:theme="@style/ToolBarStyle"
 | 
			
		||||
                android:id="@+id/toolbar"
 | 
			
		||||
                android:layout_width="match_parent"
 | 
			
		||||
                android:layout_height="?attr/actionBarSize"
 | 
			
		||||
 | 
			
		||||
                 />
 | 
			
		||||
                android:layout_height="?attr/actionBarSize" />
 | 
			
		||||
 | 
			
		||||
        </com.google.android.material.appbar.AppBarLayout>
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
        <androidx.constraintlayout.widget.ConstraintLayout
 | 
			
		||||
            android:paddingBottom="@dimen/activity_vertical_margin"
 | 
			
		||||
            android:paddingLeft="@dimen/activity_horizontal_margin"
 | 
			
		||||
            android:paddingRight="@dimen/activity_horizontal_margin"
 | 
			
		||||
            android:paddingTop="@dimen/activity_vertical_margin"
 | 
			
		||||
            android:layout_height="match_parent"
 | 
			
		||||
            android:layout_width="match_parent"
 | 
			
		||||
            app:layout_constraintTop_toTopOf="parent"
 | 
			
		||||
            app:layout_constraintRight_toRightOf="parent"
 | 
			
		||||
            app:layout_constraintLeft_toLeftOf="parent"
 | 
			
		||||
            app:layout_constraintBottom_toBottomOf="parent"
 | 
			
		||||
            android:id="@+id/formContainer"
 | 
			
		||||
            android:layout_width="match_parent"
 | 
			
		||||
            android:layout_height="match_parent"
 | 
			
		||||
            android:padding="16dp"
 | 
			
		||||
            android:visibility="gone"
 | 
			
		||||
            app:layout_constraintHorizontal_bias="1.0"
 | 
			
		||||
            app:layout_constraintVertical_bias="0.0">
 | 
			
		||||
            app:layout_constraintLeft_toLeftOf="parent"
 | 
			
		||||
            app:layout_constraintTop_toTopOf="parent">
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
            <EditText
 | 
			
		||||
                android:id="@+id/nameInput"
 | 
			
		||||
                android:layout_width="match_parent"
 | 
			
		||||
                android:layout_height="wrap_content"
 | 
			
		||||
                android:minHeight="48dp"
 | 
			
		||||
                android:layout_marginTop="16dp"
 | 
			
		||||
                android:autofillHints="false"
 | 
			
		||||
                android:ems="10"
 | 
			
		||||
                android:hint="@string/add_source_hint_name"
 | 
			
		||||
                android:inputType="text"
 | 
			
		||||
                android:textColorHint="?android:textColorPrimary"
 | 
			
		||||
                app:layout_constraintLeft_toLeftOf="parent"
 | 
			
		||||
                app:layout_constraintRight_toRightOf="parent"
 | 
			
		||||
                app:layout_constraintTop_toTopOf="parent" />
 | 
			
		||||
 | 
			
		||||
            <EditText
 | 
			
		||||
                android:id="@+id/sourceUri"
 | 
			
		||||
                android:layout_width="match_parent"
 | 
			
		||||
                android:layout_height="wrap_content"
 | 
			
		||||
                android:inputType="textUri"
 | 
			
		||||
                android:ems="10"
 | 
			
		||||
                android:id="@+id/sourceUri"
 | 
			
		||||
                android:hint="@string/add_source_hint_url"
 | 
			
		||||
                android:textColorHint="?android:textColorPrimary"
 | 
			
		||||
                android:minHeight="48dp"
 | 
			
		||||
                android:layout_marginTop="16dp"
 | 
			
		||||
                app:layout_constraintTop_toBottomOf="@+id/nameInput"
 | 
			
		||||
                app:layout_constraintRight_toRightOf="parent"
 | 
			
		||||
                android:autofillHints="false"
 | 
			
		||||
                android:hint="@string/add_source_hint_url"
 | 
			
		||||
                android:inputType="textUri"
 | 
			
		||||
                android:textColorHint="?android:textColorPrimary"
 | 
			
		||||
                app:layout_constraintLeft_toLeftOf="parent"
 | 
			
		||||
                android:autofillHints="false" />
 | 
			
		||||
                app:layout_constraintTop_toBottomOf="@+id/nameInput" />
 | 
			
		||||
 | 
			
		||||
            <EditText
 | 
			
		||||
                android:id="@+id/tags"
 | 
			
		||||
                android:layout_width="match_parent"
 | 
			
		||||
                android:layout_height="wrap_content"
 | 
			
		||||
                android:ems="10"
 | 
			
		||||
                android:id="@+id/tags"
 | 
			
		||||
                app:layout_constraintRight_toRightOf="parent"
 | 
			
		||||
                app:layout_constraintLeft_toLeftOf="parent"
 | 
			
		||||
                android:minHeight="48dp"
 | 
			
		||||
                android:layout_marginTop="16dp"
 | 
			
		||||
                app:layout_constraintTop_toBottomOf="@+id/sourceUri"
 | 
			
		||||
                android:autofillHints="false"
 | 
			
		||||
                android:hint="@string/add_source_hint_tags"
 | 
			
		||||
                android:textColorHint="?android:textColorPrimary"
 | 
			
		||||
                android:inputType="text"
 | 
			
		||||
                android:autofillHints="false" />
 | 
			
		||||
                android:textColorHint="?android:textColorPrimary"
 | 
			
		||||
                app:layout_constraintLeft_toLeftOf="parent"
 | 
			
		||||
                app:layout_constraintTop_toBottomOf="@+id/sourceUri" />
 | 
			
		||||
 | 
			
		||||
            <Spinner
 | 
			
		||||
                android:layout_width="match_parent"
 | 
			
		||||
                android:id="@+id/spoutsSpinner"
 | 
			
		||||
                android:layout_width="match_parent"
 | 
			
		||||
                android:layout_height="wrap_content"
 | 
			
		||||
                android:minHeight="48dp"
 | 
			
		||||
                android:layout_marginTop="16dp"
 | 
			
		||||
                app:layout_constraintTop_toBottomOf="@+id/tags"
 | 
			
		||||
                app:layout_constraintRight_toRightOf="parent"
 | 
			
		||||
                app:layout_constraintLeft_toLeftOf="parent"
 | 
			
		||||
                android:layout_height="40dp"/>
 | 
			
		||||
                app:layout_constraintTop_toBottomOf="@+id/tags" />
 | 
			
		||||
 | 
			
		||||
            <Button
 | 
			
		||||
                android:text="@string/add_source_save"
 | 
			
		||||
                android:id="@+id/saveBtn"
 | 
			
		||||
                android:layout_width="wrap_content"
 | 
			
		||||
                android:layout_height="wrap_content"
 | 
			
		||||
                android:id="@+id/saveBtn"
 | 
			
		||||
                android:elevation="5dp"
 | 
			
		||||
                android:textColor="?android:textColorPrimary"
 | 
			
		||||
                android:layout_marginEnd="16dp"
 | 
			
		||||
                app:layout_constraintRight_toRightOf="parent"
 | 
			
		||||
                android:layout_marginRight="16dp"
 | 
			
		||||
                android:layout_marginStart="16dp"
 | 
			
		||||
                app:layout_constraintLeft_toLeftOf="parent"
 | 
			
		||||
                android:layout_marginLeft="16dp"
 | 
			
		||||
                android:layout_marginTop="16dp"
 | 
			
		||||
                app:layout_constraintTop_toBottomOf="@+id/spoutsSpinner"
 | 
			
		||||
                android:elevation="5dp"
 | 
			
		||||
                android:text="@string/add_source_save"
 | 
			
		||||
                android:textColor="?android:textColorPrimary"
 | 
			
		||||
                app:layout_constraintBottom_toBottomOf="parent"
 | 
			
		||||
                android:layout_marginBottom="16dp"
 | 
			
		||||
                app:layout_constraintVertical_bias="0.0"/>
 | 
			
		||||
                app:layout_constraintLeft_toLeftOf="parent"
 | 
			
		||||
                app:layout_constraintRight_toRightOf="parent"
 | 
			
		||||
                app:layout_constraintTop_toBottomOf="@+id/spoutsSpinner" />
 | 
			
		||||
 | 
			
		||||
        </androidx.constraintlayout.widget.ConstraintLayout>
 | 
			
		||||
 | 
			
		||||
@@ -119,8 +102,6 @@
 | 
			
		||||
            style="?android:attr/progressBarStyleLarge"
 | 
			
		||||
            android:layout_width="match_parent"
 | 
			
		||||
            android:layout_height="wrap_content"
 | 
			
		||||
            android:visibility="visible"
 | 
			
		||||
            app:layout_constraintBottom_toBottomOf="parent"
 | 
			
		||||
            app:layout_constraintLeft_toLeftOf="parent"
 | 
			
		||||
            app:layout_constraintRight_toRightOf="parent"
 | 
			
		||||
            app:layout_constraintTop_toTopOf="parent"
 | 
			
		||||
 
 | 
			
		||||
@@ -1,18 +1,14 @@
 | 
			
		||||
<?xml version="1.0" encoding="utf-8"?>
 | 
			
		||||
<androidx.cardview.widget.CardView
 | 
			
		||||
    xmlns:android="http://schemas.android.com/apk/res/android"
 | 
			
		||||
<androidx.cardview.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android"
 | 
			
		||||
    xmlns:app="http://schemas.android.com/apk/res-auto"
 | 
			
		||||
    xmlns:card_view="http://schemas.android.com/apk/res-auto"
 | 
			
		||||
    xmlns:tools="http://schemas.android.com/tools"
 | 
			
		||||
    android:id="@+id/card"
 | 
			
		||||
    android:layout_width="match_parent"
 | 
			
		||||
    android:layout_height="wrap_content"
 | 
			
		||||
    android:layout_marginLeft="8dp"
 | 
			
		||||
    android:layout_marginRight="8dp"
 | 
			
		||||
    android:layout_marginTop="8dp"
 | 
			
		||||
    app:layout_constraintHorizontal_bias="0.62"
 | 
			
		||||
    app:layout_constraintLeft_toLeftOf="parent"
 | 
			
		||||
    app:layout_constraintRight_toRightOf="parent"
 | 
			
		||||
    android:layout_margin="8dp"
 | 
			
		||||
    app:layout_constraintEnd_toEndOf="parent"
 | 
			
		||||
    app:layout_constraintStart_toStartOf="parent"
 | 
			
		||||
    app:layout_constraintTop_toTopOf="parent"
 | 
			
		||||
    card_view:cardElevation="2dp"
 | 
			
		||||
    card_view:cardUseCompatPadding="true"
 | 
			
		||||
@@ -28,8 +24,8 @@
 | 
			
		||||
            android:layout_height="wrap_content"
 | 
			
		||||
            android:adjustViewBounds="true"
 | 
			
		||||
            android:cropToPadding="true"
 | 
			
		||||
            app:layout_constraintLeft_toLeftOf="parent"
 | 
			
		||||
            app:layout_constraintRight_toRightOf="parent"
 | 
			
		||||
            app:layout_constraintEnd_toEndOf="parent"
 | 
			
		||||
            app:layout_constraintStart_toStartOf="parent"
 | 
			
		||||
            app:layout_constraintTop_toTopOf="parent"
 | 
			
		||||
            app:srcCompat="@drawable/background_splash"
 | 
			
		||||
            card_view:layout_constraintBottom_toTopOf="@+id/constraintLayout" />
 | 
			
		||||
@@ -39,8 +35,8 @@
 | 
			
		||||
            android:layout_width="0dp"
 | 
			
		||||
            android:layout_height="wrap_content"
 | 
			
		||||
            app:layout_constraintBottom_toBottomOf="parent"
 | 
			
		||||
            app:layout_constraintLeft_toLeftOf="parent"
 | 
			
		||||
            app:layout_constraintRight_toRightOf="parent"
 | 
			
		||||
            app:layout_constraintEnd_toEndOf="parent"
 | 
			
		||||
            app:layout_constraintStart_toStartOf="parent"
 | 
			
		||||
            app:layout_constraintTop_toBottomOf="@+id/itemImage">
 | 
			
		||||
 | 
			
		||||
            <ImageView
 | 
			
		||||
@@ -49,7 +45,7 @@
 | 
			
		||||
                android:layout_height="40dp"
 | 
			
		||||
                android:layout_marginStart="8dp"
 | 
			
		||||
                android:layout_marginTop="8dp"
 | 
			
		||||
                app:layout_constraintLeft_toLeftOf="parent"
 | 
			
		||||
                app:layout_constraintStart_toStartOf="parent"
 | 
			
		||||
                app:layout_constraintTop_toTopOf="parent"
 | 
			
		||||
                app:srcCompat="@drawable/background_splash" />
 | 
			
		||||
 | 
			
		||||
@@ -57,40 +53,35 @@
 | 
			
		||||
                android:id="@+id/title"
 | 
			
		||||
                android:layout_width="0dp"
 | 
			
		||||
                android:layout_height="wrap_content"
 | 
			
		||||
                android:layout_marginEnd="8dp"
 | 
			
		||||
                android:layout_marginLeft="8dp"
 | 
			
		||||
                android:layout_marginRight="8dp"
 | 
			
		||||
                android:layout_marginStart="8dp"
 | 
			
		||||
                android:gravity="start"
 | 
			
		||||
                android:layout_margin="8dp"
 | 
			
		||||
                android:textAlignment="viewStart"
 | 
			
		||||
                android:textStyle="bold"
 | 
			
		||||
                android:textColor="?android:textColorPrimary"
 | 
			
		||||
                app:layout_constraintHorizontal_bias="0.0"
 | 
			
		||||
                app:layout_constraintLeft_toRightOf="@+id/sourceImage"
 | 
			
		||||
                app:layout_constraintRight_toRightOf="parent"
 | 
			
		||||
                android:textStyle="bold"
 | 
			
		||||
                app:layout_constraintEnd_toEndOf="parent"
 | 
			
		||||
                app:layout_constraintStart_toEndOf="@+id/sourceImage"
 | 
			
		||||
                app:layout_constraintTop_toTopOf="@+id/sourceImage"
 | 
			
		||||
                tools:text="Titre" />
 | 
			
		||||
 | 
			
		||||
            <TextView
 | 
			
		||||
                android:id="@+id/sourceTitleAndDate"
 | 
			
		||||
                android:layout_width="wrap_content"
 | 
			
		||||
                android:layout_width="0dp"
 | 
			
		||||
                android:layout_height="wrap_content"
 | 
			
		||||
                android:layout_marginTop="8dp"
 | 
			
		||||
                android:gravity="start"
 | 
			
		||||
                android:textAlignment="viewStart"
 | 
			
		||||
                android:textSize="14sp"
 | 
			
		||||
                android:textColor="?android:textColorPrimary"
 | 
			
		||||
                app:layout_constraintLeft_toLeftOf="@+id/title"
 | 
			
		||||
                android:textSize="14sp"
 | 
			
		||||
                app:layout_constraintEnd_toEndOf="parent"
 | 
			
		||||
                app:layout_constraintStart_toStartOf="@+id/title"
 | 
			
		||||
                app:layout_constraintTop_toBottomOf="@+id/title"
 | 
			
		||||
                tools:text="Google Actualité Il y a 5h" />
 | 
			
		||||
 | 
			
		||||
            <LinearLayout
 | 
			
		||||
                android:layout_width="wrap_content"
 | 
			
		||||
                android:layout_height="wrap_content"
 | 
			
		||||
                android:layout_marginTop="16dp"
 | 
			
		||||
                android:layout_marginTop="8dp"
 | 
			
		||||
                android:layout_marginEnd="8dp"
 | 
			
		||||
                app:layout_constraintBottom_toBottomOf="parent"
 | 
			
		||||
                app:layout_constraintRight_toRightOf="parent"
 | 
			
		||||
                app:layout_constraintEnd_toEndOf="parent"
 | 
			
		||||
                app:layout_constraintTop_toBottomOf="@+id/sourceTitleAndDate">
 | 
			
		||||
 | 
			
		||||
                <ImageButton
 | 
			
		||||
@@ -99,6 +90,7 @@
 | 
			
		||||
                    android:layout_height="35dp"
 | 
			
		||||
                    android:adjustViewBounds="true"
 | 
			
		||||
                    android:background="@android:color/transparent"
 | 
			
		||||
                    android:contentDescription="@string/reader_action_open"
 | 
			
		||||
                    android:elevation="5dp"
 | 
			
		||||
                    android:padding="4dp"
 | 
			
		||||
                    android:scaleType="centerCrop"
 | 
			
		||||
@@ -112,6 +104,7 @@
 | 
			
		||||
                    android:layout_marginStart="16dp"
 | 
			
		||||
                    android:adjustViewBounds="true"
 | 
			
		||||
                    android:background="@android:color/transparent"
 | 
			
		||||
                    android:contentDescription="@string/share"
 | 
			
		||||
                    android:elevation="5dp"
 | 
			
		||||
                    android:padding="4dp"
 | 
			
		||||
                    android:scaleType="centerCrop"
 | 
			
		||||
@@ -125,6 +118,7 @@
 | 
			
		||||
                    android:layout_marginStart="16dp"
 | 
			
		||||
                    android:adjustViewBounds="true"
 | 
			
		||||
                    android:background="@android:color/transparent"
 | 
			
		||||
                    android:contentDescription="@string/add_to_favs_reader"
 | 
			
		||||
                    android:elevation="5dp"
 | 
			
		||||
                    android:padding="4dp"
 | 
			
		||||
                    android:scaleType="centerCrop"
 | 
			
		||||
@@ -132,7 +126,6 @@
 | 
			
		||||
                    app:tint="@color/ic_menu_heart_color" />
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
            </LinearLayout>
 | 
			
		||||
 | 
			
		||||
        </androidx.constraintlayout.widget.ConstraintLayout>
 | 
			
		||||
 
 | 
			
		||||
@@ -1,6 +1,5 @@
 | 
			
		||||
<?xml version="1.0" encoding="utf-8"?>
 | 
			
		||||
<androidx.constraintlayout.widget.ConstraintLayout
 | 
			
		||||
    xmlns:android="http://schemas.android.com/apk/res/android"
 | 
			
		||||
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
 | 
			
		||||
    xmlns:app="http://schemas.android.com/apk/res-auto"
 | 
			
		||||
    xmlns:tools="http://schemas.android.com/tools"
 | 
			
		||||
    android:layout_width="match_parent"
 | 
			
		||||
@@ -80,10 +79,11 @@
 | 
			
		||||
                android:id="@+id/floatingActionButton2"
 | 
			
		||||
                android:layout_width="wrap_content"
 | 
			
		||||
                android:layout_height="wrap_content"
 | 
			
		||||
                android:layout_marginEnd="16dp"
 | 
			
		||||
 | 
			
		||||
                android:layout_marginTop="8dp"
 | 
			
		||||
                android:layout_marginEnd="16dp"
 | 
			
		||||
                android:clickable="true"
 | 
			
		||||
                android:contentDescription="@string/menu_home_search"
 | 
			
		||||
                android:focusable="true"
 | 
			
		||||
                app:backgroundTint="@color/colorAccent"
 | 
			
		||||
                app:layout_constraintEnd_toEndOf="parent"
 | 
			
		||||
                app:layout_constraintTop_toTopOf="parent"
 | 
			
		||||
 
 | 
			
		||||
@@ -1,5 +1,4 @@
 | 
			
		||||
<androidx.coordinatorlayout.widget.CoordinatorLayout
 | 
			
		||||
    xmlns:android="http://schemas.android.com/apk/res/android"
 | 
			
		||||
<androidx.coordinatorlayout.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
 | 
			
		||||
    xmlns:app="http://schemas.android.com/apk/res-auto"
 | 
			
		||||
    xmlns:tools="http://schemas.android.com/tools"
 | 
			
		||||
    android:layout_width="match_parent"
 | 
			
		||||
@@ -22,10 +21,22 @@
 | 
			
		||||
                android:layout_width="0dp"
 | 
			
		||||
                android:layout_height="200dp"
 | 
			
		||||
                android:scaleType="centerCrop"
 | 
			
		||||
                app:layout_constraintLeft_toLeftOf="parent"
 | 
			
		||||
                app:layout_constraintRight_toRightOf="parent"
 | 
			
		||||
                app:layout_constraintTop_toTopOf="parent"
 | 
			
		||||
                />
 | 
			
		||||
                app:layout_constraintEnd_toEndOf="parent"
 | 
			
		||||
                app:layout_constraintStart_toStartOf="parent"
 | 
			
		||||
                app:layout_constraintTop_toTopOf="parent" />
 | 
			
		||||
 | 
			
		||||
            <TextView
 | 
			
		||||
                android:id="@+id/titleView"
 | 
			
		||||
                android:layout_width="0dp"
 | 
			
		||||
                android:layout_height="wrap_content"
 | 
			
		||||
                android:layout_marginLeft="16dp"
 | 
			
		||||
                android:layout_marginTop="8dp"
 | 
			
		||||
                android:layout_marginRight="16dp"
 | 
			
		||||
                android:textAppearance="@style/TextAppearance.AppCompat.Headline"
 | 
			
		||||
                android:textStyle="bold"
 | 
			
		||||
                app:layout_constraintEnd_toEndOf="parent"
 | 
			
		||||
                app:layout_constraintStart_toStartOf="parent"
 | 
			
		||||
                app:layout_constraintTop_toBottomOf="@+id/imageView" />
 | 
			
		||||
 | 
			
		||||
            <TextView
 | 
			
		||||
                android:id="@+id/source"
 | 
			
		||||
@@ -36,40 +47,23 @@
 | 
			
		||||
                android:layout_marginRight="16dp"
 | 
			
		||||
                android:textColor="?android:textColorSecondary"
 | 
			
		||||
                android:textSize="12sp"
 | 
			
		||||
                app:layout_constraintHorizontal_bias="0.0"
 | 
			
		||||
                app:layout_constraintLeft_toLeftOf="parent"
 | 
			
		||||
                app:layout_constraintRight_toRightOf="parent"
 | 
			
		||||
                app:layout_constraintTop_toBottomOf="@+id/titleView" />
 | 
			
		||||
 | 
			
		||||
            <TextView
 | 
			
		||||
                android:id="@+id/titleView"
 | 
			
		||||
                android:layout_width="0dp"
 | 
			
		||||
                android:layout_height="wrap_content"
 | 
			
		||||
                android:layout_marginLeft="16dp"
 | 
			
		||||
                android:layout_marginRight="16dp"
 | 
			
		||||
                android:layout_marginTop="8dp"
 | 
			
		||||
                android:textAppearance="@style/TextAppearance.AppCompat.Headline"
 | 
			
		||||
                android:textStyle="bold"
 | 
			
		||||
                app:layout_constraintHorizontal_bias="0.0"
 | 
			
		||||
                app:layout_constraintLeft_toLeftOf="parent"
 | 
			
		||||
                app:layout_constraintRight_toRightOf="parent"
 | 
			
		||||
                app:layout_constraintTop_toBottomOf="@+id/imageView" />
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
            <WebView
 | 
			
		||||
                android:id="@+id/webcontent"
 | 
			
		||||
                android:layout_width="0dp"
 | 
			
		||||
                android:layout_height="wrap_content"
 | 
			
		||||
                android:layout_marginLeft="16dp"
 | 
			
		||||
                android:layout_marginTop="24dp"
 | 
			
		||||
                android:layout_marginRight="16dp"
 | 
			
		||||
                android:background="?attr/webviewBackground"
 | 
			
		||||
                android:paddingBottom="48dp"
 | 
			
		||||
                android:textColorLink="?attr/colorAccent"
 | 
			
		||||
                android:visibility="gone"
 | 
			
		||||
                android:layout_marginLeft="16dp"
 | 
			
		||||
                android:layout_marginRight="16dp"
 | 
			
		||||
                android:layout_marginTop="24dp"
 | 
			
		||||
                android:paddingBottom="48dp"
 | 
			
		||||
                android:background="?attr/webviewBackground"
 | 
			
		||||
                app:layout_constraintHorizontal_bias="0.0"
 | 
			
		||||
                app:layout_constraintLeft_toLeftOf="parent"
 | 
			
		||||
                app:layout_constraintRight_toRightOf="parent"
 | 
			
		||||
                app:layout_constraintEnd_toEndOf="parent"
 | 
			
		||||
                app:layout_constraintStart_toStartOf="parent"
 | 
			
		||||
                app:layout_constraintTop_toBottomOf="@+id/source"
 | 
			
		||||
                tools:visibility="visible" />
 | 
			
		||||
 | 
			
		||||
@@ -80,10 +74,10 @@
 | 
			
		||||
    <FrameLayout
 | 
			
		||||
        android:layout_width="match_parent"
 | 
			
		||||
        android:layout_height="wrap_content"
 | 
			
		||||
        android:layout_gravity="start|bottom|end"
 | 
			
		||||
        app:layout_constraintBottom_toBottomOf="parent"
 | 
			
		||||
        app:layout_constraintEnd_toEndOf="parent"
 | 
			
		||||
        app:layout_constraintLeft_toLeftOf="parent"
 | 
			
		||||
        android:layout_gravity="end|bottom|end">
 | 
			
		||||
        app:layout_constraintStart_toStartOf="parent">
 | 
			
		||||
 | 
			
		||||
        <com.github.rubensousa.floatingtoolbar.FloatingToolbar
 | 
			
		||||
            android:id="@+id/floatingToolbar"
 | 
			
		||||
@@ -96,11 +90,11 @@
 | 
			
		||||
            android:id="@+id/fab"
 | 
			
		||||
            android:layout_width="wrap_content"
 | 
			
		||||
            android:layout_height="wrap_content"
 | 
			
		||||
            android:layout_gravity="end|bottom|end"
 | 
			
		||||
            android:layout_marginBottom="16dp"
 | 
			
		||||
            android:layout_gravity="end|bottom"
 | 
			
		||||
            android:layout_marginEnd="16dp"
 | 
			
		||||
            android:paddingBottom="@dimen/activity_vertical_margin"
 | 
			
		||||
            android:layout_marginBottom="16dp"
 | 
			
		||||
            android:paddingTop="@dimen/activity_vertical_margin"
 | 
			
		||||
            android:paddingBottom="@dimen/activity_vertical_margin"
 | 
			
		||||
            android:src="@drawable/ic_add_white_24dp"
 | 
			
		||||
            app:backgroundTint="?attr/colorAccent"
 | 
			
		||||
            app:fabSize="mini"
 | 
			
		||||
@@ -111,11 +105,11 @@
 | 
			
		||||
        android:id="@+id/progressBar"
 | 
			
		||||
        android:layout_width="match_parent"
 | 
			
		||||
        android:layout_height="match_parent"
 | 
			
		||||
        android:visibility="gone"
 | 
			
		||||
        android:animateLayoutChanges="true"
 | 
			
		||||
        android:alpha="0.8"
 | 
			
		||||
        android:animateLayoutChanges="true"
 | 
			
		||||
        android:background="@color/black"
 | 
			
		||||
        android:clickable="false">
 | 
			
		||||
        android:clickable="false"
 | 
			
		||||
        android:visibility="gone">
 | 
			
		||||
 | 
			
		||||
        <ProgressBar
 | 
			
		||||
            style="?android:attr/progressBarStyleLarge"
 | 
			
		||||
 
 | 
			
		||||
@@ -3,17 +3,16 @@
 | 
			
		||||
    xmlns:app="http://schemas.android.com/apk/res-auto"
 | 
			
		||||
    xmlns:tools="http://schemas.android.com/tools"
 | 
			
		||||
    android:layout_width="match_parent"
 | 
			
		||||
    android:layout_height="88dp">
 | 
			
		||||
    android:layout_height="wrap_content">
 | 
			
		||||
 | 
			
		||||
    <ImageView
 | 
			
		||||
        android:id="@+id/itemImage"
 | 
			
		||||
        android:layout_width="46dp"
 | 
			
		||||
        android:layout_height="46dp"
 | 
			
		||||
        android:layout_marginStart="8dp"
 | 
			
		||||
        android:layout_marginTop="21dp"
 | 
			
		||||
        app:layout_constraintBottom_toBottomOf="parent"
 | 
			
		||||
        app:layout_constraintStart_toStartOf="parent"
 | 
			
		||||
        app:layout_constraintTop_toTopOf="parent"
 | 
			
		||||
        android:layout_marginLeft="8dp" />
 | 
			
		||||
        app:layout_constraintTop_toTopOf="parent" />
 | 
			
		||||
 | 
			
		||||
    <TextView
 | 
			
		||||
        android:id="@+id/title"
 | 
			
		||||
@@ -24,39 +23,30 @@
 | 
			
		||||
        android:layout_marginEnd="16dp"
 | 
			
		||||
        android:ellipsize="end"
 | 
			
		||||
        android:fontFamily="sans-serif"
 | 
			
		||||
        android:gravity="start"
 | 
			
		||||
        android:maxLines="3"
 | 
			
		||||
        android:textAlignment="viewStart"
 | 
			
		||||
        android:textAllCaps="false"
 | 
			
		||||
        android:textColor="?android:textColorPrimary"
 | 
			
		||||
        android:textSize="16sp"
 | 
			
		||||
        android:textStyle="bold"
 | 
			
		||||
        android:textColor="?android:textColorPrimary"
 | 
			
		||||
        app:layout_constraintEnd_toEndOf="parent"
 | 
			
		||||
        app:layout_constraintHorizontal_bias="0.0"
 | 
			
		||||
        app:layout_constraintStart_toEndOf="@+id/itemImage"
 | 
			
		||||
        app:layout_constraintTop_toTopOf="parent"
 | 
			
		||||
        tools:text="Titre"
 | 
			
		||||
        android:layout_marginLeft="8dp"
 | 
			
		||||
        android:layout_marginRight="16dp" />
 | 
			
		||||
        tools:text="Titre" />
 | 
			
		||||
 | 
			
		||||
    <TextView
 | 
			
		||||
        android:id="@+id/sourceTitleAndDate"
 | 
			
		||||
        android:layout_width="0dp"
 | 
			
		||||
        android:layout_height="wrap_content"
 | 
			
		||||
        android:layout_marginStart="8dp"
 | 
			
		||||
        android:layout_marginTop="66dp"
 | 
			
		||||
        android:layout_marginEnd="16dp"
 | 
			
		||||
        android:gravity="start"
 | 
			
		||||
        android:maxLines="1"
 | 
			
		||||
        android:textAlignment="viewStart"
 | 
			
		||||
        android:textSize="14sp"
 | 
			
		||||
        android:textColor="?android:textColorPrimary"
 | 
			
		||||
        android:textSize="14sp"
 | 
			
		||||
        app:layout_constraintEnd_toEndOf="parent"
 | 
			
		||||
        app:layout_constraintHorizontal_bias="0.0"
 | 
			
		||||
        app:layout_constraintStart_toEndOf="@+id/itemImage"
 | 
			
		||||
        app:layout_constraintTop_toTopOf="parent"
 | 
			
		||||
        tools:text="Google Actualité Il y a 5h"
 | 
			
		||||
        android:layout_marginLeft="8dp"
 | 
			
		||||
        android:layout_marginRight="16dp" />
 | 
			
		||||
        app:layout_constraintTop_toBottomOf="@+id/itemImage"
 | 
			
		||||
        tools:text="Google Actualité Il y a 5h" />
 | 
			
		||||
 | 
			
		||||
</androidx.constraintlayout.widget.ConstraintLayout>
 | 
			
		||||
@@ -12,9 +12,9 @@
 | 
			
		||||
        style="@style/Widget.AppCompat.Button.Borderless"
 | 
			
		||||
        android:layout_width="48dp"
 | 
			
		||||
        android:layout_height="wrap_content"
 | 
			
		||||
        android:layout_marginBottom="8dp"
 | 
			
		||||
        android:layout_marginEnd="8dp"
 | 
			
		||||
        android:layout_marginTop="8dp"
 | 
			
		||||
        android:layout_marginEnd="8dp"
 | 
			
		||||
        android:layout_marginBottom="8dp"
 | 
			
		||||
        android:background="@drawable/ic_remove_circle_outline_black_24dp"
 | 
			
		||||
        android:backgroundTint="?android:textColorSecondary"
 | 
			
		||||
        android:contentDescription="@string/remove_source"
 | 
			
		||||
@@ -29,48 +29,48 @@
 | 
			
		||||
        android:id="@+id/itemImage"
 | 
			
		||||
        android:layout_width="36dp"
 | 
			
		||||
        android:layout_height="36dp"
 | 
			
		||||
        android:layout_marginBottom="8dp"
 | 
			
		||||
        android:layout_marginLeft="8dp"
 | 
			
		||||
        android:layout_marginStart="8dp"
 | 
			
		||||
        android:layout_marginTop="8dp"
 | 
			
		||||
        android:layout_marginBottom="8dp"
 | 
			
		||||
        android:importantForAccessibility="no"
 | 
			
		||||
        app:layout_constraintBottom_toBottomOf="parent"
 | 
			
		||||
        app:layout_constraintLeft_toLeftOf="parent"
 | 
			
		||||
        app:layout_constraintStart_toStartOf="parent"
 | 
			
		||||
        app:layout_constraintTop_toTopOf="parent"
 | 
			
		||||
        app:layout_constraintVertical_bias="0.0" />
 | 
			
		||||
 | 
			
		||||
    <TextView
 | 
			
		||||
        android:id="@+id/sourceTitle"
 | 
			
		||||
        android:layout_width="0dp"
 | 
			
		||||
        android:layout_height="17dp"
 | 
			
		||||
        android:layout_height="wrap_content"
 | 
			
		||||
        android:layout_marginStart="8dp"
 | 
			
		||||
        android:ellipsize="end"
 | 
			
		||||
        android:gravity="start"
 | 
			
		||||
        android:maxLines="1"
 | 
			
		||||
        android:textAlignment="textStart"
 | 
			
		||||
        android:textAlignment="viewStart"
 | 
			
		||||
        android:textColor="?android:textColorPrimary"
 | 
			
		||||
        android:textSize="13sp"
 | 
			
		||||
        android:textSize="20sp"
 | 
			
		||||
        android:textStyle="bold"
 | 
			
		||||
        app:layout_constraintBottom_toTopOf="@+id/errorText"
 | 
			
		||||
        app:layout_constraintEnd_toStartOf="@+id/deleteBtn"
 | 
			
		||||
        app:layout_constraintStart_toEndOf="@+id/itemImage"
 | 
			
		||||
        app:layout_constraintTop_toTopOf="parent"
 | 
			
		||||
        tools:text="source title" />
 | 
			
		||||
        tools:text="Source title" />
 | 
			
		||||
 | 
			
		||||
    <TextView
 | 
			
		||||
        android:id="@+id/errorText"
 | 
			
		||||
        android:layout_width="0dp"
 | 
			
		||||
        android:layout_height="wrap_content"
 | 
			
		||||
        android:layout_marginBottom="8dp"
 | 
			
		||||
        android:layout_marginEnd="16dp"
 | 
			
		||||
        android:layout_marginStart="16dp"
 | 
			
		||||
        android:layout_marginStart="10sp"
 | 
			
		||||
        android:layout_marginTop="8dp"
 | 
			
		||||
        android:layout_marginBottom="8dp"
 | 
			
		||||
        android:textAppearance="@style/TextAppearance.AppCompat.Small"
 | 
			
		||||
        android:textColor="@color/red"
 | 
			
		||||
        android:textStyle="italic"
 | 
			
		||||
        android:visibility="gone"
 | 
			
		||||
        app:layout_constraintBottom_toBottomOf="parent"
 | 
			
		||||
        app:layout_constraintEnd_toEndOf="parent"
 | 
			
		||||
        app:layout_constraintEnd_toStartOf="@+id/deleteBtn"
 | 
			
		||||
        app:layout_constraintStart_toStartOf="parent"
 | 
			
		||||
        app:layout_constraintTop_toBottomOf="@+id/itemImage"
 | 
			
		||||
        tools:text="Test"
 | 
			
		||||
        tools:text="Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua."
 | 
			
		||||
        tools:visibility="visible" />
 | 
			
		||||
 | 
			
		||||
</androidx.constraintlayout.widget.ConstraintLayout>
 | 
			
		||||
@@ -9,7 +9,6 @@ import org.kodein.di.instance
 | 
			
		||||
import org.kodein.di.singleton
 | 
			
		||||
 | 
			
		||||
val networkModule by DI.Module {
 | 
			
		||||
    bind<AppSettingsService>() with singleton { AppSettingsService() }
 | 
			
		||||
    bind<SelfossApi>() with singleton { SelfossApi(instance()) }
 | 
			
		||||
    bind<MercuryApi>() with singleton { MercuryApi() }
 | 
			
		||||
}
 | 
			
		||||
@@ -24,8 +24,8 @@ class SelfossModel {
 | 
			
		||||
    @Serializable
 | 
			
		||||
    class Stats(
 | 
			
		||||
        val total: Int,
 | 
			
		||||
        val unread: Int,
 | 
			
		||||
        val starred: Int
 | 
			
		||||
        val unread: Int?,
 | 
			
		||||
        val starred: Int?
 | 
			
		||||
    )
 | 
			
		||||
 | 
			
		||||
    @Serializable
 | 
			
		||||
@@ -76,7 +76,7 @@ class SelfossModel {
 | 
			
		||||
    )
 | 
			
		||||
    @Serializable
 | 
			
		||||
    data class SourceParams(
 | 
			
		||||
        val url: String
 | 
			
		||||
        val url: String? = null
 | 
			
		||||
    )
 | 
			
		||||
    @Serializable
 | 
			
		||||
    data class Item(
 | 
			
		||||
 
 | 
			
		||||
@@ -132,9 +132,9 @@ class Repository(
 | 
			
		||||
        if (isNetworkAvailable()) {
 | 
			
		||||
            val response = api.stats()
 | 
			
		||||
            if (response.success && response.data != null) {
 | 
			
		||||
                _badgeUnread.value = response.data.unread
 | 
			
		||||
                _badgeUnread.value = response.data.unread ?: 0
 | 
			
		||||
                _badgeAll.value = response.data.total
 | 
			
		||||
                _badgeStarred.value = response.data.starred
 | 
			
		||||
                _badgeStarred.value = response.data.starred ?: 0
 | 
			
		||||
                success = true
 | 
			
		||||
            }
 | 
			
		||||
        } else if (appSettingsService.isItemCachingEnabled()) {
 | 
			
		||||
 
 | 
			
		||||
@@ -0,0 +1,70 @@
 | 
			
		||||
package bou.amine.apps.readerforselfossv2.service
 | 
			
		||||
 | 
			
		||||
import com.russhwolf.settings.Settings
 | 
			
		||||
 | 
			
		||||
// This will be used in ACRA process. For now, it does nothing.
 | 
			
		||||
// This is to fix ACRA not sending reports anymore.
 | 
			
		||||
// See https://www.acra.ch/docs/Troubleshooting-Guide#applicationoncreate
 | 
			
		||||
class ACRASettings : Settings {
 | 
			
		||||
    override val keys: Set<String> = emptySet()
 | 
			
		||||
    override val size: Int = 0
 | 
			
		||||
 | 
			
		||||
    override fun clear() {
 | 
			
		||||
        // Nothing
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    override fun getBoolean(key: String, defaultValue: Boolean): Boolean = false
 | 
			
		||||
 | 
			
		||||
    override fun getBooleanOrNull(key: String): Boolean? = null
 | 
			
		||||
 | 
			
		||||
    override fun getDouble(key: String, defaultValue: Double): Double = 0.0
 | 
			
		||||
 | 
			
		||||
    override fun getDoubleOrNull(key: String): Double? = null
 | 
			
		||||
 | 
			
		||||
    override fun getFloat(key: String, defaultValue: Float): Float = 0.0F
 | 
			
		||||
 | 
			
		||||
    override fun getFloatOrNull(key: String): Float? = null
 | 
			
		||||
 | 
			
		||||
    override fun getInt(key: String, defaultValue: Int): Int = 0
 | 
			
		||||
 | 
			
		||||
    override fun getIntOrNull(key: String): Int? = null
 | 
			
		||||
 | 
			
		||||
    override fun getLong(key: String, defaultValue: Long): Long = 0
 | 
			
		||||
 | 
			
		||||
    override fun getLongOrNull(key: String): Long? = null
 | 
			
		||||
 | 
			
		||||
    override fun getString(key: String, defaultValue: String): String = "0"
 | 
			
		||||
 | 
			
		||||
    override fun getStringOrNull(key: String): String? = null
 | 
			
		||||
 | 
			
		||||
    override fun hasKey(key: String): Boolean = false
 | 
			
		||||
 | 
			
		||||
    override fun putBoolean(key: String, value: Boolean) {
 | 
			
		||||
        // Nothing
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    override fun putDouble(key: String, value: Double) {
 | 
			
		||||
        // Nothing
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    override fun putFloat(key: String, value: Float) {
 | 
			
		||||
        // Nothing
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    override fun putInt(key: String, value: Int) {
 | 
			
		||||
        // Nothing
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    override fun putLong(key: String, value: Long) {
 | 
			
		||||
        // Nothing
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    override fun putString(key: String, value: String) {
 | 
			
		||||
        // Nothing
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    override fun remove(key: String) {
 | 
			
		||||
        // Nothing
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
@@ -2,8 +2,8 @@ package bou.amine.apps.readerforselfossv2.service
 | 
			
		||||
 | 
			
		||||
import com.russhwolf.settings.Settings
 | 
			
		||||
 | 
			
		||||
class AppSettingsService {
 | 
			
		||||
    val settings: Settings = Settings()
 | 
			
		||||
class AppSettingsService(acraSenderServiceProcess: Boolean = false) {
 | 
			
		||||
    val settings: Settings = if (acraSenderServiceProcess) { ACRASettings() } else { Settings() }
 | 
			
		||||
 | 
			
		||||
    // Api related
 | 
			
		||||
    private var _apiVersion: Int = -1
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user