Compare commits
6 Commits
Author | SHA1 | Date | |
---|---|---|---|
faebfc238c | |||
c28fbd37cc | |||
4b8396959d | |||
b39d510e07 | |||
286dda7f80 | |||
7bda896e2d |
3
.github/CONTRIBUTING.md
vendored
3
.github/CONTRIBUTING.md
vendored
@ -22,7 +22,8 @@ Always check if the web version of your instance is working.
|
|||||||
### Bug reports/Feature request
|
### Bug reports/Feature request
|
||||||
|
|
||||||
* Always search before reporting an issue or asking for a feature to avoid duplicates.
|
* Always search before reporting an issue or asking for a feature to avoid duplicates.
|
||||||
* Include every usefull details (app version, phone model, Android version and screenshots when possible)
|
* Include your unique user id. It's displayed on the debug settings page. (You can tap it, it'll be copied to your clipboard)
|
||||||
|
* Include every other useful details (app version, phone model, Android version and screenshots when possible).
|
||||||
* Avoid bumping non-fatal issues, or feature requests. I'll try to fix them as soon as possible, and try to prioritize the requests. (You may wan to use the [reactions](https://github.com/blog/2119-add-reactions-to-pull-requests-issues-and-comments) for that)
|
* Avoid bumping non-fatal issues, or feature requests. I'll try to fix them as soon as possible, and try to prioritize the requests. (You may wan to use the [reactions](https://github.com/blog/2119-add-reactions-to-pull-requests-issues-and-comments) for that)
|
||||||
|
|
||||||
### Pull requests
|
### Pull requests
|
||||||
|
12
CHANGELOG.md
12
CHANGELOG.md
@ -1,3 +1,15 @@
|
|||||||
|
**1.5.2.11**
|
||||||
|
|
||||||
|
- Added a random unique identifier to be used in the logs.
|
||||||
|
|
||||||
|
**1.5.2.08/09/10**
|
||||||
|
|
||||||
|
- Added settable logs for reading articles problems.
|
||||||
|
|
||||||
|
**1.5.2.07**
|
||||||
|
|
||||||
|
- Added the ability to choose the number of items loaded (the maximum value is 200 and is imposed by the selfoss api)
|
||||||
|
|
||||||
**1.5.2.06**
|
**1.5.2.06**
|
||||||
|
|
||||||
- Fix problem introduced in 1.5.2.04. SVG file not working on older versions of android.
|
- Fix problem introduced in 1.5.2.04. SVG file not working on older versions of android.
|
||||||
|
@ -22,8 +22,3 @@ Check the [Contribution guide](https://github.com/aminecmi/ReaderforSelfoss/blob
|
|||||||
- [Check what changed](https://github.com/aminecmi/ReaderforSelfoss/blob/master/CHANGELOG.md)
|
- [Check what changed](https://github.com/aminecmi/ReaderforSelfoss/blob/master/CHANGELOG.md)
|
||||||
- [See what I'm doing](https://github.com/aminecmi/ReaderforSelfoss/projects/1)
|
- [See what I'm doing](https://github.com/aminecmi/ReaderforSelfoss/projects/1)
|
||||||
- [Create an issue, or request a new feature](https://github.com/aminecmi/ReaderforSelfoss/issues)
|
- [Create an issue, or request a new feature](https://github.com/aminecmi/ReaderforSelfoss/issues)
|
||||||
|
|
||||||
|
|
||||||
#Icon
|
|
||||||
|
|
||||||
I used RSS Document by AlfredoCreates.com from the Noun Project. You can see it [here](https://thenounproject.com/search/?q=rss&i=596333).
|
|
@ -80,16 +80,19 @@ class HomeActivity : AppCompatActivity(), SearchView.OnQueryTextListener {
|
|||||||
|
|
||||||
private var items: ArrayList<Item> = ArrayList()
|
private var items: ArrayList<Item> = ArrayList()
|
||||||
private var clickBehavior = false
|
private var clickBehavior = false
|
||||||
|
private var debugReadingItems = false
|
||||||
private var internalBrowser = false
|
private var internalBrowser = false
|
||||||
private var articleViewer = false
|
private var articleViewer = false
|
||||||
private var shouldBeCardView = false
|
private var shouldBeCardView = false
|
||||||
private var displayUnreadCount = false
|
private var displayUnreadCount = false
|
||||||
private var displayAllCount = false
|
private var displayAllCount = false
|
||||||
private var fullHeightCards: Boolean = false
|
private var fullHeightCards: Boolean = false
|
||||||
|
private var itemsNumber: Int = 200
|
||||||
private var elementsShown: Int = 0
|
private var elementsShown: Int = 0
|
||||||
private var maybeTagFilter: Tag? = null
|
private var maybeTagFilter: Tag? = null
|
||||||
private var maybeSourceFilter: Sources? = null
|
private var maybeSourceFilter: Sources? = null
|
||||||
private var maybeSearchFilter: String? = null
|
private var maybeSearchFilter: String? = null
|
||||||
|
private var userIdentifier: String = ""
|
||||||
|
|
||||||
private lateinit var emptyText: TextView
|
private lateinit var emptyText: TextView
|
||||||
private lateinit var recyclerView: RecyclerView
|
private lateinit var recyclerView: RecyclerView
|
||||||
@ -276,6 +279,7 @@ class HomeActivity : AppCompatActivity(), SearchView.OnQueryTextListener {
|
|||||||
|
|
||||||
|
|
||||||
private fun handleSharedPrefs() {
|
private fun handleSharedPrefs() {
|
||||||
|
debugReadingItems = sharedPref.getBoolean("read_debug", false)
|
||||||
clickBehavior = sharedPref.getBoolean("tab_on_tap", false)
|
clickBehavior = sharedPref.getBoolean("tab_on_tap", false)
|
||||||
internalBrowser = sharedPref.getBoolean("prefer_internal_browser", true)
|
internalBrowser = sharedPref.getBoolean("prefer_internal_browser", true)
|
||||||
articleViewer = sharedPref.getBoolean("prefer_article_viewer", true)
|
articleViewer = sharedPref.getBoolean("prefer_article_viewer", true)
|
||||||
@ -283,6 +287,8 @@ class HomeActivity : AppCompatActivity(), SearchView.OnQueryTextListener {
|
|||||||
displayUnreadCount = sharedPref.getBoolean("display_unread_count", true)
|
displayUnreadCount = sharedPref.getBoolean("display_unread_count", true)
|
||||||
displayAllCount = sharedPref.getBoolean("display_other_count", false)
|
displayAllCount = sharedPref.getBoolean("display_other_count", false)
|
||||||
fullHeightCards = sharedPref.getBoolean("full_height_cards", false)
|
fullHeightCards = sharedPref.getBoolean("full_height_cards", false)
|
||||||
|
itemsNumber = sharedPref.getString("prefer_api_items_number", "200").toInt()
|
||||||
|
userIdentifier = sharedPref.getString("unique_id", "")
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun handleDrawer() {
|
private fun handleDrawer() {
|
||||||
@ -612,7 +618,7 @@ class HomeActivity : AppCompatActivity(), SearchView.OnQueryTextListener {
|
|||||||
|
|
||||||
private fun getUnRead() {
|
private fun getUnRead() {
|
||||||
elementsShown = UNREAD_SHOWN
|
elementsShown = UNREAD_SHOWN
|
||||||
doCallTo(R.string.cant_get_new_elements){t, id, f -> api.newItems(t, id, f)}
|
doCallTo(R.string.cant_get_new_elements){t, id, f -> api.newItems(t, id, f, itemsNumber)}
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun getRead() {
|
private fun getRead() {
|
||||||
@ -639,7 +645,9 @@ class HomeActivity : AppCompatActivity(), SearchView.OnQueryTextListener {
|
|||||||
internalBrowser,
|
internalBrowser,
|
||||||
articleViewer,
|
articleViewer,
|
||||||
fullHeightCards,
|
fullHeightCards,
|
||||||
appColors)
|
appColors,
|
||||||
|
debugReadingItems,
|
||||||
|
userIdentifier)
|
||||||
} else {
|
} else {
|
||||||
mAdapter =
|
mAdapter =
|
||||||
ItemListAdapter(
|
ItemListAdapter(
|
||||||
@ -649,7 +657,9 @@ class HomeActivity : AppCompatActivity(), SearchView.OnQueryTextListener {
|
|||||||
customTabActivityHelper,
|
customTabActivityHelper,
|
||||||
clickBehavior,
|
clickBehavior,
|
||||||
internalBrowser,
|
internalBrowser,
|
||||||
articleViewer)
|
articleViewer,
|
||||||
|
debugReadingItems,
|
||||||
|
userIdentifier)
|
||||||
}
|
}
|
||||||
recyclerView.adapter = mAdapter
|
recyclerView.adapter = mAdapter
|
||||||
mAdapter.notifyDataSetChanged()
|
mAdapter.notifyDataSetChanged()
|
||||||
|
@ -51,6 +51,7 @@ class LoginActivity : AppCompatActivity() {
|
|||||||
private lateinit var mPasswordView: EditText
|
private lateinit var mPasswordView: EditText
|
||||||
private lateinit var mHTTPPasswordView: EditText
|
private lateinit var mHTTPPasswordView: EditText
|
||||||
private lateinit var mLoginFormView: View
|
private lateinit var mLoginFormView: View
|
||||||
|
private lateinit var userIdentifier: String
|
||||||
private var logErrors: Boolean = false
|
private var logErrors: Boolean = false
|
||||||
|
|
||||||
|
|
||||||
@ -76,6 +77,7 @@ class LoginActivity : AppCompatActivity() {
|
|||||||
|
|
||||||
|
|
||||||
settings = getSharedPreferences(Config.settingsName, Context.MODE_PRIVATE)
|
settings = getSharedPreferences(Config.settingsName, Context.MODE_PRIVATE)
|
||||||
|
userIdentifier = settings.getString("unique_id", "")
|
||||||
logErrors = settings.getBoolean("loging_debug", false)
|
logErrors = settings.getBoolean("loging_debug", false)
|
||||||
|
|
||||||
editor = settings.edit()
|
editor = settings.edit()
|
||||||
@ -224,6 +226,7 @@ class LoginActivity : AppCompatActivity() {
|
|||||||
mHTTPLoginView.error = getString(R.string.wrong_infos)
|
mHTTPLoginView.error = getString(R.string.wrong_infos)
|
||||||
mHTTPPasswordView.error = getString(R.string.wrong_infos)
|
mHTTPPasswordView.error = getString(R.string.wrong_infos)
|
||||||
if (logErrors) {
|
if (logErrors) {
|
||||||
|
Crashlytics.setUserIdentifier(userIdentifier)
|
||||||
Crashlytics.log(100, "LOGIN_DEBUG_ERRROR", t.message)
|
Crashlytics.log(100, "LOGIN_DEBUG_ERRROR", t.message)
|
||||||
Crashlytics.logException(t)
|
Crashlytics.logException(t)
|
||||||
Toast.makeText(this@LoginActivity, t.message, Toast.LENGTH_LONG).show()
|
Toast.makeText(this@LoginActivity, t.message, Toast.LENGTH_LONG).show()
|
||||||
|
@ -6,6 +6,7 @@ import android.net.Uri
|
|||||||
import android.preference.PreferenceManager
|
import android.preference.PreferenceManager
|
||||||
import android.support.multidex.MultiDexApplication
|
import android.support.multidex.MultiDexApplication
|
||||||
import android.widget.ImageView
|
import android.widget.ImageView
|
||||||
|
import apps.amine.bou.readerforselfoss.utils.Config
|
||||||
import com.anupcowkur.reservoir.Reservoir
|
import com.anupcowkur.reservoir.Reservoir
|
||||||
import com.bumptech.glide.Glide
|
import com.bumptech.glide.Glide
|
||||||
import com.crashlytics.android.Crashlytics
|
import com.crashlytics.android.Crashlytics
|
||||||
@ -15,9 +16,13 @@ import com.mikepenz.materialdrawer.util.AbstractDrawerImageLoader
|
|||||||
import com.mikepenz.materialdrawer.util.DrawerImageLoader
|
import com.mikepenz.materialdrawer.util.DrawerImageLoader
|
||||||
import io.fabric.sdk.android.Fabric
|
import io.fabric.sdk.android.Fabric
|
||||||
import java.io.IOException
|
import java.io.IOException
|
||||||
|
import java.util.UUID.randomUUID
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
class MyApp : MultiDexApplication() {
|
class MyApp : MultiDexApplication() {
|
||||||
|
|
||||||
override fun onCreate() {
|
override fun onCreate() {
|
||||||
super.onCreate()
|
super.onCreate()
|
||||||
Fabric.with(this, Crashlytics())
|
Fabric.with(this, Crashlytics())
|
||||||
@ -26,6 +31,13 @@ class MyApp : MultiDexApplication() {
|
|||||||
|
|
||||||
initCache()
|
initCache()
|
||||||
|
|
||||||
|
val prefs = getSharedPreferences(Config.settingsName, Context.MODE_PRIVATE)
|
||||||
|
if (prefs.getString("unique_id", "").isEmpty()) {
|
||||||
|
val editor = prefs.edit()
|
||||||
|
editor.putString("unique_id", randomUUID().toString())
|
||||||
|
editor.apply()
|
||||||
|
}
|
||||||
|
|
||||||
initDrawerImageLoader()
|
initDrawerImageLoader()
|
||||||
|
|
||||||
initTheme()
|
initTheme()
|
||||||
|
@ -2,15 +2,12 @@ package apps.amine.bou.readerforselfoss.adapters
|
|||||||
|
|
||||||
import android.app.Activity
|
import android.app.Activity
|
||||||
import android.content.Context
|
import android.content.Context
|
||||||
import android.graphics.Bitmap
|
|
||||||
import android.graphics.Color
|
import android.graphics.Color
|
||||||
import android.support.constraint.ConstraintLayout
|
import android.support.constraint.ConstraintLayout
|
||||||
import android.support.design.widget.Snackbar
|
import android.support.design.widget.Snackbar
|
||||||
import android.support.v4.graphics.drawable.RoundedBitmapDrawableFactory
|
|
||||||
import android.support.v7.widget.CardView
|
import android.support.v7.widget.CardView
|
||||||
import android.support.v7.widget.RecyclerView
|
import android.support.v7.widget.RecyclerView
|
||||||
import android.text.Html
|
import android.text.Html
|
||||||
import android.text.format.DateUtils
|
|
||||||
import android.view.LayoutInflater
|
import android.view.LayoutInflater
|
||||||
import android.view.ViewGroup
|
import android.view.ViewGroup
|
||||||
import android.widget.ImageButton
|
import android.widget.ImageButton
|
||||||
@ -22,15 +19,11 @@ import android.widget.Toast
|
|||||||
import com.amulyakhare.textdrawable.TextDrawable
|
import com.amulyakhare.textdrawable.TextDrawable
|
||||||
import com.amulyakhare.textdrawable.util.ColorGenerator
|
import com.amulyakhare.textdrawable.util.ColorGenerator
|
||||||
import com.bumptech.glide.Glide
|
import com.bumptech.glide.Glide
|
||||||
import com.bumptech.glide.request.target.BitmapImageViewTarget
|
|
||||||
import com.like.LikeButton
|
import com.like.LikeButton
|
||||||
import com.like.OnLikeListener
|
import com.like.OnLikeListener
|
||||||
import retrofit2.Call
|
import retrofit2.Call
|
||||||
import retrofit2.Callback
|
import retrofit2.Callback
|
||||||
import retrofit2.Response
|
import retrofit2.Response
|
||||||
import java.text.ParseException
|
|
||||||
import java.text.SimpleDateFormat
|
|
||||||
import java.util.*
|
|
||||||
|
|
||||||
import apps.amine.bou.readerforselfoss.R
|
import apps.amine.bou.readerforselfoss.R
|
||||||
import apps.amine.bou.readerforselfoss.api.selfoss.Item
|
import apps.amine.bou.readerforselfoss.api.selfoss.Item
|
||||||
@ -39,6 +32,8 @@ import apps.amine.bou.readerforselfoss.api.selfoss.SuccessResponse
|
|||||||
import apps.amine.bou.readerforselfoss.themes.AppColors
|
import apps.amine.bou.readerforselfoss.themes.AppColors
|
||||||
import apps.amine.bou.readerforselfoss.utils.*
|
import apps.amine.bou.readerforselfoss.utils.*
|
||||||
import apps.amine.bou.readerforselfoss.utils.customtabs.CustomTabActivityHelper
|
import apps.amine.bou.readerforselfoss.utils.customtabs.CustomTabActivityHelper
|
||||||
|
import com.crashlytics.android.Crashlytics
|
||||||
|
import kotlin.collections.ArrayList
|
||||||
|
|
||||||
class ItemCardAdapter(private val app: Activity,
|
class ItemCardAdapter(private val app: Activity,
|
||||||
private val items: ArrayList<Item>,
|
private val items: ArrayList<Item>,
|
||||||
@ -47,7 +42,9 @@ class ItemCardAdapter(private val app: Activity,
|
|||||||
private val internalBrowser: Boolean,
|
private val internalBrowser: Boolean,
|
||||||
private val articleViewer: Boolean,
|
private val articleViewer: Boolean,
|
||||||
private val fullHeightCards: Boolean,
|
private val fullHeightCards: Boolean,
|
||||||
private val appColors: AppColors) : RecyclerView.Adapter<ItemCardAdapter.ViewHolder>() {
|
private val appColors: AppColors,
|
||||||
|
val debugReadingItems: Boolean,
|
||||||
|
val userIdentifier: String) : RecyclerView.Adapter<ItemCardAdapter.ViewHolder>() {
|
||||||
private val c: Context = app.baseContext
|
private val c: Context = app.baseContext
|
||||||
private val generator: ColorGenerator = ColorGenerator.MATERIAL
|
private val generator: ColorGenerator = ColorGenerator.MATERIAL
|
||||||
|
|
||||||
@ -130,11 +127,31 @@ class ItemCardAdapter(private val app: Activity,
|
|||||||
|
|
||||||
api.markItem(i.id).enqueue(object : Callback<SuccessResponse> {
|
api.markItem(i.id).enqueue(object : Callback<SuccessResponse> {
|
||||||
override fun onResponse(call: Call<SuccessResponse>, response: Response<SuccessResponse>) {
|
override fun onResponse(call: Call<SuccessResponse>, response: Response<SuccessResponse>) {
|
||||||
|
if (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}"
|
||||||
|
Crashlytics.setUserIdentifier(userIdentifier)
|
||||||
|
Crashlytics.log(100, "READ_DEBUG_SUCCESS", message)
|
||||||
|
Crashlytics.logException(Exception("Was success, but did it work ?"))
|
||||||
|
|
||||||
|
Toast.makeText(c, message, Toast.LENGTH_LONG).show()
|
||||||
|
}
|
||||||
doUnmark(i, position)
|
doUnmark(i, position)
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun onFailure(call: Call<SuccessResponse>, t: Throwable) {
|
override fun onFailure(call: Call<SuccessResponse>, t: Throwable) {
|
||||||
|
if (debugReadingItems) {
|
||||||
|
Crashlytics.setUserIdentifier(userIdentifier)
|
||||||
|
Crashlytics.log(100, "READ_DEBUG_ERROR", t.message)
|
||||||
|
Crashlytics.logException(t)
|
||||||
|
Toast.makeText(c, t.message, Toast.LENGTH_LONG).show()
|
||||||
|
}
|
||||||
Toast.makeText(app, app.getString(R.string.cant_mark_read), Toast.LENGTH_SHORT).show()
|
Toast.makeText(app, app.getString(R.string.cant_mark_read), Toast.LENGTH_SHORT).show()
|
||||||
items.add(i)
|
items.add(i)
|
||||||
notifyItemInserted(position)
|
notifyItemInserted(position)
|
||||||
|
@ -3,16 +3,11 @@ package apps.amine.bou.readerforselfoss.adapters
|
|||||||
|
|
||||||
import android.app.Activity
|
import android.app.Activity
|
||||||
import android.content.Context
|
import android.content.Context
|
||||||
import android.content.Intent
|
|
||||||
import android.graphics.Bitmap
|
|
||||||
import android.graphics.Color
|
import android.graphics.Color
|
||||||
import android.net.Uri
|
|
||||||
import android.support.constraint.ConstraintLayout
|
import android.support.constraint.ConstraintLayout
|
||||||
import android.support.design.widget.Snackbar
|
import android.support.design.widget.Snackbar
|
||||||
import android.support.v4.graphics.drawable.RoundedBitmapDrawableFactory
|
|
||||||
import android.support.v7.widget.RecyclerView
|
import android.support.v7.widget.RecyclerView
|
||||||
import android.text.Html
|
import android.text.Html
|
||||||
import android.text.format.DateUtils
|
|
||||||
import android.util.TypedValue
|
import android.util.TypedValue
|
||||||
import android.view.LayoutInflater
|
import android.view.LayoutInflater
|
||||||
import android.view.View
|
import android.view.View
|
||||||
@ -21,24 +16,21 @@ import android.widget.*
|
|||||||
|
|
||||||
import com.amulyakhare.textdrawable.TextDrawable
|
import com.amulyakhare.textdrawable.TextDrawable
|
||||||
import com.amulyakhare.textdrawable.util.ColorGenerator
|
import com.amulyakhare.textdrawable.util.ColorGenerator
|
||||||
import com.bumptech.glide.Glide
|
|
||||||
import com.bumptech.glide.request.target.BitmapImageViewTarget
|
|
||||||
import com.like.LikeButton
|
import com.like.LikeButton
|
||||||
import com.like.OnLikeListener
|
import com.like.OnLikeListener
|
||||||
import retrofit2.Call
|
import retrofit2.Call
|
||||||
import retrofit2.Callback
|
import retrofit2.Callback
|
||||||
import retrofit2.Response
|
import retrofit2.Response
|
||||||
import java.text.ParseException
|
|
||||||
import java.text.SimpleDateFormat
|
|
||||||
import java.util.*
|
import java.util.*
|
||||||
|
|
||||||
import apps.amine.bou.readerforselfoss.R
|
import apps.amine.bou.readerforselfoss.R
|
||||||
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
|
||||||
import apps.amine.bou.readerforselfoss.api.selfoss.SuccessResponse
|
import apps.amine.bou.readerforselfoss.api.selfoss.SuccessResponse
|
||||||
import apps.amine.bou.readerforselfoss.themes.AppColors
|
|
||||||
import apps.amine.bou.readerforselfoss.utils.*
|
import apps.amine.bou.readerforselfoss.utils.*
|
||||||
import apps.amine.bou.readerforselfoss.utils.customtabs.CustomTabActivityHelper
|
import apps.amine.bou.readerforselfoss.utils.customtabs.CustomTabActivityHelper
|
||||||
|
import com.crashlytics.android.Crashlytics
|
||||||
|
import kotlin.collections.ArrayList
|
||||||
|
|
||||||
|
|
||||||
class ItemListAdapter(private val app: Activity,
|
class ItemListAdapter(private val app: Activity,
|
||||||
@ -47,7 +39,9 @@ class ItemListAdapter(private val app: Activity,
|
|||||||
private val helper: CustomTabActivityHelper,
|
private val helper: CustomTabActivityHelper,
|
||||||
private val clickBehavior: Boolean,
|
private val clickBehavior: Boolean,
|
||||||
private val internalBrowser: Boolean,
|
private val internalBrowser: Boolean,
|
||||||
private val articleViewer: Boolean) : RecyclerView.Adapter<ItemListAdapter.ViewHolder>() {
|
private val articleViewer: Boolean,
|
||||||
|
val debugReadingItems: Boolean,
|
||||||
|
val userIdentifier: String) : RecyclerView.Adapter<ItemListAdapter.ViewHolder>() {
|
||||||
private val generator: ColorGenerator = ColorGenerator.MATERIAL
|
private val generator: ColorGenerator = ColorGenerator.MATERIAL
|
||||||
private val c: Context = app.baseContext
|
private val c: Context = app.baseContext
|
||||||
private val bars: ArrayList<Boolean> = ArrayList(Collections.nCopies(items.size + 1, false))
|
private val bars: ArrayList<Boolean> = ArrayList(Collections.nCopies(items.size + 1, false))
|
||||||
@ -142,11 +136,31 @@ class ItemListAdapter(private val app: Activity,
|
|||||||
|
|
||||||
api.markItem(i.id).enqueue(object : Callback<SuccessResponse> {
|
api.markItem(i.id).enqueue(object : Callback<SuccessResponse> {
|
||||||
override fun onResponse(call: Call<SuccessResponse>, response: Response<SuccessResponse>) {
|
override fun onResponse(call: Call<SuccessResponse>, response: Response<SuccessResponse>) {
|
||||||
|
if (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}"
|
||||||
|
Crashlytics.setUserIdentifier(userIdentifier)
|
||||||
|
Crashlytics.log(100, "READ_DEBUG_SUCCESS", message)
|
||||||
|
Crashlytics.logException(Exception("Was success, but did it work ?"))
|
||||||
|
Toast.makeText(c, message, Toast.LENGTH_LONG).show()
|
||||||
|
}
|
||||||
doUnmark(i, position)
|
doUnmark(i, position)
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun onFailure(call: Call<SuccessResponse>, t: Throwable) {
|
override fun onFailure(call: Call<SuccessResponse>, t: Throwable) {
|
||||||
|
if (debugReadingItems) {
|
||||||
|
Crashlytics.setUserIdentifier(userIdentifier)
|
||||||
|
Crashlytics.log(100, "READ_DEBUG_ERROR", t.message)
|
||||||
|
Crashlytics.logException(t)
|
||||||
|
Toast.makeText(c, t.message, Toast.LENGTH_LONG).show()
|
||||||
|
}
|
||||||
Toast.makeText(app, app.getString(R.string.cant_mark_read), Toast.LENGTH_SHORT).show()
|
Toast.makeText(app, app.getString(R.string.cant_mark_read), Toast.LENGTH_SHORT).show()
|
||||||
items.add(i)
|
items.add(i)
|
||||||
notifyItemInserted(position)
|
notifyItemInserted(position)
|
||||||
|
@ -124,16 +124,16 @@ class SelfossApi(c: Context, callingActivity: Activity, isWithSelfSignedCert: Bo
|
|||||||
service.loginToSelfoss(config.userLogin, config.userPassword)
|
service.loginToSelfoss(config.userLogin, config.userPassword)
|
||||||
|
|
||||||
fun readItems(tag: String?, sourceId: Long?, search: String?): Call<List<Item>> =
|
fun readItems(tag: String?, sourceId: Long?, search: String?): Call<List<Item>> =
|
||||||
getItems("read", tag, sourceId, search)
|
getItems("read", tag, sourceId, search, 200)
|
||||||
|
|
||||||
fun newItems(tag: String?, sourceId: Long?, search: String?): Call<List<Item>> =
|
fun newItems(tag: String?, sourceId: Long?, search: String?, itemsNumber: Int): Call<List<Item>> =
|
||||||
getItems("unread", tag, sourceId, search)
|
getItems("unread", tag, sourceId, search, itemsNumber)
|
||||||
|
|
||||||
fun starredItems(tag: String?, sourceId: Long?, search: String?): Call<List<Item>> =
|
fun starredItems(tag: String?, sourceId: Long?, search: String?): Call<List<Item>> =
|
||||||
getItems("starred", tag, sourceId, search)
|
getItems("starred", tag, sourceId, search, 200)
|
||||||
|
|
||||||
private fun getItems(type: String, tag: String?, sourceId: Long?, search: String?): Call<List<Item>> =
|
private fun getItems(type: String, tag: String?, sourceId: Long?, search: String?, items: Int): Call<List<Item>> =
|
||||||
service.getItems(type, tag, sourceId, search, userName, password)
|
service.getItems(type, tag, sourceId, search, userName, password, items)
|
||||||
|
|
||||||
fun markItem(itemId: String): Call<SuccessResponse> =
|
fun markItem(itemId: String): Call<SuccessResponse> =
|
||||||
service.markAsRead(itemId, userName, password)
|
service.markAsRead(itemId, userName, password)
|
||||||
|
@ -22,7 +22,8 @@ internal interface SelfossService {
|
|||||||
@Query("source") source: Long?,
|
@Query("source") source: Long?,
|
||||||
@Query("search") search: String?,
|
@Query("search") search: String?,
|
||||||
@Query("username") username: String,
|
@Query("username") username: String,
|
||||||
@Query("password") password: String): Call<List<Item>>
|
@Query("password") password: String,
|
||||||
|
@Query("items") items: Int): Call<List<Item>>
|
||||||
|
|
||||||
@POST("mark/{id}")
|
@POST("mark/{id}")
|
||||||
fun markAsRead(@Path("id") id: String,
|
fun markAsRead(@Path("id") id: String,
|
||||||
|
@ -2,24 +2,33 @@ package apps.amine.bou.readerforselfoss.settings;
|
|||||||
|
|
||||||
|
|
||||||
import android.annotation.TargetApi;
|
import android.annotation.TargetApi;
|
||||||
|
import android.content.ClipData;
|
||||||
|
import android.content.ClipboardManager;
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.content.Intent;
|
import android.content.Intent;
|
||||||
|
import android.content.SharedPreferences;
|
||||||
import android.content.res.Configuration;
|
import android.content.res.Configuration;
|
||||||
import android.net.Uri;
|
import android.net.Uri;
|
||||||
import android.os.Build;
|
import android.os.Build;
|
||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
|
import android.preference.EditTextPreference;
|
||||||
import android.preference.Preference;
|
import android.preference.Preference;
|
||||||
import android.preference.Preference.OnPreferenceChangeListener;
|
import android.preference.Preference.OnPreferenceChangeListener;
|
||||||
|
import android.preference.Preference.OnPreferenceClickListener;
|
||||||
import android.preference.PreferenceActivity;
|
import android.preference.PreferenceActivity;
|
||||||
import android.preference.SwitchPreference;
|
import android.preference.SwitchPreference;
|
||||||
import android.support.v7.app.ActionBar;
|
import android.support.v7.app.ActionBar;
|
||||||
import android.preference.PreferenceFragment;
|
import android.preference.PreferenceFragment;
|
||||||
import android.preference.PreferenceManager;
|
import android.preference.PreferenceManager;
|
||||||
|
import android.text.InputFilter;
|
||||||
|
import android.text.Spanned;
|
||||||
import android.view.MenuItem;
|
import android.view.MenuItem;
|
||||||
|
import android.widget.Toast;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
import apps.amine.bou.readerforselfoss.R;
|
import apps.amine.bou.readerforselfoss.R;
|
||||||
|
import apps.amine.bou.readerforselfoss.utils.Config;
|
||||||
import com.ftinc.scoop.ui.ScoopSettingsActivity;
|
import com.ftinc.scoop.ui.ScoopSettingsActivity;
|
||||||
|
|
||||||
|
|
||||||
@ -145,6 +154,22 @@ public class SettingsActivity extends AppCompatPreferenceActivity {
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
EditTextPreference itemsNumber = (EditTextPreference) findPreference("prefer_api_items_number");
|
||||||
|
itemsNumber.getEditText().setFilters(new InputFilter[]{
|
||||||
|
new InputFilter (){
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) {
|
||||||
|
try {
|
||||||
|
int input = Integer.parseInt(dest.toString() + source.toString());
|
||||||
|
if (input <= 200 && input >0)
|
||||||
|
return null;
|
||||||
|
} catch (NumberFormatException nfe) { }
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -165,6 +190,25 @@ public class SettingsActivity extends AppCompatPreferenceActivity {
|
|||||||
super.onCreate(savedInstanceState);
|
super.onCreate(savedInstanceState);
|
||||||
addPreferencesFromResource(R.xml.pref_debug);
|
addPreferencesFromResource(R.xml.pref_debug);
|
||||||
setHasOptionsMenu(true);
|
setHasOptionsMenu(true);
|
||||||
|
|
||||||
|
SharedPreferences pref = getActivity().getSharedPreferences(Config.Companion.getSettingsName(), Context.MODE_PRIVATE);
|
||||||
|
final String id = pref.getString("unique_id", "...");
|
||||||
|
|
||||||
|
final Preference identifier = findPreference("debug_identifier");
|
||||||
|
final ClipboardManager clipboard = (ClipboardManager)
|
||||||
|
getActivity().getSystemService(Context.CLIPBOARD_SERVICE);
|
||||||
|
|
||||||
|
identifier.setOnPreferenceClickListener(new OnPreferenceClickListener() {
|
||||||
|
@Override
|
||||||
|
public boolean onPreferenceClick(Preference preference) {
|
||||||
|
ClipData clip = ClipData.newPlainText("Selfoss unique id", id);
|
||||||
|
clipboard.setPrimaryClip(clip);
|
||||||
|
|
||||||
|
Toast.makeText(getActivity(), R.string.unique_id_to_clipboard, Toast.LENGTH_LONG).show();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
identifier.setTitle(id);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -138,4 +138,11 @@
|
|||||||
<string name="login_menu_debug">Debug</string>
|
<string name="login_menu_debug">Debug</string>
|
||||||
<string name="self_hosted_cert_switch">Certificat auto-signé ?</string>
|
<string name="self_hosted_cert_switch">Certificat auto-signé ?</string>
|
||||||
<string name="self_signed_cert_warning">Pour des raisons de sécurités, les certificats auto-signés sont désactivés par défaut. En les activant, je ne serais pas responsable de quelconques problèmes de sécurité rencontrés.</string>
|
<string name="self_signed_cert_warning">Pour des raisons de sécurités, les certificats auto-signés sont désactivés par défaut. En les activant, je ne serais pas responsable de quelconques problèmes de sécurité rencontrés.</string>
|
||||||
|
<string name="pref_selfoss_category">Api Selfoss</string>
|
||||||
|
<string name="pref_api_items_number_title">Nombre d\'articles chargés</string>
|
||||||
|
<string name="read_debug_title">Des articles lus marqués comme non lus ?</string>
|
||||||
|
<string name="read_debug_on">Les appels API vont être logués lorsequ\'un article est marqué comme lu</string>
|
||||||
|
<string name="read_debug_off">Aucun log quand un article est marqué comme lu</string>
|
||||||
|
<string name="summary_debug_identifier">Identifiant de debug</string>
|
||||||
|
<string name="unique_id_to_clipboard">Texte copié</string>
|
||||||
</resources>
|
</resources>
|
@ -138,4 +138,11 @@
|
|||||||
<string name="login_menu_debug">Debug</string>
|
<string name="login_menu_debug">Debug</string>
|
||||||
<string name="self_hosted_cert_switch">Using a self hosted certificate ?</string>
|
<string name="self_hosted_cert_switch">Using a self hosted certificate ?</string>
|
||||||
<string name="self_signed_cert_warning">Due to security reasons, self signed certificates are not supported by default. By activating this, I\'ll not be responsible of any security problem you encounter.</string>
|
<string name="self_signed_cert_warning">Due to security reasons, self signed certificates are not supported by default. By activating this, I\'ll not be responsible of any security problem you encounter.</string>
|
||||||
|
<string name="pref_selfoss_category">Selfoss Api</string>
|
||||||
|
<string name="pref_api_items_number_title">Loaded items number</string>
|
||||||
|
<string name="read_debug_title">Read articles appearing as unread ?</string>
|
||||||
|
<string name="read_debug_on">Api calls will be logged when marking an article as read</string>
|
||||||
|
<string name="read_debug_off">No log when marking an item as read</string>
|
||||||
|
<string name="summary_debug_identifier">Debug identifier</string>
|
||||||
|
<string name="unique_id_to_clipboard">Identifier copied to your clipboard</string>
|
||||||
</resources>
|
</resources>
|
@ -140,4 +140,11 @@
|
|||||||
<string name="login_menu_debug">Debug</string>
|
<string name="login_menu_debug">Debug</string>
|
||||||
<string name="self_hosted_cert_switch">Using a self hosted certificate ?</string>
|
<string name="self_hosted_cert_switch">Using a self hosted certificate ?</string>
|
||||||
<string name="self_signed_cert_warning">Due to security reasons, self signed certificates are not supported by default. By activating this, I\'ll not be responsible of any security problem you encounter.</string>
|
<string name="self_signed_cert_warning">Due to security reasons, self signed certificates are not supported by default. By activating this, I\'ll not be responsible of any security problem you encounter.</string>
|
||||||
|
<string name="pref_selfoss_category">Selfoss Api</string>
|
||||||
|
<string name="pref_api_items_number_title">Loaded items number</string>
|
||||||
|
<string name="read_debug_title">Read articles appearing as unread ?</string>
|
||||||
|
<string name="read_debug_off">No log when marking an item as read</string>
|
||||||
|
<string name="read_debug_on">Api calls will be logged when marking an article as read</string>
|
||||||
|
<string name="summary_debug_identifier">Debug identifier</string>
|
||||||
|
<string name="unique_id_to_clipboard">Identifier copied to your clipboard</string>
|
||||||
</resources>
|
</resources>
|
@ -7,4 +7,17 @@
|
|||||||
android:summaryOff="@string/login_debug_off"
|
android:summaryOff="@string/login_debug_off"
|
||||||
android:summaryOn="@string/login_debug_on"
|
android:summaryOn="@string/login_debug_on"
|
||||||
android:title="@string/login_debug_title" />
|
android:title="@string/login_debug_title" />
|
||||||
|
|
||||||
|
|
||||||
|
<SwitchPreference
|
||||||
|
android:defaultValue="false"
|
||||||
|
android:key="read_debug"
|
||||||
|
android:summaryOff="@string/read_debug_off"
|
||||||
|
android:summaryOn="@string/read_debug_on"
|
||||||
|
android:title="@string/read_debug_title" />
|
||||||
|
|
||||||
|
<Preference
|
||||||
|
android:enabled="true"
|
||||||
|
android:key="debug_identifier"
|
||||||
|
android:summary="@string/summary_debug_identifier" />
|
||||||
</PreferenceScreen>
|
</PreferenceScreen>
|
@ -1,4 +1,5 @@
|
|||||||
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
|
<PreferenceScreen xmlns:tools="http://schemas.android.com/tools"
|
||||||
|
xmlns:android="http://schemas.android.com/apk/res/android">
|
||||||
|
|
||||||
<!--<SwitchPreference
|
<!--<SwitchPreference
|
||||||
android:defaultValue="false"
|
android:defaultValue="false"
|
||||||
@ -6,6 +7,17 @@
|
|||||||
android:summary="@string/pref_switch_browser"
|
android:summary="@string/pref_switch_browser"
|
||||||
android:title="@string/pref_switch_browser_title"/>-->
|
android:title="@string/pref_switch_browser_title"/>-->
|
||||||
|
|
||||||
|
<PreferenceCategory
|
||||||
|
android:title="@string/pref_selfoss_category">
|
||||||
|
|
||||||
|
</PreferenceCategory>
|
||||||
|
<EditTextPreference
|
||||||
|
android:defaultValue="200"
|
||||||
|
android:inputType="number"
|
||||||
|
android:key="prefer_api_items_number"
|
||||||
|
android:selectAllOnFocus="true"
|
||||||
|
android:singleLine="true"
|
||||||
|
android:title="@string/pref_api_items_number_title" />
|
||||||
<PreferenceCategory
|
<PreferenceCategory
|
||||||
android:title="@string/pref_general_category_links">
|
android:title="@string/pref_general_category_links">
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user