Skip to content

Commit 8f4b2d2

Browse files
committed
news database integrated
1 parent 4d03c2f commit 8f4b2d2

File tree

4 files changed

+89
-1
lines changed

4 files changed

+89
-1
lines changed

app/src/main/java/com/sijanneupane/mvvmnews/repository/NewsRepository.kt

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@ package com.sijanneupane.mvvmnews.repository
22

33
import com.sijanneupane.mvvmnews.api.RetrofitInstance
44
import com.sijanneupane.mvvmnews.db.ArticleDatabase
5+
import com.sijanneupane.mvvmnews.models.Article
6+
57
/*
68
get data from database and from remote data source (retrofit api)
79
*/
@@ -20,4 +22,22 @@ class NewsRepository(
2022
*/
2123
suspend fun searchNews(searchQuery: String, pageNumber: Int)=
2224
RetrofitInstance.api.searchForNews(searchQuery, pageNumber)
25+
26+
/*
27+
function to insert article to db
28+
*/
29+
suspend fun upsert(article: Article)=
30+
db.getArticleDao().upsert(article)
31+
32+
/*
33+
function to get saved news from db
34+
*/
35+
fun getSavedNews()=
36+
db.getArticleDao().getAllArticles()
37+
38+
/*
39+
function to delete articles from db
40+
*/
41+
suspend fun deleteArticle(article: Article)=
42+
db.getArticleDao().deleteArticle(article)
2343
}

app/src/main/java/com/sijanneupane/mvvmnews/ui/NewsViewModel.kt

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package com.sijanneupane.mvvmnews.ui
33
import androidx.lifecycle.MutableLiveData
44
import androidx.lifecycle.ViewModel
55
import androidx.lifecycle.viewModelScope
6+
import com.sijanneupane.mvvmnews.models.Article
67
import com.sijanneupane.mvvmnews.models.NewsResponse
78
import com.sijanneupane.mvvmnews.repository.NewsRepository
89
import com.sijanneupane.mvvmnews.utils.Resource
@@ -69,4 +70,23 @@ class NewsViewModel(
6970
return Resource.Error(response.message())
7071
}
7172

73+
/*
74+
function to save articles to db: coroutine
75+
*/
76+
fun saveArticle(article: Article)= viewModelScope.launch {
77+
newsRepository.upsert(article)
78+
}
79+
80+
/*
81+
function to get all saved news articles
82+
*/
83+
fun getSavedArticle()= newsRepository.getSavedNews()
84+
85+
/*
86+
function to delete article from db
87+
*/
88+
fun deleteSavedArticle(article: Article)= viewModelScope.launch {
89+
newsRepository.deleteArticle(article)
90+
}
91+
7292
}

app/src/main/java/com/sijanneupane/mvvmnews/ui/fragments/ArticleFragment.kt

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import android.view.View
55
import android.webkit.WebViewClient
66
import androidx.fragment.app.Fragment
77
import androidx.navigation.fragment.navArgs
8+
import com.google.android.material.snackbar.Snackbar
89
import com.sijanneupane.mvvmnews.R
910
import com.sijanneupane.mvvmnews.ui.MainActivity
1011
import com.sijanneupane.mvvmnews.ui.NewsViewModel
@@ -13,7 +14,7 @@ import kotlinx.android.synthetic.main.fragment_article.*
1314
class ArticleFragment : Fragment(R.layout.fragment_article){
1415
lateinit var viewModel: NewsViewModel
1516
//get articles as global element
16-
val args: ArticleFragmentArgs by navArgs() //ArticleFragmentArgs is generated by navigation component when we add the args
17+
private val args: ArticleFragmentArgs by navArgs() //ArticleFragmentArgs is generated by navigation component when we add the args
1718

1819
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
1920
super.onViewCreated(view, savedInstanceState)
@@ -26,6 +27,12 @@ class ArticleFragment : Fragment(R.layout.fragment_article){
2627
loadUrl(article.url)
2728
}
2829

30+
//save article
31+
fab.setOnClickListener{
32+
viewModel.saveArticle(article)
33+
Snackbar.make(view, " Article Saved Successfully! ", Snackbar.LENGTH_SHORT).show()
34+
}
35+
2936

3037
}
3138
}

app/src/main/java/com/sijanneupane/mvvmnews/ui/fragments/SavedNewsFragment.kt

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,15 @@
11
package com.sijanneupane.mvvmnews.ui.fragments
22

3+
import android.content.ClipData
34
import android.os.Bundle
45
import android.view.View
56
import androidx.fragment.app.Fragment
7+
import androidx.lifecycle.Observer
68
import androidx.navigation.fragment.findNavController
9+
import androidx.recyclerview.widget.ItemTouchHelper
710
import androidx.recyclerview.widget.LinearLayoutManager
11+
import androidx.recyclerview.widget.RecyclerView
12+
import com.google.android.material.snackbar.Snackbar
813
import com.sijanneupane.mvvmnews.R
914
import com.sijanneupane.mvvmnews.adapters.NewsAdapter
1015
import com.sijanneupane.mvvmnews.ui.MainActivity
@@ -37,6 +42,42 @@ class SavedNewsFragment : Fragment(R.layout.fragment_saved_news) {
3742
bundle
3843
)
3944
}
45+
46+
//swipe delete variable
47+
val itemTouchHelperCallBack = object : ItemTouchHelper.SimpleCallback(
48+
ItemTouchHelper.UP or ItemTouchHelper.DOWN, //direction
49+
ItemTouchHelper.LEFT or ItemTouchHelper.RIGHT // swipe direction
50+
){
51+
override fun onMove(
52+
recyclerView: RecyclerView,
53+
viewHolder: RecyclerView.ViewHolder,
54+
target: RecyclerView.ViewHolder
55+
): Boolean {
56+
return true
57+
}
58+
59+
override fun onSwiped(viewHolder: RecyclerView.ViewHolder, direction: Int) {
60+
val position= viewHolder.adapterPosition
61+
val article= newsAdapter.differ.currentList[position]
62+
viewModel.deleteSavedArticle(article)
63+
//execute undo Snackbar
64+
Snackbar.make(view, " Article Deleted Successfully ", Snackbar.LENGTH_LONG).apply {
65+
setAction("Undo") {
66+
viewModel.saveArticle(article)
67+
}
68+
show()
69+
}
70+
}
71+
}
72+
//item touch helper
73+
ItemTouchHelper(itemTouchHelperCallBack).apply {
74+
attachToRecyclerView(rvSavedNews)
75+
}
76+
77+
//get saved news, observe on changes on out database
78+
viewModel.getSavedArticle().observe(viewLifecycleOwner, Observer { articles -> //new list of articles
79+
newsAdapter.differ.submitList(articles) //update recyclerview //differ will calculate the difference between lists
80+
})
4081
}
4182

4283
private fun setupRecyclerView(){

0 commit comments

Comments
 (0)