Allow marking articles as read from the article reader (#346)
* Add new items according to the selfoss id, to avoid duplicate items. * Migrate setting articles as read from ArticleFragment to SharedItems * Removed unused assertion * Allow marking articles as read from the article reader
This commit is contained in:
parent
46e723a238
commit
58a498868d
@ -377,11 +377,7 @@ class HomeActivity : AppCompatActivity(), SearchView.OnQueryTextListener {
|
|||||||
|
|
||||||
handleOfflineActions()
|
handleOfflineActions()
|
||||||
|
|
||||||
if (markOnScroll) {
|
getElementsAccordingToTab()
|
||||||
items = SharedItems.focusedItems
|
|
||||||
allItems = SharedItems.items
|
|
||||||
handleListResult()
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun getAndStoreAllItems() {
|
private fun getAndStoreAllItems() {
|
||||||
|
@ -14,6 +14,7 @@ import android.os.Bundle
|
|||||||
import android.preference.PreferenceManager
|
import android.preference.PreferenceManager
|
||||||
import android.view.*
|
import android.view.*
|
||||||
import android.webkit.*
|
import android.webkit.*
|
||||||
|
import android.widget.Toast
|
||||||
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
|
||||||
@ -28,25 +29,17 @@ import apps.amine.bou.readerforselfoss.api.mercury.MercuryApi
|
|||||||
import apps.amine.bou.readerforselfoss.api.mercury.ParsedContent
|
import apps.amine.bou.readerforselfoss.api.mercury.ParsedContent
|
||||||
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.databinding.FragmentArticleBinding
|
import apps.amine.bou.readerforselfoss.databinding.FragmentArticleBinding
|
||||||
import apps.amine.bou.readerforselfoss.persistence.database.AppDatabase
|
import apps.amine.bou.readerforselfoss.persistence.database.AppDatabase
|
||||||
import apps.amine.bou.readerforselfoss.persistence.entities.ActionEntity
|
|
||||||
import apps.amine.bou.readerforselfoss.persistence.migrations.MIGRATION_1_2
|
import apps.amine.bou.readerforselfoss.persistence.migrations.MIGRATION_1_2
|
||||||
import apps.amine.bou.readerforselfoss.persistence.migrations.MIGRATION_2_3
|
import apps.amine.bou.readerforselfoss.persistence.migrations.MIGRATION_2_3
|
||||||
import apps.amine.bou.readerforselfoss.persistence.migrations.MIGRATION_3_4
|
import apps.amine.bou.readerforselfoss.persistence.migrations.MIGRATION_3_4
|
||||||
import apps.amine.bou.readerforselfoss.themes.AppColors
|
import apps.amine.bou.readerforselfoss.themes.AppColors
|
||||||
import apps.amine.bou.readerforselfoss.utils.Config
|
import apps.amine.bou.readerforselfoss.utils.*
|
||||||
import apps.amine.bou.readerforselfoss.utils.buildCustomTabsIntent
|
|
||||||
import apps.amine.bou.readerforselfoss.utils.customtabs.CustomTabActivityHelper
|
import apps.amine.bou.readerforselfoss.utils.customtabs.CustomTabActivityHelper
|
||||||
import apps.amine.bou.readerforselfoss.utils.glide.loadMaybeBasicAuth
|
import apps.amine.bou.readerforselfoss.utils.glide.loadMaybeBasicAuth
|
||||||
import apps.amine.bou.readerforselfoss.utils.glide.getBitmapInputStream
|
import apps.amine.bou.readerforselfoss.utils.glide.getBitmapInputStream
|
||||||
import apps.amine.bou.readerforselfoss.utils.isEmptyOrNullOrNullString
|
|
||||||
import apps.amine.bou.readerforselfoss.utils.network.isNetworkAccessible
|
import apps.amine.bou.readerforselfoss.utils.network.isNetworkAccessible
|
||||||
import apps.amine.bou.readerforselfoss.utils.openItemUrl
|
|
||||||
import apps.amine.bou.readerforselfoss.utils.shareLink
|
|
||||||
import apps.amine.bou.readerforselfoss.utils.sourceAndDateText
|
|
||||||
import apps.amine.bou.readerforselfoss.utils.succeeded
|
|
||||||
import com.bumptech.glide.Glide
|
import com.bumptech.glide.Glide
|
||||||
import com.bumptech.glide.load.engine.DiskCacheStrategy
|
import com.bumptech.glide.load.engine.DiskCacheStrategy
|
||||||
import com.bumptech.glide.request.RequestOptions
|
import com.bumptech.glide.request.RequestOptions
|
||||||
@ -58,7 +51,6 @@ import java.net.MalformedURLException
|
|||||||
import java.net.URL
|
import java.net.URL
|
||||||
import java.util.concurrent.ExecutionException
|
import java.util.concurrent.ExecutionException
|
||||||
import kotlin.collections.ArrayList
|
import kotlin.collections.ArrayList
|
||||||
import kotlin.concurrent.thread
|
|
||||||
|
|
||||||
class ArticleFragment : Fragment() {
|
class ArticleFragment : Fragment() {
|
||||||
private lateinit var pageNumber: Number
|
private lateinit var pageNumber: Number
|
||||||
@ -181,25 +173,33 @@ class ArticleFragment : Fragment() {
|
|||||||
false,
|
false,
|
||||||
requireActivity()
|
requireActivity()
|
||||||
)
|
)
|
||||||
R.id.unread_action -> if ((context != null && requireContext().isNetworkAccessible(null)) || context == null) {
|
R.id.unread_action -> if (context != null) {
|
||||||
api.unmarkItem(allItems[pageNumber.toInt()].id).enqueue(
|
if (allItems[pageNumber.toInt()].unread) {
|
||||||
object : Callback<SuccessResponse> {
|
SharedItems.readItem(
|
||||||
override fun onResponse(
|
context!!,
|
||||||
call: Call<SuccessResponse>,
|
api,
|
||||||
response: Response<SuccessResponse>
|
db,
|
||||||
) {
|
allItems[pageNumber.toInt()]
|
||||||
}
|
|
||||||
|
|
||||||
override fun onFailure(
|
|
||||||
call: Call<SuccessResponse>,
|
|
||||||
t: Throwable
|
|
||||||
) {
|
|
||||||
}
|
|
||||||
}
|
|
||||||
)
|
)
|
||||||
|
allItems[pageNumber.toInt()].unread = false
|
||||||
|
Toast.makeText(
|
||||||
|
context,
|
||||||
|
R.string.marked_as_read,
|
||||||
|
Toast.LENGTH_LONG
|
||||||
|
).show()
|
||||||
} else {
|
} else {
|
||||||
thread {
|
SharedItems.unreadItem(
|
||||||
db.actionsDao().insertAllActions(ActionEntity(allItems[pageNumber.toInt()].id, false, true, false, false))
|
context!!,
|
||||||
|
api,
|
||||||
|
db,
|
||||||
|
allItems[pageNumber.toInt()]
|
||||||
|
)
|
||||||
|
allItems[pageNumber.toInt()].unread = true
|
||||||
|
Toast.makeText(
|
||||||
|
context,
|
||||||
|
R.string.marked_as_unread,
|
||||||
|
Toast.LENGTH_LONG
|
||||||
|
).show()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else -> Unit
|
else -> Unit
|
||||||
|
@ -72,10 +72,17 @@ object SharedItems {
|
|||||||
var badgeAll = -1
|
var badgeAll = -1
|
||||||
var badgeStarred = -1
|
var badgeStarred = -1
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Add new items to the SharedItems list
|
||||||
|
*
|
||||||
|
* The new items are considered more updated than the ones already in the list.
|
||||||
|
* The old items present in the new list are discarded and replaced by the new ones.
|
||||||
|
* Items are compared according to the selfoss id, which should always be unique.
|
||||||
|
*/
|
||||||
fun appendNewItems(newItems: ArrayList<Item>) {
|
fun appendNewItems(newItems: ArrayList<Item>) {
|
||||||
val tmpItems = items
|
var tmpItems = items
|
||||||
if (tmpItems != newItems) {
|
if (tmpItems != newItems) {
|
||||||
newItems.removeAll(tmpItems)
|
tmpItems = tmpItems.filter { item -> newItems.find { it.id == item.id } == null } as ArrayList<Item>
|
||||||
tmpItems.addAll(newItems)
|
tmpItems.addAll(newItems)
|
||||||
items = tmpItems
|
items = tmpItems
|
||||||
|
|
||||||
|
5
app/src/main/res/drawable/ic_baseline_white_eye_24dp.xml
Normal file
5
app/src/main/res/drawable/ic_baseline_white_eye_24dp.xml
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
<vector android:height="24dp" android:tint="#FFFFFF"
|
||||||
|
android:viewportHeight="24" android:viewportWidth="24"
|
||||||
|
android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
|
||||||
|
<path android:fillColor="@android:color/white" android:pathData="M12,4.5C7,4.5 2.73,7.61 1,12c1.73,4.39 6,7.5 11,7.5s9.27,-3.11 11,-7.5c-1.73,-4.39 -6,-7.5 -11,-7.5zM12,17c-2.76,0 -5,-2.24 -5,-5s2.24,-5 5,-5 5,2.24 5,5 -2.24,5 -5,5zM12,9c-1.66,0 -3,1.34 -3,3s1.34,3 3,3 3,-1.34 3,-3 -1.34,-3 -3,-3z"/>
|
||||||
|
</vector>
|
@ -1,5 +0,0 @@
|
|||||||
<vector android:height="24dp" android:tint="#FFFFFF"
|
|
||||||
android:viewportHeight="24.0" android:viewportWidth="24.0"
|
|
||||||
android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
|
|
||||||
<path android:fillColor="#FF000000" android:pathData="M20,4L4,4c-1.11,0 -1.99,0.89 -1.99,2L2,18c0,1.11 0.89,2 2,2h16c1.11,0 2,-0.89 2,-2L22,6c0,-1.11 -0.89,-2 -2,-2zM8.5,15L7.3,15l-2.55,-3.5L4.75,15L3.5,15L3.5,9h1.25l2.5,3.5L7.25,9L8.5,9v6zM13.5,10.26L11,10.26v1.12h2.5v1.26L11,12.64v1.11h2.5L13.5,15h-4L9.5,9h4v1.26zM20.5,14c0,0.55 -0.45,1 -1,1h-4c-0.55,0 -1,-0.45 -1,-1L14.5,9h1.25v4.51h1.13L16.88,9.99h1.25v3.51h1.12L19.25,9h1.25v5z"/>
|
|
||||||
</vector>
|
|
@ -4,7 +4,7 @@
|
|||||||
|
|
||||||
<item
|
<item
|
||||||
android:id="@+id/unread_action"
|
android:id="@+id/unread_action"
|
||||||
android:icon="@drawable/ic_fiber_new_white_24dp"
|
android:icon="@drawable/ic_baseline_white_eye_24dp"
|
||||||
android:title="@string/unmark"
|
android:title="@string/unmark"
|
||||||
app:showAsAction="ifRoom" />
|
app:showAsAction="ifRoom" />
|
||||||
|
|
||||||
@ -17,7 +17,6 @@
|
|||||||
<item
|
<item
|
||||||
android:id="@+id/open_action"
|
android:id="@+id/open_action"
|
||||||
android:icon="@drawable/ic_open_in_browser_white_24dp"
|
android:icon="@drawable/ic_open_in_browser_white_24dp"
|
||||||
android:iconTint="@color/white"
|
|
||||||
android:title="@string/reader_action_open"
|
android:title="@string/reader_action_open"
|
||||||
app:showAsAction="ifRoom" />
|
app:showAsAction="ifRoom" />
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user