Remiving items from the cache on swipe.
This commit is contained in:
		| @@ -1034,6 +1034,7 @@ class HomeActivity : AppCompatActivity(), SearchView.OnQueryTextListener { | |||||||
|                             this, |                             this, | ||||||
|                             items, |                             items, | ||||||
|                             api, |                             api, | ||||||
|  |                             db, | ||||||
|                             customTabActivityHelper, |                             customTabActivityHelper, | ||||||
|                             internalBrowser, |                             internalBrowser, | ||||||
|                             articleViewer, |                             articleViewer, | ||||||
| @@ -1050,6 +1051,7 @@ class HomeActivity : AppCompatActivity(), SearchView.OnQueryTextListener { | |||||||
|                             this, |                             this, | ||||||
|                             items, |                             items, | ||||||
|                             api, |                             api, | ||||||
|  |                             db, | ||||||
|                             customTabActivityHelper, |                             customTabActivityHelper, | ||||||
|                             internalBrowser, |                             internalBrowser, | ||||||
|                             articleViewer, |                             articleViewer, | ||||||
|   | |||||||
| @@ -13,14 +13,18 @@ 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.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 | ||||||
| import apps.amine.bou.readerforselfoss.api.selfoss.SuccessResponse | import apps.amine.bou.readerforselfoss.api.selfoss.SuccessResponse | ||||||
| import apps.amine.bou.readerforselfoss.fragments.ArticleFragment | import apps.amine.bou.readerforselfoss.fragments.ArticleFragment | ||||||
|  | import apps.amine.bou.readerforselfoss.persistence.database.AppDatabase | ||||||
|  | import apps.amine.bou.readerforselfoss.persistence.migrations.MIGRATION_1_2 | ||||||
| import apps.amine.bou.readerforselfoss.themes.AppColors | import apps.amine.bou.readerforselfoss.themes.AppColors | ||||||
| import apps.amine.bou.readerforselfoss.themes.Toppings | import apps.amine.bou.readerforselfoss.themes.Toppings | ||||||
| import apps.amine.bou.readerforselfoss.transformers.DepthPageTransformer | import apps.amine.bou.readerforselfoss.transformers.DepthPageTransformer | ||||||
| import apps.amine.bou.readerforselfoss.utils.maybeHandleSilentException | import apps.amine.bou.readerforselfoss.utils.maybeHandleSilentException | ||||||
|  | import apps.amine.bou.readerforselfoss.utils.persistence.toEntity | ||||||
| import apps.amine.bou.readerforselfoss.utils.succeeded | import apps.amine.bou.readerforselfoss.utils.succeeded | ||||||
| import apps.amine.bou.readerforselfoss.utils.toggleStar | import apps.amine.bou.readerforselfoss.utils.toggleStar | ||||||
| import com.ftinc.scoop.Scoop | import com.ftinc.scoop.Scoop | ||||||
| @@ -30,6 +34,7 @@ import org.acra.ACRA | |||||||
| import retrofit2.Call | import retrofit2.Call | ||||||
| import retrofit2.Callback | import retrofit2.Callback | ||||||
| import retrofit2.Response | import retrofit2.Response | ||||||
|  | import kotlin.concurrent.thread | ||||||
|  |  | ||||||
| class ReaderActivity : AppCompatActivity() { | class ReaderActivity : AppCompatActivity() { | ||||||
|  |  | ||||||
| @@ -42,6 +47,8 @@ class ReaderActivity : AppCompatActivity() { | |||||||
|  |  | ||||||
|     private lateinit var toolbarMenu: Menu |     private lateinit var toolbarMenu: Menu | ||||||
|  |  | ||||||
|  |     private lateinit var db: AppDatabase | ||||||
|  |  | ||||||
|     private fun showMenuItem(willAddToFavorite: Boolean) { |     private fun showMenuItem(willAddToFavorite: Boolean) { | ||||||
|         toolbarMenu.findItem(R.id.save).isVisible = willAddToFavorite |         toolbarMenu.findItem(R.id.save).isVisible = willAddToFavorite | ||||||
|         toolbarMenu.findItem(R.id.unsave).isVisible = !willAddToFavorite |         toolbarMenu.findItem(R.id.unsave).isVisible = !willAddToFavorite | ||||||
| @@ -60,6 +67,11 @@ class ReaderActivity : AppCompatActivity() { | |||||||
|  |  | ||||||
|         setContentView(R.layout.activity_reader) |         setContentView(R.layout.activity_reader) | ||||||
|  |  | ||||||
|  |         db = Room.databaseBuilder( | ||||||
|  |             applicationContext, | ||||||
|  |             AppDatabase::class.java, "selfoss-database" | ||||||
|  |         ).addMigrations(MIGRATION_1_2).build() | ||||||
|  |  | ||||||
|         val scoop = Scoop.getInstance() |         val scoop = Scoop.getInstance() | ||||||
|         scoop.bind(this, Toppings.PRIMARY.value, toolBar) |         scoop.bind(this, Toppings.PRIMARY.value, toolBar) | ||||||
|         if  (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { |         if  (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { | ||||||
| @@ -89,7 +101,7 @@ class ReaderActivity : AppCompatActivity() { | |||||||
|  |  | ||||||
|         currentItem = intent.getIntExtra("currentItem", 0) |         currentItem = intent.getIntExtra("currentItem", 0) | ||||||
|  |  | ||||||
|         readItem(allItems[currentItem].id) |         readItem(allItems[currentItem]) | ||||||
|  |  | ||||||
|         pager.adapter = ScreenSlidePagerAdapter(supportFragmentManager, AppColors(this@ReaderActivity)) |         pager.adapter = ScreenSlidePagerAdapter(supportFragmentManager, AppColors(this@ReaderActivity)) | ||||||
|         pager.currentItem = currentItem |         pager.currentItem = currentItem | ||||||
| @@ -113,15 +125,18 @@ class ReaderActivity : AppCompatActivity() { | |||||||
|                     } else { |                     } else { | ||||||
|                         canFavorite() |                         canFavorite() | ||||||
|                     } |                     } | ||||||
|                     readItem(allItems[pager.currentItem].id) |                     readItem(allItems[pager.currentItem]) | ||||||
|                 } |                 } | ||||||
|             } |             } | ||||||
|         ) |         ) | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     fun readItem(id: String) { |     fun readItem(item: Item) { | ||||||
|         if (markOnScroll) { |         if (markOnScroll) { | ||||||
|             api.markItem(id).enqueue( |             thread { | ||||||
|  |                 db.itemsDao().delete(item.toEntity()) | ||||||
|  |             } | ||||||
|  |             api.markItem(item.id).enqueue( | ||||||
|                 object : Callback<SuccessResponse> { |                 object : Callback<SuccessResponse> { | ||||||
|                     override fun onResponse( |                     override fun onResponse( | ||||||
|                         call: Call<SuccessResponse>, |                         call: Call<SuccessResponse>, | ||||||
| @@ -145,6 +160,9 @@ class ReaderActivity : AppCompatActivity() { | |||||||
|                         call: Call<SuccessResponse>, |                         call: Call<SuccessResponse>, | ||||||
|                         t: Throwable |                         t: Throwable | ||||||
|                     ) { |                     ) { | ||||||
|  |                         thread { | ||||||
|  |                             db.itemsDao().insertAllItems(item.toEntity()) | ||||||
|  |                         } | ||||||
|                         if (debugReadingItems) { |                         if (debugReadingItems) { | ||||||
|                             ACRA.getErrorReporter().maybeHandleSilentException(t, this@ReaderActivity) |                             ACRA.getErrorReporter().maybeHandleSilentException(t, this@ReaderActivity) | ||||||
|                         } |                         } | ||||||
|   | |||||||
| @@ -14,6 +14,7 @@ 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.persistence.database.AppDatabase | ||||||
| import apps.amine.bou.readerforselfoss.themes.AppColors | import apps.amine.bou.readerforselfoss.themes.AppColors | ||||||
| import apps.amine.bou.readerforselfoss.utils.buildCustomTabsIntent | import apps.amine.bou.readerforselfoss.utils.buildCustomTabsIntent | ||||||
| import apps.amine.bou.readerforselfoss.utils.customtabs.CustomTabActivityHelper | import apps.amine.bou.readerforselfoss.utils.customtabs.CustomTabActivityHelper | ||||||
| @@ -38,6 +39,7 @@ class ItemCardAdapter( | |||||||
|     override val app: Activity, |     override val app: Activity, | ||||||
|     override var items: ArrayList<Item>, |     override var items: ArrayList<Item>, | ||||||
|     override val api: SelfossApi, |     override val api: SelfossApi, | ||||||
|  |     override val db: AppDatabase, | ||||||
|     private val helper: CustomTabActivityHelper, |     private val helper: CustomTabActivityHelper, | ||||||
|     private val internalBrowser: Boolean, |     private val internalBrowser: Boolean, | ||||||
|     private val articleViewer: Boolean, |     private val articleViewer: Boolean, | ||||||
|   | |||||||
| @@ -14,6 +14,7 @@ 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.persistence.database.AppDatabase | ||||||
| import apps.amine.bou.readerforselfoss.themes.AppColors | import apps.amine.bou.readerforselfoss.themes.AppColors | ||||||
| import apps.amine.bou.readerforselfoss.utils.buildCustomTabsIntent | import apps.amine.bou.readerforselfoss.utils.buildCustomTabsIntent | ||||||
| import apps.amine.bou.readerforselfoss.utils.customtabs.CustomTabActivityHelper | import apps.amine.bou.readerforselfoss.utils.customtabs.CustomTabActivityHelper | ||||||
| @@ -39,6 +40,7 @@ class ItemListAdapter( | |||||||
|     override val app: Activity, |     override val app: Activity, | ||||||
|     override var items: ArrayList<Item>, |     override var items: ArrayList<Item>, | ||||||
|     override val api: SelfossApi, |     override val api: SelfossApi, | ||||||
|  |     override val db: AppDatabase, | ||||||
|     private val helper: CustomTabActivityHelper, |     private val helper: CustomTabActivityHelper, | ||||||
|     private val internalBrowser: Boolean, |     private val internalBrowser: Boolean, | ||||||
|     private val articleViewer: Boolean, |     private val articleViewer: Boolean, | ||||||
|   | |||||||
| @@ -10,17 +10,21 @@ 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.persistence.database.AppDatabase | ||||||
| import apps.amine.bou.readerforselfoss.themes.AppColors | import apps.amine.bou.readerforselfoss.themes.AppColors | ||||||
| import apps.amine.bou.readerforselfoss.utils.maybeHandleSilentException | import apps.amine.bou.readerforselfoss.utils.maybeHandleSilentException | ||||||
|  | import apps.amine.bou.readerforselfoss.utils.persistence.toEntity | ||||||
| import apps.amine.bou.readerforselfoss.utils.succeeded | import apps.amine.bou.readerforselfoss.utils.succeeded | ||||||
| import org.acra.ACRA | import org.acra.ACRA | ||||||
| import retrofit2.Call | import retrofit2.Call | ||||||
| import retrofit2.Callback | import retrofit2.Callback | ||||||
| import retrofit2.Response | import retrofit2.Response | ||||||
|  | import kotlin.concurrent.thread | ||||||
|  |  | ||||||
| abstract class ItemsAdapter<VH : RecyclerView.ViewHolder?> : RecyclerView.Adapter<VH>() { | abstract class ItemsAdapter<VH : RecyclerView.ViewHolder?> : RecyclerView.Adapter<VH>() { | ||||||
|     abstract var items: ArrayList<Item> |     abstract var items: ArrayList<Item> | ||||||
|     abstract val api: SelfossApi |     abstract val api: SelfossApi | ||||||
|  |     abstract val db: AppDatabase | ||||||
|     abstract val debugReadingItems: Boolean |     abstract val debugReadingItems: Boolean | ||||||
|     abstract val userIdentifier: String |     abstract val userIdentifier: String | ||||||
|     abstract val app: Activity |     abstract val app: Activity | ||||||
| @@ -42,6 +46,9 @@ abstract class ItemsAdapter<VH : RecyclerView.ViewHolder?> : RecyclerView.Adapte | |||||||
|             ) |             ) | ||||||
|             .setAction(R.string.undo_string) { |             .setAction(R.string.undo_string) { | ||||||
|                 items.add(position, i) |                 items.add(position, i) | ||||||
|  |                 thread { | ||||||
|  |                     db.itemsDao().insertAllItems(i.toEntity()) | ||||||
|  |                 } | ||||||
|                 notifyItemInserted(position) |                 notifyItemInserted(position) | ||||||
|                 updateItems(items) |                 updateItems(items) | ||||||
|  |  | ||||||
| @@ -54,6 +61,9 @@ abstract class ItemsAdapter<VH : RecyclerView.ViewHolder?> : RecyclerView.Adapte | |||||||
|  |  | ||||||
|                     override fun onFailure(call: Call<SuccessResponse>, t: Throwable) { |                     override fun onFailure(call: Call<SuccessResponse>, t: Throwable) { | ||||||
|                         items.remove(i) |                         items.remove(i) | ||||||
|  |                         thread { | ||||||
|  |                             db.itemsDao().delete(i.toEntity()) | ||||||
|  |                         } | ||||||
|                         notifyItemRemoved(position) |                         notifyItemRemoved(position) | ||||||
|                         updateItems(items) |                         updateItems(items) | ||||||
|                         doUnmark(i, position) |                         doUnmark(i, position) | ||||||
| @@ -75,6 +85,12 @@ abstract class ItemsAdapter<VH : RecyclerView.ViewHolder?> : RecyclerView.Adapte | |||||||
|         notifyItemRemoved(position) |         notifyItemRemoved(position) | ||||||
|         updateItems(items) |         updateItems(items) | ||||||
|  |  | ||||||
|  |         // TODO: Handle network status. | ||||||
|  |         // IF offline, delete from cached articles, and add to some table that will replay the calls on network activation. | ||||||
|  |  | ||||||
|  |         thread { | ||||||
|  |             db.itemsDao().delete(i.toEntity()) | ||||||
|  |         } | ||||||
|  |  | ||||||
|         api.markItem(i.id).enqueue(object : Callback<SuccessResponse> { |         api.markItem(i.id).enqueue(object : Callback<SuccessResponse> { | ||||||
|             override fun onResponse( |             override fun onResponse( | ||||||
| @@ -93,6 +109,7 @@ abstract class ItemsAdapter<VH : RecyclerView.ViewHolder?> : RecyclerView.Adapte | |||||||
|                     ACRA.getErrorReporter().maybeHandleSilentException(Exception(message), app) |                     ACRA.getErrorReporter().maybeHandleSilentException(Exception(message), app) | ||||||
|                     Toast.makeText(app.baseContext, message, Toast.LENGTH_LONG).show() |                     Toast.makeText(app.baseContext, message, Toast.LENGTH_LONG).show() | ||||||
|                 } |                 } | ||||||
|  |  | ||||||
|                 doUnmark(i, position) |                 doUnmark(i, position) | ||||||
|             } |             } | ||||||
|  |  | ||||||
| @@ -110,6 +127,9 @@ abstract class ItemsAdapter<VH : RecyclerView.ViewHolder?> : RecyclerView.Adapte | |||||||
|                 notifyItemInserted(position) |                 notifyItemInserted(position) | ||||||
|                 updateItems(items) |                 updateItems(items) | ||||||
|  |  | ||||||
|  |                 thread { | ||||||
|  |                     db.itemsDao().insertAllItems(i.toEntity()) | ||||||
|  |                 } | ||||||
|             } |             } | ||||||
|         }) |         }) | ||||||
|     } |     } | ||||||
|   | |||||||
| @@ -1,6 +1,7 @@ | |||||||
| package apps.amine.bou.readerforselfoss.persistence.dao | package apps.amine.bou.readerforselfoss.persistence.dao | ||||||
|  |  | ||||||
| import androidx.room.Dao | import androidx.room.Dao | ||||||
|  | import androidx.room.Delete | ||||||
| import androidx.room.Insert | import androidx.room.Insert | ||||||
| import androidx.room.OnConflictStrategy | import androidx.room.OnConflictStrategy | ||||||
| import androidx.room.Query | import androidx.room.Query | ||||||
| @@ -15,11 +16,14 @@ interface ItemsDao { | |||||||
|     fun items(): List<ItemEntity> |     fun items(): List<ItemEntity> | ||||||
|  |  | ||||||
|     @Insert(onConflict = OnConflictStrategy.REPLACE) |     @Insert(onConflict = OnConflictStrategy.REPLACE) | ||||||
|     fun insertAllItems(vararg tags: ItemEntity) |     fun insertAllItems(vararg items: ItemEntity) | ||||||
|  |  | ||||||
|     @Query("DELETE FROM items") |     @Query("DELETE FROM items") | ||||||
|     fun deleteAllItems() |     fun deleteAllItems() | ||||||
|  |  | ||||||
|  |     @Delete | ||||||
|  |     fun delete(item: ItemEntity) | ||||||
|  |  | ||||||
|     @Update |     @Update | ||||||
|     fun updateItem(item: ItemEntity) |     fun updateItem(item: ItemEntity) | ||||||
| } | } | ||||||
		Reference in New Issue
	
	Block a user