Compare commits

..

13 Commits

Author SHA1 Message Date
9eac51e729 Closes #257. 2018-12-09 16:38:35 +01:00
fa9cce6783 Removed some logs. 2018-12-09 14:26:20 +01:00
f0d4b63a97 Merge pull request #256 from aminecmi/fdroid/build
Fixes #254 and #255.
2018-12-02 13:22:37 +01:00
83eeb11388 Fixes #254 and #255. 2018-12-02 13:13:19 +01:00
01f746f33d Merge pull request #255 from aminecmi/fdroid/build
A fix for #254.
2018-12-02 03:54:36 +01:00
200851894b See #254. 2018-12-01 19:32:28 +01:00
862e5cf4ab New Crowdin translations (#253)
* New translations strings.xml (Spanish)

* New translations strings.xml (Galician)

* New translations strings.xml (Spanish)
2018-11-29 06:06:32 +01:00
0b07f2a407 Closes #174. Closes #248. 2018-11-28 21:03:00 +01:00
9ba6feef0b Removed density calculation to solve #248. 2018-11-27 21:44:34 +01:00
63a0638522 Removed throw... 2018-11-27 21:36:12 +01:00
f9a4e6e363 New Crowdin translations (#252)
* New translations strings.xml (Catalan)

* New translations strings.xml (Japanese)

* New translations strings.xml (Vietnamese)

* New translations strings.xml (Ukrainian)

* New translations strings.xml (Turkish)

* New translations strings.xml (Swedish)

* New translations strings.xml (Spanish)

* New translations strings.xml (Serbian (Cyrillic))

* New translations strings.xml (Russian)

* New translations strings.xml (Romanian)

* New translations strings.xml (Portuguese, Brazilian)

* New translations strings.xml (Portuguese)

* New translations strings.xml (Polish)

* New translations strings.xml (Norwegian)

* New translations strings.xml (Korean)

* New translations strings.xml (Italian)

* New translations strings.xml (Afrikaans)

* New translations strings.xml (Indonesian)

* New translations strings.xml (Hungarian)

* New translations strings.xml (Hebrew)

* New translations strings.xml (Greek)

* New translations strings.xml (German)

* New translations strings.xml (French)

* New translations strings.xml (Finnish)

* New translations strings.xml (Dutch)

* New translations strings.xml (Danish)

* New translations strings.xml (Czech)

* New translations strings.xml (Chinese Traditional)

* New translations strings.xml (Chinese Simplified)

* New translations strings.xml (Arabic)

* New translations strings.xml (Galician)

* New translations strings.xml (Catalan)

* New translations strings.xml (Japanese)

* New translations strings.xml (Vietnamese)

* New translations strings.xml (Ukrainian)

* New translations strings.xml (Turkish)

* New translations strings.xml (Swedish)

* New translations strings.xml (Spanish)

* New translations strings.xml (Serbian (Cyrillic))

* New translations strings.xml (Russian)

* New translations strings.xml (Romanian)

* New translations strings.xml (Portuguese, Brazilian)

* New translations strings.xml (Portuguese)

* New translations strings.xml (Polish)

* New translations strings.xml (Norwegian)

* New translations strings.xml (Korean)

* New translations strings.xml (Italian)

* New translations strings.xml (Afrikaans)

* New translations strings.xml (Indonesian)

* New translations strings.xml (Hungarian)

* New translations strings.xml (Hebrew)

* New translations strings.xml (Greek)

* New translations strings.xml (German)

* New translations strings.xml (French)

* New translations strings.xml (Finnish)

* New translations strings.xml (Dutch)

* New translations strings.xml (Danish)

* New translations strings.xml (Czech)

* New translations strings.xml (Chinese Traditional)

* New translations strings.xml (Chinese Simplified)

* New translations strings.xml (Arabic)

* New translations strings.xml (Galician)

* New translations strings.xml (French)
2018-11-27 21:32:12 +01:00
6b40fd4bdc Typos. 2018-11-27 21:25:18 +01:00
04c7776466 Trying to fix an issue with webview not available with the article viewer. Fixed an issue when the browser isn't available. 2018-11-27 21:14:03 +01:00
40 changed files with 325 additions and 147 deletions

View File

@ -2,7 +2,15 @@ buildscript {
} }
def gitVersion() { def gitVersion() {
def process = "git for-each-ref refs/tags --sort=-authordate --format='%(refname:short)' --count=1".execute() def process
def maybeTagOfCurrentCommit = 'git describe --contains HEAD'.execute()
if (maybeTagOfCurrentCommit.text.isEmpty()) {
println "No tag on current commit. Will take the latest one."
process = "git for-each-ref refs/tags --sort=-authordate --format='%(refname:short)' --count=1".execute()
} else {
println "Tag found on current commit"
process = 'git describe --contains HEAD'.execute()
}
return process.text.replaceAll("'", "").substring(1).replaceAll("\\.", "").trim() return process.text.replaceAll("'", "").substring(1).replaceAll("\\.", "").trim()
} }

View File

@ -1,5 +1,6 @@
package apps.amine.bou.readerforselfoss package apps.amine.bou.readerforselfoss
import android.content.SharedPreferences
import android.graphics.drawable.ColorDrawable import android.graphics.drawable.ColorDrawable
import android.os.Build import android.os.Build
import android.os.Bundle import android.os.Bundle
@ -13,6 +14,7 @@ import android.view.Menu
import android.view.MenuItem import android.view.MenuItem
import android.view.ViewGroup import android.view.ViewGroup
import android.widget.Toast import android.widget.Toast
import androidx.fragment.app.Fragment
import androidx.room.Room import androidx.room.Room
import apps.amine.bou.readerforselfoss.api.selfoss.Item import apps.amine.bou.readerforselfoss.api.selfoss.Item
import apps.amine.bou.readerforselfoss.api.selfoss.SelfossApi import apps.amine.bou.readerforselfoss.api.selfoss.SelfossApi
@ -51,6 +53,11 @@ class ReaderActivity : AppCompatActivity() {
private lateinit var toolbarMenu: Menu private lateinit var toolbarMenu: Menu
private lateinit var db: AppDatabase private lateinit var db: AppDatabase
private lateinit var prefs: SharedPreferences
private var activeAlignment: Int = 1
val JUSTIFY = 1
val ALIGN_LEFT = 2
private fun showMenuItem(willAddToFavorite: Boolean) { private fun showMenuItem(willAddToFavorite: Boolean) {
toolbarMenu.findItem(R.id.save).isVisible = willAddToFavorite toolbarMenu.findItem(R.id.save).isVisible = willAddToFavorite
@ -65,6 +72,8 @@ class ReaderActivity : AppCompatActivity() {
showMenuItem(false) showMenuItem(false)
} }
private lateinit var editor: SharedPreferences.Editor
override fun onCreate(savedInstanceState: Bundle?) { override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState) super.onCreate(savedInstanceState)
@ -85,11 +94,13 @@ class ReaderActivity : AppCompatActivity() {
supportActionBar?.setDisplayHomeAsUpEnabled(true) supportActionBar?.setDisplayHomeAsUpEnabled(true)
supportActionBar?.setDisplayShowHomeEnabled(true) supportActionBar?.setDisplayShowHomeEnabled(true)
val prefs = PreferenceManager.getDefaultSharedPreferences(this) prefs = PreferenceManager.getDefaultSharedPreferences(this)
editor = prefs.edit()
debugReadingItems = prefs.getBoolean("read_debug", false) debugReadingItems = prefs.getBoolean("read_debug", false)
userIdentifier = prefs.getString("unique_id", "") userIdentifier = prefs.getString("unique_id", "")
markOnScroll = prefs.getBoolean("mark_on_scroll", false) markOnScroll = prefs.getBoolean("mark_on_scroll", false)
activeAlignment = prefs.getInt("text_align", JUSTIFY)
api = SelfossApi( api = SelfossApi(
this, this,
@ -223,6 +234,11 @@ class ReaderActivity : AppCompatActivity() {
} }
} }
fun alignmentMenu(showJustify: Boolean) {
toolbarMenu.findItem(R.id.align_left).isVisible = !showJustify
toolbarMenu.findItem(R.id.align_justify).isVisible = showJustify
}
override fun onCreateOptionsMenu(menu: Menu): Boolean { override fun onCreateOptionsMenu(menu: Menu): Boolean {
val inflater = menuInflater val inflater = menuInflater
inflater.inflate(R.menu.reader_menu, menu) inflater.inflate(R.menu.reader_menu, menu)
@ -233,6 +249,11 @@ class ReaderActivity : AppCompatActivity() {
} else { } else {
canFavorite() canFavorite()
} }
if (activeAlignment == JUSTIFY) {
alignmentMenu(false)
} else {
alignmentMenu(true)
}
return true return true
} }
@ -314,10 +335,29 @@ class ReaderActivity : AppCompatActivity() {
} }
} }
} }
R.id.align_left -> {
editor.putInt("text_align", ALIGN_LEFT)
editor.apply()
alignmentMenu(true)
refreshFragment()
}
R.id.align_justify -> {
editor.putInt("text_align", JUSTIFY)
editor.apply()
alignmentMenu(false)
refreshFragment()
}
} }
return super.onOptionsItemSelected(item) return super.onOptionsItemSelected(item)
} }
private fun refreshFragment() {
finish()
overridePendingTransition(0, 0)
startActivity(intent)
overridePendingTransition(0, 0)
}
companion object { companion object {
var allItems: ArrayList<Item> = ArrayList() var allItems: ArrayList<Item> = ArrayList()
} }

View File

@ -7,6 +7,7 @@ import android.graphics.drawable.ColorDrawable
import android.os.Build import android.os.Build
import android.os.Bundle import android.os.Bundle
import android.preference.PreferenceManager import android.preference.PreferenceManager
import android.view.InflateException
import androidx.browser.customtabs.CustomTabsIntent import androidx.browser.customtabs.CustomTabsIntent
import com.google.android.material.floatingactionbutton.FloatingActionButton import com.google.android.material.floatingactionbutton.FloatingActionButton
import androidx.fragment.app.Fragment import androidx.fragment.app.Fragment
@ -17,6 +18,7 @@ import android.view.MenuItem
import android.view.View import android.view.View
import android.view.ViewGroup import android.view.ViewGroup
import android.webkit.WebSettings import android.webkit.WebSettings
import androidx.appcompat.app.AlertDialog
import androidx.room.Room import androidx.room.Room
import apps.amine.bou.readerforselfoss.R import apps.amine.bou.readerforselfoss.R
import apps.amine.bou.readerforselfoss.api.mercury.MercuryApi import apps.amine.bou.readerforselfoss.api.mercury.MercuryApi
@ -39,7 +41,6 @@ import apps.amine.bou.readerforselfoss.utils.openItemUrl
import apps.amine.bou.readerforselfoss.utils.shareLink import apps.amine.bou.readerforselfoss.utils.shareLink
import apps.amine.bou.readerforselfoss.utils.sourceAndDateText import apps.amine.bou.readerforselfoss.utils.sourceAndDateText
import apps.amine.bou.readerforselfoss.utils.succeeded import apps.amine.bou.readerforselfoss.utils.succeeded
import apps.amine.bou.readerforselfoss.utils.toPx
import com.bumptech.glide.Glide import com.bumptech.glide.Glide
import com.bumptech.glide.request.RequestOptions import com.bumptech.glide.request.RequestOptions
import com.github.rubensousa.floatingtoolbar.FloatingToolbar import com.github.rubensousa.floatingtoolbar.FloatingToolbar
@ -54,9 +55,9 @@ import kotlin.concurrent.thread
class ArticleFragment : Fragment() { class ArticleFragment : Fragment() {
private lateinit var pageNumber: Number private lateinit var pageNumber: Number
private var fontSize: Int = 14 private var fontSize: Int = 16
private lateinit var allItems: ArrayList<Item> private lateinit var allItems: ArrayList<Item>
private lateinit var mCustomTabActivityHelper: CustomTabActivityHelper private var mCustomTabActivityHelper: CustomTabActivityHelper? = null;
private lateinit var url: String private lateinit var url: String
private lateinit var contentText: String private lateinit var contentText: String
private lateinit var contentSource: String private lateinit var contentSource: String
@ -66,10 +67,13 @@ class ArticleFragment : Fragment() {
private lateinit var fab: FloatingActionButton private lateinit var fab: FloatingActionButton
private lateinit var appColors: AppColors private lateinit var appColors: AppColors
private lateinit var db: AppDatabase private lateinit var db: AppDatabase
private lateinit var textAlignment: String
override fun onStop() { override fun onStop() {
super.onStop() super.onStop()
mCustomTabActivityHelper.unbindCustomTabsService(activity) if (mCustomTabActivityHelper != null) {
mCustomTabActivityHelper!!.unbindCustomTabsService(activity)
}
} }
override fun onCreate(savedInstanceState: Bundle?) { override fun onCreate(savedInstanceState: Bundle?) {
@ -86,154 +90,181 @@ class ArticleFragment : Fragment() {
).addMigrations(MIGRATION_1_2).addMigrations(MIGRATION_2_3).build() ).addMigrations(MIGRATION_1_2).addMigrations(MIGRATION_2_3).build()
} }
private lateinit var rootView: ViewGroup private var rootView: ViewGroup? = null
private lateinit var prefs: SharedPreferences
override fun onCreateView( override fun onCreateView(
inflater: LayoutInflater, inflater: LayoutInflater,
container: ViewGroup?, container: ViewGroup?,
savedInstanceState: Bundle? savedInstanceState: Bundle?
): View? { ): View? {
rootView = inflater try {
.inflate(R.layout.fragment_article, container, false) as ViewGroup rootView = inflater
.inflate(R.layout.fragment_article, container, false) as ViewGroup
url = allItems[pageNumber.toInt()].getLinkDecoded() url = allItems[pageNumber.toInt()].getLinkDecoded()
contentText = allItems[pageNumber.toInt()].content contentText = allItems[pageNumber.toInt()].content
contentTitle = allItems[pageNumber.toInt()].title contentTitle = allItems[pageNumber.toInt()].title
contentImage = allItems[pageNumber.toInt()].getThumbnail(activity!!) contentImage = allItems[pageNumber.toInt()].getThumbnail(activity!!)
contentSource = allItems[pageNumber.toInt()].sourceAndDateText() contentSource = allItems[pageNumber.toInt()].sourceAndDateText()
val prefs = PreferenceManager.getDefaultSharedPreferences(activity) prefs = PreferenceManager.getDefaultSharedPreferences(activity)
editor = prefs.edit() editor = prefs.edit()
fontSize = prefs.getString("reader_font_size", "14").toInt() fontSize = prefs.getString("reader_font_size", "16").toInt()
refreshAlignment()
val settings = activity!!.getSharedPreferences(Config.settingsName, Context.MODE_PRIVATE) val settings = activity!!.getSharedPreferences(Config.settingsName, Context.MODE_PRIVATE)
val debugReadingItems = prefs.getBoolean("read_debug", false) val debugReadingItems = prefs.getBoolean("read_debug", false)
val api = SelfossApi( val api = SelfossApi(
context!!, context!!,
activity!!, activity!!,
settings.getBoolean("isSelfSignedCert", false), settings.getBoolean("isSelfSignedCert", false),
prefs.getString("api_timeout", "-1").toLong(), prefs.getString("api_timeout", "-1").toLong(),
prefs.getBoolean("should_log_everything", false) prefs.getBoolean("should_log_everything", false)
) )
fab = rootView.fab fab = rootView!!.fab
fab.backgroundTintList = ColorStateList.valueOf(appColors.colorAccent) fab.backgroundTintList = ColorStateList.valueOf(appColors.colorAccent)
fab.rippleColor = appColors.colorAccentDark fab.rippleColor = appColors.colorAccentDark
val floatingToolbar: FloatingToolbar = rootView.floatingToolbar val floatingToolbar: FloatingToolbar = rootView!!.floatingToolbar
floatingToolbar.attachFab(fab) floatingToolbar.attachFab(fab)
floatingToolbar.background = ColorDrawable(appColors.colorAccent) floatingToolbar.background = ColorDrawable(appColors.colorAccent)
val customTabsIntent = activity!!.buildCustomTabsIntent() val customTabsIntent = activity!!.buildCustomTabsIntent()
mCustomTabActivityHelper = CustomTabActivityHelper() mCustomTabActivityHelper = CustomTabActivityHelper()
mCustomTabActivityHelper.bindCustomTabsService(activity) mCustomTabActivityHelper!!.bindCustomTabsService(activity)
floatingToolbar.setClickListener( floatingToolbar.setClickListener(
object : FloatingToolbar.ItemClickListener { object : FloatingToolbar.ItemClickListener {
override fun onItemClick(item: MenuItem) { override fun onItemClick(item: MenuItem) {
when (item.itemId) { when (item.itemId) {
R.id.more_action -> getContentFromMercury(customTabsIntent, prefs) R.id.more_action -> getContentFromMercury(customTabsIntent, prefs)
R.id.share_action -> activity!!.shareLink(url, contentTitle) R.id.share_action -> activity!!.shareLink(url, contentTitle)
R.id.open_action -> activity!!.openItemUrl( R.id.open_action -> activity!!.openItemUrl(
allItems, allItems,
pageNumber.toInt(), pageNumber.toInt(),
url, url,
customTabsIntent, customTabsIntent,
false, false,
false, false,
activity!! activity!!
)
R.id.unread_action -> if ((context != null && context!!.isNetworkAccessible(null)) || context == null) {
api.unmarkItem(allItems[pageNumber.toInt()].id).enqueue(
object : Callback<SuccessResponse> {
override fun onResponse(
call: Call<SuccessResponse>,
response: Response<SuccessResponse>
) {
if (!response.succeeded() && debugReadingItems) {
val message =
"message: ${response.message()} " +
"response isSuccess: ${response.isSuccessful} " +
"response code: ${response.code()} " +
"response message: ${response.message()} " +
"response errorBody: ${response.errorBody()?.string()} " +
"body success: ${response.body()?.success} " +
"body isSuccess: ${response.body()?.isSuccess}"
ACRA.getErrorReporter().maybeHandleSilentException(Exception(message), activity!!)
}
}
override fun onFailure(
call: Call<SuccessResponse>,
t: Throwable
) {
if (debugReadingItems) {
ACRA.getErrorReporter().maybeHandleSilentException(t, activity!!)
}
}
}
) )
} else { R.id.unread_action -> if ((context != null && context!!.isNetworkAccessible(null)) || context == null) {
thread { api.unmarkItem(allItems[pageNumber.toInt()].id).enqueue(
db.actionsDao().insertAllActions(ActionEntity(allItems[pageNumber.toInt()].id, false, true, false, false)) object : Callback<SuccessResponse> {
override fun onResponse(
call: Call<SuccessResponse>,
response: Response<SuccessResponse>
) {
if (!response.succeeded() && debugReadingItems) {
val message =
"message: ${response.message()} " +
"response isSuccess: ${response.isSuccessful} " +
"response code: ${response.code()} " +
"response message: ${response.message()} " +
"response errorBody: ${response.errorBody()?.string()} " +
"body success: ${response.body()?.success} " +
"body isSuccess: ${response.body()?.isSuccess}"
ACRA.getErrorReporter().maybeHandleSilentException(Exception(message), activity!!)
}
}
override fun onFailure(
call: Call<SuccessResponse>,
t: Throwable
) {
if (debugReadingItems) {
ACRA.getErrorReporter().maybeHandleSilentException(t, activity!!)
}
}
}
)
} else {
thread {
db.actionsDao().insertAllActions(ActionEntity(allItems[pageNumber.toInt()].id, false, true, false, false))
}
} }
else -> Unit
} }
else -> Unit }
override fun onItemLongClick(item: MenuItem?) {
} }
} }
)
override fun onItemLongClick(item: MenuItem?) { rootView!!.source.text = contentSource
if (contentText.isEmptyOrNullOrNullString()) {
getContentFromMercury(customTabsIntent, prefs)
} else {
rootView!!.titleView.text = contentTitle
htmlToWebview()
if (!contentImage.isEmptyOrNullOrNullString() && context != null) {
rootView!!.imageView.visibility = View.VISIBLE
Glide
.with(context!!)
.asBitmap()
.load(contentImage)
.apply(RequestOptions.fitCenterTransform())
.into(rootView!!.imageView)
} else {
rootView!!.imageView.visibility = View.GONE
} }
} }
)
rootView.source.text = contentSource rootView!!.nestedScrollView.setOnScrollChangeListener(
NestedScrollView.OnScrollChangeListener { _, _, scrollY, _, oldScrollY ->
if (scrollY > oldScrollY) {
fab.hide()
} else {
if (floatingToolbar.isShowing) floatingToolbar.hide() else fab.show()
}
}
)
if (contentText.isEmptyOrNullOrNullString()) { } catch (e: InflateException) {
getContentFromMercury(customTabsIntent, prefs) AlertDialog.Builder(context!!)
} else { .setMessage(context!!.getString(R.string.webview_dialog_issue_message))
rootView.titleView.text = contentTitle .setTitle(context!!.getString(R.string.webview_dialog_issue_title))
.setPositiveButton(android.R.string.ok
htmlToWebview(contentText, prefs) ) { dialog, which ->
val sharedPref = PreferenceManager.getDefaultSharedPreferences(context!!)
if (!contentImage.isEmptyOrNullOrNullString() && context != null) { val editor = sharedPref.edit()
rootView.imageView.visibility = View.VISIBLE editor.putBoolean("prefer_article_viewer", false)
Glide editor.commit()
.with(context!!) activity!!.finish()
.asBitmap() }
.load(contentImage) .create()
.apply(RequestOptions.fitCenterTransform()) .show()
.into(rootView.imageView)
} else {
rootView.imageView.visibility = View.GONE
}
} }
rootView.nestedScrollView.setOnScrollChangeListener(
NestedScrollView.OnScrollChangeListener { _, _, scrollY, _, oldScrollY ->
if (scrollY > oldScrollY) {
fab.hide()
} else {
if (floatingToolbar.isShowing) floatingToolbar.hide() else fab.show()
}
}
)
return rootView return rootView
} }
private fun refreshAlignment() {
textAlignment = when (prefs.getInt("text_align", 1)) {
1 -> "justify"
2 -> "left"
else -> "justify"
}
}
private fun getContentFromMercury( private fun getContentFromMercury(
customTabsIntent: CustomTabsIntent, customTabsIntent: CustomTabsIntent,
prefs: SharedPreferences prefs: SharedPreferences
) { ) {
if ((context != null && context!!.isNetworkAccessible(null)) || context == null) { if ((context != null && context!!.isNetworkAccessible(null)) || context == null) {
rootView.progressBar.visibility = View.VISIBLE rootView!!.progressBar.visibility = View.VISIBLE
val parser = MercuryApi( val parser = MercuryApi(
prefs.getBoolean("should_log_everything", false) prefs.getBoolean("should_log_everything", false)
) )
@ -248,13 +279,13 @@ class ArticleFragment : Fragment() {
try { try {
if (response.body() != null && response.body()!!.content != null && !response.body()!!.content.isNullOrEmpty()) { if (response.body() != null && response.body()!!.content != null && !response.body()!!.content.isNullOrEmpty()) {
try { try {
rootView.titleView.text = response.body()!!.title rootView!!.titleView.text = response.body()!!.title
try { try {
// Note: Mercury may return relative urls... If it does the url val will not be changed. // Note: Mercury may return relative urls... If it does the url val will not be changed.
URL(response.body()!!.url) URL(response.body()!!.url)
url = response.body()!!.url url = response.body()!!.url
} catch (e: MalformedURLException) { } catch (e: MalformedURLException) {
ACRA.getErrorReporter().maybeHandleSilentException(e, activity!!) // Mercury returned a relative url. We do nothing.
} }
} catch (e: Exception) { } catch (e: Exception) {
if (context != null) { if (context != null) {
@ -263,7 +294,8 @@ class ArticleFragment : Fragment() {
} }
try { try {
htmlToWebview(response.body()!!.content.orEmpty(), prefs) contentText = response.body()!!.content.orEmpty()
htmlToWebview()
} catch (e: Exception) { } catch (e: Exception) {
if (context != null) { if (context != null) {
ACRA.getErrorReporter().maybeHandleSilentException(e, context!!) ACRA.getErrorReporter().maybeHandleSilentException(e, context!!)
@ -272,19 +304,19 @@ class ArticleFragment : Fragment() {
try { try {
if (response.body()!!.lead_image_url != null && !response.body()!!.lead_image_url.isNullOrEmpty() && context != null) { if (response.body()!!.lead_image_url != null && !response.body()!!.lead_image_url.isNullOrEmpty() && context != null) {
rootView.imageView.visibility = View.VISIBLE rootView!!.imageView.visibility = View.VISIBLE
try { try {
Glide Glide
.with(context!!) .with(context!!)
.asBitmap() .asBitmap()
.load(response.body()!!.lead_image_url) .load(response.body()!!.lead_image_url)
.apply(RequestOptions.fitCenterTransform()) .apply(RequestOptions.fitCenterTransform())
.into(rootView.imageView) .into(rootView!!.imageView)
} catch (e: Exception) { } catch (e: Exception) {
ACRA.getErrorReporter().maybeHandleSilentException(e, context!!) ACRA.getErrorReporter().maybeHandleSilentException(e, context!!)
} }
} else { } else {
rootView.imageView.visibility = View.GONE rootView!!.imageView.visibility = View.GONE
} }
} catch (e: Exception) { } catch (e: Exception) {
if (context != null) { if (context != null) {
@ -293,9 +325,9 @@ class ArticleFragment : Fragment() {
} }
try { try {
rootView.nestedScrollView.scrollTo(0, 0) rootView!!.nestedScrollView.scrollTo(0, 0)
rootView.progressBar.visibility = View.GONE rootView!!.progressBar.visibility = View.GONE
} catch (e: Exception) { } catch (e: Exception) {
if (context != null) { if (context != null) {
ACRA.getErrorReporter().maybeHandleSilentException(e, context!!) ACRA.getErrorReporter().maybeHandleSilentException(e, context!!)
@ -326,13 +358,13 @@ class ArticleFragment : Fragment() {
} }
} }
private fun htmlToWebview(c: String, prefs: SharedPreferences) { private fun htmlToWebview() {
val stringColor = String.format("#%06X", 0xFFFFFF and appColors.colorAccent) val stringColor = String.format("#%06X", 0xFFFFFF and appColors.colorAccent)
rootView.webcontent.visibility = View.VISIBLE rootView!!.webcontent.visibility = View.VISIBLE
val (textColor, backgroundColor) = if (appColors.isDarkTheme) { val (textColor, backgroundColor) = if (appColors.isDarkTheme) {
if (context != null) { if (context != null) {
rootView.webcontent.setBackgroundColor( rootView!!.webcontent.setBackgroundColor(
ContextCompat.getColor( ContextCompat.getColor(
context!!, context!!,
R.color.dark_webview R.color.dark_webview
@ -344,7 +376,7 @@ class ArticleFragment : Fragment() {
} }
} else { } else {
if (context != null) { if (context != null) {
rootView.webcontent.setBackgroundColor( rootView!!.webcontent.setBackgroundColor(
ContextCompat.getColor( ContextCompat.getColor(
context!!, context!!,
R.color.light_webview R.color.light_webview
@ -368,15 +400,15 @@ class ArticleFragment : Fragment() {
"#FFFFFF" "#FFFFFF"
} }
rootView.webcontent.settings.useWideViewPort = true rootView!!.webcontent.settings.useWideViewPort = true
rootView.webcontent.settings.loadWithOverviewMode = true rootView!!.webcontent.settings.loadWithOverviewMode = true
rootView.webcontent.settings.javaScriptEnabled = false rootView!!.webcontent.settings.javaScriptEnabled = false
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
rootView.webcontent.settings.layoutAlgorithm = rootView!!.webcontent.settings.layoutAlgorithm =
WebSettings.LayoutAlgorithm.TEXT_AUTOSIZING WebSettings.LayoutAlgorithm.TEXT_AUTOSIZING
} else { } else {
rootView.webcontent.settings.layoutAlgorithm = WebSettings.LayoutAlgorithm.SINGLE_COLUMN rootView!!.webcontent.settings.layoutAlgorithm = WebSettings.LayoutAlgorithm.SINGLE_COLUMN
} }
var baseUrl: String? = null var baseUrl: String? = null
@ -388,10 +420,11 @@ class ArticleFragment : Fragment() {
ACRA.getErrorReporter().maybeHandleSilentException(e, activity!!) ACRA.getErrorReporter().maybeHandleSilentException(e, activity!!)
} }
rootView.webcontent.loadDataWithBaseURL( rootView!!.webcontent.loadDataWithBaseURL(
baseUrl, baseUrl,
"""<html> """<html>
|<head> |<head>
| <meta name="viewport" content="width=device-width, initial-scale=1">
| <style> | <style>
| img { | img {
| display: inline-block; | display: inline-block;
@ -406,13 +439,13 @@ class ArticleFragment : Fragment() {
| color: $stringTextColor; | color: $stringTextColor;
| } | }
| * { | * {
| font-size: ${fontSize.toPx}px; | font-size: ${fontSize}px;
| text-align: justify; | text-align: $textAlignment;
| word-break: break-word; | word-break: break-word;
| overflow:hidden; | overflow:hidden;
| } | }
| a, pre, code { | a, pre, code {
| text-align: left; | text-align: $textAlignment;
| } | }
| pre, code { | pre, code {
| white-space: pre-wrap; | white-space: pre-wrap;
@ -422,7 +455,7 @@ class ArticleFragment : Fragment() {
| </style> | </style>
|</head> |</head>
|<body> |<body>
| $c | $contentText
|</body>""".trimMargin(), |</body>""".trimMargin(),
"text/html", "text/html",
"utf-8", "utf-8",
@ -431,7 +464,7 @@ class ArticleFragment : Fragment() {
} }
private fun openInBrowserAfterFailing(customTabsIntent: CustomTabsIntent) { private fun openInBrowserAfterFailing(customTabsIntent: CustomTabsIntent) {
rootView.progressBar.visibility = View.GONE rootView!!.progressBar.visibility = View.GONE
activity!!.openItemUrl( activity!!.openItemUrl(
allItems, allItems,
pageNumber.toInt(), pageNumber.toInt(),

View File

@ -2,6 +2,7 @@ package apps.amine.bou.readerforselfoss.utils
import android.app.Activity import android.app.Activity
import android.app.PendingIntent import android.app.PendingIntent
import android.content.ActivityNotFoundException
import android.content.Context import android.content.Context
import android.content.Intent import android.content.Intent
import android.graphics.BitmapFactory import android.graphics.BitmapFactory
@ -129,7 +130,11 @@ fun Context.openItemUrl(
private fun openInBrowser(linkDecoded: String, app: Activity) { private fun openInBrowser(linkDecoded: String, app: Activity) {
val intent = Intent(Intent.ACTION_VIEW) val intent = Intent(Intent.ACTION_VIEW)
intent.data = Uri.parse(linkDecoded) intent.data = Uri.parse(linkDecoded)
app.startActivity(intent) try {
app.startActivity(intent)
} catch (e: ActivityNotFoundException) {
Toast.makeText(app.baseContext, e.message, Toast.LENGTH_LONG).show()
}
} }
fun String.isUrlValid(): Boolean = fun String.isUrlValid(): Boolean =
@ -143,11 +148,7 @@ fun String.isBaseUrlValid(logErrors: Boolean, ctx: Context): Boolean {
existsAndEndsWithSlash = "" == pathSegments[pathSegments.size - 1] existsAndEndsWithSlash = "" == pathSegments[pathSegments.size - 1]
} }
val isValid = Patterns.WEB_URL.matcher(this).matches() && existsAndEndsWithSlash return Patterns.WEB_URL.matcher(this).matches() && existsAndEndsWithSlash
if (!isValid && logErrors) {
ACRA.getErrorReporter().doHandleSilentException(java.lang.Exception("Patterns.WEB_URL.matcher(this).matches() == ${Patterns.WEB_URL.matcher(this).matches()} && existsAndEndsWithSlash == $existsAndEndsWithSlash && baseUrl.pathSegments() == ${baseUrl?.pathSegments()}"), ctx)
}
return isValid
} }
fun Context.openInBrowserAsNewTask(i: Item) { fun Context.openInBrowserAsNewTask(i: Item) {

View File

@ -0,0 +1,9 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24.0"
android:viewportHeight="24.0">
<path
android:fillColor="#FF000000"
android:pathData="M3,21h18v-2L3,19v2zM3,17h18v-2L3,15v2zM3,13h18v-2L3,11v2zM3,9h18L21,7L3,7v2zM3,3v2h18L21,3L3,3z"/>
</vector>

View File

@ -0,0 +1,9 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24.0"
android:viewportHeight="24.0">
<path
android:fillColor="#FF000000"
android:pathData="M15,15L3,15v2h12v-2zM15,7L3,7v2h12L15,7zM3,13h18v-2L3,11v2zM3,21h18v-2L3,19v2zM3,3v2h18L21,3L3,3z"/>
</vector>

View File

@ -2,6 +2,18 @@
<menu xmlns:app="http://schemas.android.com/apk/res-auto" <menu xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:android="http://schemas.android.com/apk/res/android"> xmlns:android="http://schemas.android.com/apk/res/android">
<item android:id="@+id/align_left"
android:icon="@drawable/ic_format_align_left"
android:visible="true"
app:showAsAction="ifRoom"
android:title="@string/reader_text_align_left" />
<item android:id="@+id/align_justify"
android:icon="@drawable/ic_format_align_justify"
android:visible="true"
app:showAsAction="ifRoom"
android:title="@string/reader_text_align_justify" />
<item <item
android:id="@+id/unsave" android:id="@+id/unsave"
android:icon="@drawable/heart_on" android:icon="@drawable/heart_on"

View File

@ -168,4 +168,6 @@
<string name="shortcut_offline">Offline</string> <string name="shortcut_offline">Offline</string>
<string name="pref_api_timeout">Api Timeout</string> <string name="pref_api_timeout">Api Timeout</string>
<string name="pref_header_experimental">Experimental</string> <string name="pref_header_experimental">Experimental</string>
<string name="webview_dialog_issue_message">Webview not available. Disabling the article viewer to avoid any future crashes. Will load articles inside of your browser from now on.</string>
<string name="webview_dialog_issue_title">Webview issue</string>
</resources> </resources>

View File

@ -168,4 +168,6 @@
<string name="shortcut_offline">Offline</string> <string name="shortcut_offline">Offline</string>
<string name="pref_api_timeout">Api Timeout</string> <string name="pref_api_timeout">Api Timeout</string>
<string name="pref_header_experimental">Experimental</string> <string name="pref_header_experimental">Experimental</string>
<string name="webview_dialog_issue_message">Webview not available. Disabling the article viewer to avoid any future crashes. Will load articles inside of your browser from now on.</string>
<string name="webview_dialog_issue_title">Webview issue</string>
</resources> </resources>

View File

@ -168,4 +168,6 @@
<string name="shortcut_offline">Sense connexió</string> <string name="shortcut_offline">Sense connexió</string>
<string name="pref_api_timeout">S\'ha acabat el temps d\'espera de l\'API</string> <string name="pref_api_timeout">S\'ha acabat el temps d\'espera de l\'API</string>
<string name="pref_header_experimental">Experimental</string> <string name="pref_header_experimental">Experimental</string>
<string name="webview_dialog_issue_message">Webview not available. Disabling the article viewer to avoid any future crashes. Will load articles inside of your browser from now on.</string>
<string name="webview_dialog_issue_title">Webview issue</string>
</resources> </resources>

View File

@ -168,4 +168,6 @@
<string name="shortcut_offline">Offline</string> <string name="shortcut_offline">Offline</string>
<string name="pref_api_timeout">Api Timeout</string> <string name="pref_api_timeout">Api Timeout</string>
<string name="pref_header_experimental">Experimental</string> <string name="pref_header_experimental">Experimental</string>
<string name="webview_dialog_issue_message">Webview not available. Disabling the article viewer to avoid any future crashes. Will load articles inside of your browser from now on.</string>
<string name="webview_dialog_issue_title">Webview issue</string>
</resources> </resources>

View File

@ -168,4 +168,6 @@
<string name="shortcut_offline">Offline</string> <string name="shortcut_offline">Offline</string>
<string name="pref_api_timeout">Api Timeout</string> <string name="pref_api_timeout">Api Timeout</string>
<string name="pref_header_experimental">Experimental</string> <string name="pref_header_experimental">Experimental</string>
<string name="webview_dialog_issue_message">Webview not available. Disabling the article viewer to avoid any future crashes. Will load articles inside of your browser from now on.</string>
<string name="webview_dialog_issue_title">Webview issue</string>
</resources> </resources>

View File

@ -168,4 +168,6 @@
<string name="shortcut_offline">Offline</string> <string name="shortcut_offline">Offline</string>
<string name="pref_api_timeout">API-Zeitüberschreitung</string> <string name="pref_api_timeout">API-Zeitüberschreitung</string>
<string name="pref_header_experimental">Experimentell</string> <string name="pref_header_experimental">Experimentell</string>
<string name="webview_dialog_issue_message">Webview not available. Disabling the article viewer to avoid any future crashes. Will load articles inside of your browser from now on.</string>
<string name="webview_dialog_issue_title">Webview issue</string>
</resources> </resources>

View File

@ -168,4 +168,6 @@
<string name="shortcut_offline">Offline</string> <string name="shortcut_offline">Offline</string>
<string name="pref_api_timeout">Api Timeout</string> <string name="pref_api_timeout">Api Timeout</string>
<string name="pref_header_experimental">Experimental</string> <string name="pref_header_experimental">Experimental</string>
<string name="webview_dialog_issue_message">Webview not available. Disabling the article viewer to avoid any future crashes. Will load articles inside of your browser from now on.</string>
<string name="webview_dialog_issue_title">Webview issue</string>
</resources> </resources>

View File

@ -168,4 +168,6 @@
<string name="shortcut_offline">Sin conexión</string> <string name="shortcut_offline">Sin conexión</string>
<string name="pref_api_timeout">Se acabó el tiempo de espera de la API</string> <string name="pref_api_timeout">Se acabó el tiempo de espera de la API</string>
<string name="pref_header_experimental">Experimental</string> <string name="pref_header_experimental">Experimental</string>
<string name="webview_dialog_issue_message">Visor web no disponible. Desactivando el visor de artículo para evitar cualquier futuro problema. Se cargarán artículos en el navegador de ahora en adelante.</string>
<string name="webview_dialog_issue_title">Problema con el visor web</string>
</resources> </resources>

View File

@ -168,4 +168,6 @@
<string name="shortcut_offline">Offline</string> <string name="shortcut_offline">Offline</string>
<string name="pref_api_timeout">Api Timeout</string> <string name="pref_api_timeout">Api Timeout</string>
<string name="pref_header_experimental">Experimental</string> <string name="pref_header_experimental">Experimental</string>
<string name="webview_dialog_issue_message">Webview not available. Disabling the article viewer to avoid any future crashes. Will load articles inside of your browser from now on.</string>
<string name="webview_dialog_issue_title">Webview issue</string>
</resources> </resources>

View File

@ -166,6 +166,8 @@
<string name="new_items_notification_text">%1$d nouveaux articles synchronisés.</string> <string name="new_items_notification_text">%1$d nouveaux articles synchronisés.</string>
<string name="pref_switch_notify_new_items">Notification quand des nouveaux articles sont synchronisés.</string> <string name="pref_switch_notify_new_items">Notification quand des nouveaux articles sont synchronisés.</string>
<string name="shortcut_offline">Hors ligne</string> <string name="shortcut_offline">Hors ligne</string>
<string name="pref_api_timeout">Api Timeout</string> <string name="pref_api_timeout">Timeout de l\'api</string>
<string name="pref_header_experimental">Experimental</string> <string name="pref_header_experimental">Expérimental</string>
<string name="webview_dialog_issue_message">Pas de Webview disponible. Désactivation du lecteur d\'article pour éviter les futures erreurs. Les articles seront lu via votre navigateur à l\'avenir.</string>
<string name="webview_dialog_issue_title">Problème de Webview</string>
</resources> </resources>

View File

@ -168,4 +168,6 @@
<string name="shortcut_offline">Sen conexión</string> <string name="shortcut_offline">Sen conexión</string>
<string name="pref_api_timeout">Acabouse o tempo de espera da API</string> <string name="pref_api_timeout">Acabouse o tempo de espera da API</string>
<string name="pref_header_experimental">Experimental</string> <string name="pref_header_experimental">Experimental</string>
<string name="webview_dialog_issue_message">Visor web non dispoñible. Desactivando o visor de artigos pra evitar futuros problemas. Cargaranse os artigos dende o navegador de agora en adiante.</string>
<string name="webview_dialog_issue_title">Problema co visor web</string>
</resources> </resources>

View File

@ -168,4 +168,6 @@
<string name="shortcut_offline">Offline</string> <string name="shortcut_offline">Offline</string>
<string name="pref_api_timeout">Api Timeout</string> <string name="pref_api_timeout">Api Timeout</string>
<string name="pref_header_experimental">Experimental</string> <string name="pref_header_experimental">Experimental</string>
<string name="webview_dialog_issue_message">Webview not available. Disabling the article viewer to avoid any future crashes. Will load articles inside of your browser from now on.</string>
<string name="webview_dialog_issue_title">Webview issue</string>
</resources> </resources>

View File

@ -168,4 +168,6 @@
<string name="shortcut_offline">Offline</string> <string name="shortcut_offline">Offline</string>
<string name="pref_api_timeout">Api Timeout</string> <string name="pref_api_timeout">Api Timeout</string>
<string name="pref_header_experimental">Experimental</string> <string name="pref_header_experimental">Experimental</string>
<string name="webview_dialog_issue_message">Webview not available. Disabling the article viewer to avoid any future crashes. Will load articles inside of your browser from now on.</string>
<string name="webview_dialog_issue_title">Webview issue</string>
</resources> </resources>

View File

@ -168,4 +168,6 @@
<string name="shortcut_offline">Offline</string> <string name="shortcut_offline">Offline</string>
<string name="pref_api_timeout">Api Timeout</string> <string name="pref_api_timeout">Api Timeout</string>
<string name="pref_header_experimental">Experimental</string> <string name="pref_header_experimental">Experimental</string>
<string name="webview_dialog_issue_message">Webview not available. Disabling the article viewer to avoid any future crashes. Will load articles inside of your browser from now on.</string>
<string name="webview_dialog_issue_title">Webview issue</string>
</resources> </resources>

View File

@ -168,4 +168,6 @@
<string name="shortcut_offline">Offline</string> <string name="shortcut_offline">Offline</string>
<string name="pref_api_timeout">Api Timeout</string> <string name="pref_api_timeout">Api Timeout</string>
<string name="pref_header_experimental">Experimental</string> <string name="pref_header_experimental">Experimental</string>
<string name="webview_dialog_issue_message">Webview not available. Disabling the article viewer to avoid any future crashes. Will load articles inside of your browser from now on.</string>
<string name="webview_dialog_issue_title">Webview issue</string>
</resources> </resources>

View File

@ -168,4 +168,6 @@
<string name="shortcut_offline">Offline</string> <string name="shortcut_offline">Offline</string>
<string name="pref_api_timeout">Api Timeout</string> <string name="pref_api_timeout">Api Timeout</string>
<string name="pref_header_experimental">Experimental</string> <string name="pref_header_experimental">Experimental</string>
<string name="webview_dialog_issue_message">Webview not available. Disabling the article viewer to avoid any future crashes. Will load articles inside of your browser from now on.</string>
<string name="webview_dialog_issue_title">Webview issue</string>
</resources> </resources>

View File

@ -168,4 +168,6 @@
<string name="shortcut_offline">Offline</string> <string name="shortcut_offline">Offline</string>
<string name="pref_api_timeout">Api Timeout</string> <string name="pref_api_timeout">Api Timeout</string>
<string name="pref_header_experimental">Experimental</string> <string name="pref_header_experimental">Experimental</string>
<string name="webview_dialog_issue_message">Webview not available. Disabling the article viewer to avoid any future crashes. Will load articles inside of your browser from now on.</string>
<string name="webview_dialog_issue_title">Webview issue</string>
</resources> </resources>

View File

@ -168,4 +168,6 @@
<string name="shortcut_offline">Offline</string> <string name="shortcut_offline">Offline</string>
<string name="pref_api_timeout">Api Timeout</string> <string name="pref_api_timeout">Api Timeout</string>
<string name="pref_header_experimental">Experimental</string> <string name="pref_header_experimental">Experimental</string>
<string name="webview_dialog_issue_message">Webview not available. Disabling the article viewer to avoid any future crashes. Will load articles inside of your browser from now on.</string>
<string name="webview_dialog_issue_title">Webview issue</string>
</resources> </resources>

View File

@ -168,4 +168,6 @@
<string name="shortcut_offline">Offline</string> <string name="shortcut_offline">Offline</string>
<string name="pref_api_timeout">Api Timeout</string> <string name="pref_api_timeout">Api Timeout</string>
<string name="pref_header_experimental">Experimental</string> <string name="pref_header_experimental">Experimental</string>
<string name="webview_dialog_issue_message">Webview not available. Disabling the article viewer to avoid any future crashes. Will load articles inside of your browser from now on.</string>
<string name="webview_dialog_issue_title">Webview issue</string>
</resources> </resources>

View File

@ -168,4 +168,6 @@
<string name="shortcut_offline">Offline</string> <string name="shortcut_offline">Offline</string>
<string name="pref_api_timeout">Api Timeout</string> <string name="pref_api_timeout">Api Timeout</string>
<string name="pref_header_experimental">Experimental</string> <string name="pref_header_experimental">Experimental</string>
<string name="webview_dialog_issue_message">Webview not available. Disabling the article viewer to avoid any future crashes. Will load articles inside of your browser from now on.</string>
<string name="webview_dialog_issue_title">Webview issue</string>
</resources> </resources>

View File

@ -168,4 +168,6 @@
<string name="shortcut_offline">Offline</string> <string name="shortcut_offline">Offline</string>
<string name="pref_api_timeout">Api Timeout</string> <string name="pref_api_timeout">Api Timeout</string>
<string name="pref_header_experimental">Experimental</string> <string name="pref_header_experimental">Experimental</string>
<string name="webview_dialog_issue_message">Webview not available. Disabling the article viewer to avoid any future crashes. Will load articles inside of your browser from now on.</string>
<string name="webview_dialog_issue_title">Webview issue</string>
</resources> </resources>

View File

@ -168,4 +168,6 @@
<string name="shortcut_offline">Offline</string> <string name="shortcut_offline">Offline</string>
<string name="pref_api_timeout">Api Timeout</string> <string name="pref_api_timeout">Api Timeout</string>
<string name="pref_header_experimental">Experimental</string> <string name="pref_header_experimental">Experimental</string>
<string name="webview_dialog_issue_message">Webview not available. Disabling the article viewer to avoid any future crashes. Will load articles inside of your browser from now on.</string>
<string name="webview_dialog_issue_title">Webview issue</string>
</resources> </resources>

View File

@ -168,4 +168,6 @@
<string name="shortcut_offline">Offline</string> <string name="shortcut_offline">Offline</string>
<string name="pref_api_timeout">Api Timeout</string> <string name="pref_api_timeout">Api Timeout</string>
<string name="pref_header_experimental">Experimental</string> <string name="pref_header_experimental">Experimental</string>
<string name="webview_dialog_issue_message">Webview not available. Disabling the article viewer to avoid any future crashes. Will load articles inside of your browser from now on.</string>
<string name="webview_dialog_issue_title">Webview issue</string>
</resources> </resources>

View File

@ -168,4 +168,6 @@
<string name="shortcut_offline">Offline</string> <string name="shortcut_offline">Offline</string>
<string name="pref_api_timeout">Api Timeout</string> <string name="pref_api_timeout">Api Timeout</string>
<string name="pref_header_experimental">Experimental</string> <string name="pref_header_experimental">Experimental</string>
<string name="webview_dialog_issue_message">Webview not available. Disabling the article viewer to avoid any future crashes. Will load articles inside of your browser from now on.</string>
<string name="webview_dialog_issue_title">Webview issue</string>
</resources> </resources>

View File

@ -168,4 +168,6 @@
<string name="shortcut_offline">Offline</string> <string name="shortcut_offline">Offline</string>
<string name="pref_api_timeout">Api Timeout</string> <string name="pref_api_timeout">Api Timeout</string>
<string name="pref_header_experimental">Experimental</string> <string name="pref_header_experimental">Experimental</string>
<string name="webview_dialog_issue_message">Webview not available. Disabling the article viewer to avoid any future crashes. Will load articles inside of your browser from now on.</string>
<string name="webview_dialog_issue_title">Webview issue</string>
</resources> </resources>

View File

@ -168,4 +168,6 @@
<string name="shortcut_offline">Offline</string> <string name="shortcut_offline">Offline</string>
<string name="pref_api_timeout">Api Timeout</string> <string name="pref_api_timeout">Api Timeout</string>
<string name="pref_header_experimental">Experimental</string> <string name="pref_header_experimental">Experimental</string>
<string name="webview_dialog_issue_message">Webview not available. Disabling the article viewer to avoid any future crashes. Will load articles inside of your browser from now on.</string>
<string name="webview_dialog_issue_title">Webview issue</string>
</resources> </resources>

View File

@ -168,4 +168,6 @@
<string name="shortcut_offline">Offline</string> <string name="shortcut_offline">Offline</string>
<string name="pref_api_timeout">Api Timeout</string> <string name="pref_api_timeout">Api Timeout</string>
<string name="pref_header_experimental">Experimental</string> <string name="pref_header_experimental">Experimental</string>
<string name="webview_dialog_issue_message">Webview not available. Disabling the article viewer to avoid any future crashes. Will load articles inside of your browser from now on.</string>
<string name="webview_dialog_issue_title">Webview issue</string>
</resources> </resources>

View File

@ -168,4 +168,6 @@
<string name="shortcut_offline">Offline</string> <string name="shortcut_offline">Offline</string>
<string name="pref_api_timeout">Api Timeout</string> <string name="pref_api_timeout">Api Timeout</string>
<string name="pref_header_experimental">Experimental</string> <string name="pref_header_experimental">Experimental</string>
<string name="webview_dialog_issue_message">Webview not available. Disabling the article viewer to avoid any future crashes. Will load articles inside of your browser from now on.</string>
<string name="webview_dialog_issue_title">Webview issue</string>
</resources> </resources>

View File

@ -168,4 +168,6 @@
<string name="shortcut_offline">Offline</string> <string name="shortcut_offline">Offline</string>
<string name="pref_api_timeout">Api Timeout</string> <string name="pref_api_timeout">Api Timeout</string>
<string name="pref_header_experimental">Experimental</string> <string name="pref_header_experimental">Experimental</string>
<string name="webview_dialog_issue_message">Webview not available. Disabling the article viewer to avoid any future crashes. Will load articles inside of your browser from now on.</string>
<string name="webview_dialog_issue_title">Webview issue</string>
</resources> </resources>

View File

@ -168,4 +168,6 @@
<string name="shortcut_offline">Offline</string> <string name="shortcut_offline">Offline</string>
<string name="pref_api_timeout">Api Timeout</string> <string name="pref_api_timeout">Api Timeout</string>
<string name="pref_header_experimental">Experimental</string> <string name="pref_header_experimental">Experimental</string>
<string name="webview_dialog_issue_message">Webview not available. Disabling the article viewer to avoid any future crashes. Will load articles inside of your browser from now on.</string>
<string name="webview_dialog_issue_title">Webview issue</string>
</resources> </resources>

View File

@ -168,4 +168,6 @@
<string name="shortcut_offline">Offline</string> <string name="shortcut_offline">Offline</string>
<string name="pref_api_timeout">Api Timeout</string> <string name="pref_api_timeout">Api Timeout</string>
<string name="pref_header_experimental">Experimental</string> <string name="pref_header_experimental">Experimental</string>
<string name="webview_dialog_issue_message">Webview not available. Disabling the article viewer to avoid any future crashes. Will load articles inside of your browser from now on.</string>
<string name="webview_dialog_issue_title">Webview issue</string>
</resources> </resources>

View File

@ -168,4 +168,8 @@
<string name="shortcut_offline">Offline</string> <string name="shortcut_offline">Offline</string>
<string name="pref_api_timeout">Api Timeout</string> <string name="pref_api_timeout">Api Timeout</string>
<string name="pref_header_experimental">Experimental</string> <string name="pref_header_experimental">Experimental</string>
<string name="webview_dialog_issue_message">Webview not available. Disabling the article viewer to avoid any future crashes. Will load articles inside of your browser from now on.</string>
<string name="webview_dialog_issue_title">Webview issue</string>
<string name="reader_text_align_left">Align left</string>
<string name="reader_text_align_justify">Justify</string>
</resources> </resources>

View File

@ -7,7 +7,7 @@
android:title="@string/pref_switch_actions_pager_scroll" /> android:title="@string/pref_switch_actions_pager_scroll" />
<EditTextPreference <EditTextPreference
android:defaultValue="14" android:defaultValue="16"
android:inputType="number" android:inputType="number"
android:key="reader_font_size" android:key="reader_font_size"
android:selectAllOnFocus="true" android:selectAllOnFocus="true"