Compare commits
21 Commits
v171811325
...
v171812343
Author | SHA1 | Date | |
---|---|---|---|
9eac51e729 | |||
fa9cce6783 | |||
f0d4b63a97 | |||
83eeb11388 | |||
01f746f33d | |||
200851894b | |||
862e5cf4ab | |||
0b07f2a407 | |||
9ba6feef0b | |||
63a0638522 | |||
f9a4e6e363 | |||
6b40fd4bdc | |||
04c7776466 | |||
92c335b4e1 | |||
17251e576b | |||
62ea782429 | |||
f99474e3c1 | |||
57ac8f428f | |||
9cc1adbf15 | |||
1d9a440ae7 | |||
511553806c |
6
.github/CONTRIBUTING.md
vendored
6
.github/CONTRIBUTING.md
vendored
@ -41,6 +41,12 @@ Always check if the web version of your instance is working.
|
|||||||
* Remember that PR review can take time.
|
* Remember that PR review can take time.
|
||||||
|
|
||||||
|
|
||||||
|
# Install Selfoss (if you don't have an instance)
|
||||||
|
|
||||||
|
I won't provide any selfoss instance url. If you want to help, but to not have one, you'll have to install one, and use it.
|
||||||
|
|
||||||
|
All the details to need are [here](https://selfoss.aditu.de/).
|
||||||
|
|
||||||
# Build the project
|
# Build the project
|
||||||
|
|
||||||
You can directly import this project into IntellIJ/Android Studio.
|
You can directly import this project into IntellIJ/Android Studio.
|
||||||
|
@ -18,7 +18,11 @@ Also, the last APK built from source is available [here](https://jenkins.amine-b
|
|||||||
|
|
||||||
## Want to help ?
|
## Want to help ?
|
||||||
|
|
||||||
Check the [Contribution guide](https://github.com/aminecmi/ReaderforSelfoss/blob/master/.github/CONTRIBUTING.md)
|
1. **You'll have to have a Selfoss instance running.** You'll find everything you need to install it [here](https://selfoss.aditu.de/).
|
||||||
|
|
||||||
|
2. Check the [Contribution guide](https://github.com/aminecmi/ReaderforSelfoss/blob/master/.github/CONTRIBUTING.md).
|
||||||
|
|
||||||
|
3. Build the project by following [these steps](https://github.com/aminecmi/ReaderforSelfoss/blob/master/.github/CONTRIBUTING.md#build-the-project) (you should have read them after the contribution guide)
|
||||||
|
|
||||||
## Useful links
|
## Useful links
|
||||||
|
|
||||||
|
@ -2,7 +2,15 @@ buildscript {
|
|||||||
}
|
}
|
||||||
|
|
||||||
def gitVersion() {
|
def gitVersion() {
|
||||||
def process = "git for-each-ref refs/tags --sort=-taggerdate --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()
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -170,4 +178,4 @@ def initAppLoginPropertiesIfNeeded() {
|
|||||||
entry(key: "appLoginPassword", value: System.getProperty("appLoginPassword"))
|
entry(key: "appLoginPassword", value: System.getProperty("appLoginPassword"))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -109,7 +109,7 @@ class AddSourceActivity : AppCompatActivity() {
|
|||||||
super.onResume()
|
super.onResume()
|
||||||
val config = Config(this)
|
val config = Config(this)
|
||||||
|
|
||||||
if (config.baseUrl.isEmpty() || !config.baseUrl.isBaseUrlValid(false)) {
|
if (config.baseUrl.isEmpty() || !config.baseUrl.isBaseUrlValid(false, this@AddSourceActivity)) {
|
||||||
mustLoginToAddSource()
|
mustLoginToAddSource()
|
||||||
} else {
|
} else {
|
||||||
handleSpoutsSpinner(spoutsSpinner, api, progress, formContainer)
|
handleSpoutsSpinner(spoutsSpinner, api, progress, formContainer)
|
||||||
|
@ -54,7 +54,6 @@ class LoginActivity : AppCompatActivity() {
|
|||||||
|
|
||||||
handleBaseUrlFail()
|
handleBaseUrlFail()
|
||||||
|
|
||||||
|
|
||||||
settings = getSharedPreferences(Config.settingsName, Context.MODE_PRIVATE)
|
settings = getSharedPreferences(Config.settingsName, Context.MODE_PRIVATE)
|
||||||
userIdentifier = settings.getString("unique_id", "")
|
userIdentifier = settings.getString("unique_id", "")
|
||||||
logErrors = settings.getBoolean("login_debug", false)
|
logErrors = settings.getBoolean("login_debug", false)
|
||||||
@ -145,7 +144,7 @@ class LoginActivity : AppCompatActivity() {
|
|||||||
var cancel = false
|
var cancel = false
|
||||||
var focusView: View? = null
|
var focusView: View? = null
|
||||||
|
|
||||||
if (!url.isBaseUrlValid(logErrors)) {
|
if (!url.isBaseUrlValid(logErrors, this@LoginActivity)) {
|
||||||
urlView.error = getString(R.string.login_url_problem)
|
urlView.error = getString(R.string.login_url_problem)
|
||||||
focusView = urlView
|
focusView = urlView
|
||||||
cancel = true
|
cancel = true
|
||||||
@ -164,7 +163,7 @@ class LoginActivity : AppCompatActivity() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (isWithLogin || isWithHTTPLogin) {
|
if (isWithLogin) {
|
||||||
if (TextUtils.isEmpty(password)) {
|
if (TextUtils.isEmpty(password)) {
|
||||||
passwordView.error = getString(R.string.error_invalid_password)
|
passwordView.error = getString(R.string.error_invalid_password)
|
||||||
focusView = passwordView
|
focusView = passwordView
|
||||||
@ -178,6 +177,20 @@ class LoginActivity : AppCompatActivity() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (isWithHTTPLogin) {
|
||||||
|
if (TextUtils.isEmpty(httpPassword)) {
|
||||||
|
httpPasswordView.error = getString(R.string.error_invalid_password)
|
||||||
|
focusView = httpPasswordView
|
||||||
|
cancel = true
|
||||||
|
}
|
||||||
|
|
||||||
|
if (TextUtils.isEmpty(httpLogin)) {
|
||||||
|
httpLoginView.error = getString(R.string.error_field_required)
|
||||||
|
focusView = httpLoginView
|
||||||
|
cancel = true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (cancel) {
|
if (cancel) {
|
||||||
focusView?.requestFocus()
|
focusView?.requestFocus()
|
||||||
} else {
|
} else {
|
||||||
|
@ -28,10 +28,8 @@ import java.io.IOException
|
|||||||
import java.util.UUID.randomUUID
|
import java.util.UUID.randomUUID
|
||||||
|
|
||||||
|
|
||||||
@AcraHttpSender(uri = "http://amine-bou.fr:5984/acra-selfoss/_design/acra-storage/_update/report",
|
@AcraHttpSender(uri = "http://37.187.110.167/amine/acra/simplest-acra.php",
|
||||||
basicAuthLogin = "selfoss",
|
httpMethod = HttpSender.Method.POST)
|
||||||
basicAuthPassword = "selfoss",
|
|
||||||
httpMethod = HttpSender.Method.PUT)
|
|
||||||
@AcraDialog(resText = R.string.crash_dialog_text,
|
@AcraDialog(resText = R.string.crash_dialog_text,
|
||||||
resCommentPrompt = R.string.crash_dialog_comment,
|
resCommentPrompt = R.string.crash_dialog_comment,
|
||||||
resTheme = android.R.style.Theme_DeviceDefault_Dialog)
|
resTheme = android.R.style.Theme_DeviceDefault_Dialog)
|
||||||
|
@ -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()
|
||||||
}
|
}
|
||||||
|
@ -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(),
|
||||||
|
@ -2,15 +2,21 @@ package apps.amine.bou.readerforselfoss.utils
|
|||||||
|
|
||||||
import android.content.Context
|
import android.content.Context
|
||||||
import android.preference.PreferenceManager
|
import android.preference.PreferenceManager
|
||||||
|
import android.provider.Settings
|
||||||
import org.acra.ErrorReporter
|
import org.acra.ErrorReporter
|
||||||
|
|
||||||
fun ErrorReporter.maybeHandleSilentException(throwable: Throwable, ctx: Context) {
|
fun ErrorReporter.maybeHandleSilentException(throwable: Throwable, ctx: Context) {
|
||||||
val sharedPref = PreferenceManager.getDefaultSharedPreferences(ctx)
|
val sharedPref = PreferenceManager.getDefaultSharedPreferences(ctx)
|
||||||
if (sharedPref.getBoolean("acra_should_log", false)) {
|
val isTestLab = Settings.System.getString(ctx.contentResolver, "firebase.test.lab") == "true"
|
||||||
|
|
||||||
|
if (sharedPref.getBoolean("acra_should_log", false) && !isTestLab) {
|
||||||
this.handleSilentException(throwable)
|
this.handleSilentException(throwable)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fun ErrorReporter.doHandleSilentException(throwable: Throwable) {
|
fun ErrorReporter.doHandleSilentException(throwable: Throwable, ctx: Context) {
|
||||||
this.handleSilentException(throwable)
|
val isTestLab = Settings.System.getString(ctx.contentResolver, "firebase.test.lab") == "true"
|
||||||
|
if (!isTestLab) {
|
||||||
|
this.handleSilentException(throwable)
|
||||||
|
}
|
||||||
}
|
}
|
@ -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,13 +130,17 @@ 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 =
|
||||||
HttpUrl.parse(this) != null && Patterns.WEB_URL.matcher(this).matches()
|
HttpUrl.parse(this) != null && Patterns.WEB_URL.matcher(this).matches()
|
||||||
|
|
||||||
fun String.isBaseUrlValid(logErrors: Boolean): Boolean {
|
fun String.isBaseUrlValid(logErrors: Boolean, ctx: Context): Boolean {
|
||||||
val baseUrl = HttpUrl.parse(this)
|
val baseUrl = HttpUrl.parse(this)
|
||||||
var existsAndEndsWithSlash = false
|
var existsAndEndsWithSlash = false
|
||||||
if (baseUrl != null) {
|
if (baseUrl != null) {
|
||||||
@ -143,11 +148,7 @@ fun String.isBaseUrlValid(logErrors: Boolean): 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()}"))
|
|
||||||
}
|
|
||||||
return isValid
|
|
||||||
}
|
}
|
||||||
|
|
||||||
fun Context.openInBrowserAsNewTask(i: Item) {
|
fun Context.openInBrowserAsNewTask(i: Item) {
|
||||||
|
@ -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>
|
@ -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>
|
@ -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"
|
||||||
|
@ -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>
|
||||||
|
@ -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>
|
||||||
|
@ -108,7 +108,7 @@
|
|||||||
<string name="self_signed_cert_warning">Per raons de seguretat, els certificats autosignats no seran compatibles per defecte. En activar aquesta opció, sereu responsable de qualsevol problema de seguretat que es pugui produir.</string>
|
<string name="self_signed_cert_warning">Per raons de seguretat, els certificats autosignats no seran compatibles per defecte. En activar aquesta opció, sereu responsable de qualsevol problema de seguretat que es pugui produir.</string>
|
||||||
<string name="pref_selfoss_category">API de Selfoss</string>
|
<string name="pref_selfoss_category">API de Selfoss</string>
|
||||||
<string name="pref_api_items_number_title">Nombre d\'elements carregats</string>
|
<string name="pref_api_items_number_title">Nombre d\'elements carregats</string>
|
||||||
<string name="pref_hidden_tags">Hidden Tags</string>
|
<string name="pref_hidden_tags">Etiquetes ocultes</string>
|
||||||
<string name="read_debug_title">Voleu llegir els articles que apareixen com a no llegits?</string>
|
<string name="read_debug_title">Voleu llegir els articles que apareixen com a no llegits?</string>
|
||||||
<string name="read_debug_off">No es registraran quan es marquen elements com a llegits</string>
|
<string name="read_debug_off">No es registraran quan es marquen elements com a llegits</string>
|
||||||
<string name="read_debug_on">Les crides de l\'API es registraran en marcar un article com a llegit</string>
|
<string name="read_debug_on">Les crides de l\'API es registraran en marcar un article com a llegit</string>
|
||||||
@ -146,26 +146,28 @@
|
|||||||
<string name="pref_debug_crash_reports">Informes d\'error</string>
|
<string name="pref_debug_crash_reports">Informes d\'error</string>
|
||||||
<string name="pref_debug_debug_logs">Registre de depuració (s\'enviarà automàticament)</string>
|
<string name="pref_debug_debug_logs">Registre de depuració (s\'enviarà automàticament)</string>
|
||||||
<string name="acra_login">Habilita el registre</string>
|
<string name="acra_login">Habilita el registre</string>
|
||||||
<string name="drawer_item_hidden_tags">Hidden Tags</string>
|
<string name="drawer_item_hidden_tags">Etiquetes ocultes</string>
|
||||||
<string name="unmark">Mark item as unread</string>
|
<string name="unmark">Marca com no llegit</string>
|
||||||
<string name="pref_header_offline">Offline and cache</string>
|
<string name="pref_header_offline">Sense connexió i memòria clau</string>
|
||||||
<string name="pref_switch_items_caching_off">Articles won\'t be saved to the device memory, and the app won\'t be usable offline.</string>
|
<string name="pref_switch_items_caching_off">Els articles no es guardaran a la memòria del dispositiu i l\'aplicació no es podrà utilitzar sense connexió.</string>
|
||||||
<string name="pref_switch_items_caching_on">Articles will be saved to the device memory and will be used for offline use.</string>
|
<string name="pref_switch_items_caching_on">Els articles es guardaran a la memòria del dispositiu i es podran utilitzar sense connexió.</string>
|
||||||
<string name="pref_switch_items_caching">Save items for offline use</string>
|
<string name="pref_switch_items_caching">Guarda els elements per utilitzar-los sense connexió</string>
|
||||||
<string name="no_network_connectivity">Not connected !</string>
|
<string name="no_network_connectivity">Sense connexió!</string>
|
||||||
<string name="pref_switch_periodic_refresh">Sync articles</string>
|
<string name="pref_switch_periodic_refresh">Sincronitza els articles</string>
|
||||||
<string name="pref_switch_periodic_refresh_off">Articles will not be synced in the background</string>
|
<string name="pref_switch_periodic_refresh_off">Els articles no se sincronitzaran en segon pla</string>
|
||||||
<string name="pref_switch_periodic_refresh_on">Articles will periodically be synced</string>
|
<string name="pref_switch_periodic_refresh_on">Els articles se sincronitzaran periòdicament</string>
|
||||||
<string name="pref_periodic_refresh_minutes_title"><![CDATA[Sync interval ( >= 15 minutes)]]></string>
|
<string name="pref_periodic_refresh_minutes_title"><![CDATA[Interval de sincronització ( >= 15 minuts)]]></string>
|
||||||
<string name="pref_switch_refresh_when_charging">Only refresh when phone is charging</string>
|
<string name="pref_switch_refresh_when_charging">Sincronitza només quan el telèfon s\'està carregant</string>
|
||||||
<string name="loading_notification_title">Loading ...</string>
|
<string name="loading_notification_title">S\'està carregant...</string>
|
||||||
<string name="loading_notification_text">Selfoss is syncing your articles</string>
|
<string name="loading_notification_text">Selfoss està sincronitzant els articles</string>
|
||||||
<string name="notification_channel_sync">Sync notification</string>
|
<string name="notification_channel_sync">Notificació de sincronització</string>
|
||||||
<string name="new_items_channel_sync">New items notification</string>
|
<string name="new_items_channel_sync">Notificació d\'elements nous</string>
|
||||||
<string name="new_items_notification_title">New items !</string>
|
<string name="new_items_notification_title">Nous articles!</string>
|
||||||
<string name="new_items_notification_text">%1$d new items loaded.</string>
|
<string name="new_items_notification_text">S\'han carregat %1$d articles nous.</string>
|
||||||
<string name="pref_switch_notify_new_items">Notify on new items synced.</string>
|
<string name="pref_switch_notify_new_items">Avisa\'m quan se sincronitzin articles nous.</string>
|
||||||
<string name="shortcut_offline">Offline</string>
|
<string name="shortcut_offline">Sense connexió</string>
|
||||||
<string name="pref_api_timeout">Api Timeout</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>
|
||||||
|
@ -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>
|
||||||
|
@ -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>
|
||||||
|
@ -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>
|
||||||
|
@ -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>
|
||||||
|
@ -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>
|
||||||
|
@ -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>
|
||||||
|
@ -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>
|
||||||
|
@ -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>
|
||||||
|
@ -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>
|
||||||
|
@ -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>
|
||||||
|
@ -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>
|
||||||
|
@ -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>
|
||||||
|
@ -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>
|
||||||
|
@ -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>
|
||||||
|
@ -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>
|
||||||
|
@ -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>
|
||||||
|
@ -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>
|
||||||
|
@ -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>
|
||||||
|
@ -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>
|
||||||
|
@ -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>
|
||||||
|
@ -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>
|
||||||
|
@ -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>
|
||||||
|
@ -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>
|
||||||
|
@ -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>
|
||||||
|
@ -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>
|
||||||
|
@ -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>
|
||||||
|
@ -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>
|
||||||
|
@ -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>
|
||||||
|
@ -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>
|
||||||
|
@ -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"
|
||||||
|
Reference in New Issue
Block a user