Skip to content

Commit a39f645

Browse files
committed
handled breaking news
1 parent 5658354 commit a39f645

File tree

4 files changed

+101
-1
lines changed

4 files changed

+101
-1
lines changed

app/src/main/AndroidManifest.xml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@
22
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
33
package="com.sijanneupane.mvvmnews">
44

5+
<uses-permission android:name="android.permission.INTERNET"/>
6+
57
<application
68
android:allowBackup="true"
79
android:icon="@mipmap/ic_launcher"
Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,17 @@
11
package com.sijanneupane.mvvmnews.repository
22

3+
import com.sijanneupane.mvvmnews.api.RetrofitInstance
34
import com.sijanneupane.mvvmnews.db.ArticleDatabase
4-
5+
/*
6+
get data from database and from remote data source (retrofit api)
7+
*/
58
class NewsRepository(
69
val db: ArticleDatabase //parameter
710
) {
11+
12+
/*
13+
function that directly queries our api for the breaking news
14+
*/
15+
suspend fun getBreakingNews(countryCode:String, pageNumber:Int)=
16+
RetrofitInstance.api.getBreakingNews(countryCode, pageNumber)
817
}
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,50 @@
11
package com.sijanneupane.mvvmnews.ui
22

3+
import androidx.lifecycle.MutableLiveData
34
import androidx.lifecycle.ViewModel
5+
import androidx.lifecycle.viewModelScope
6+
import com.sijanneupane.mvvmnews.models.NewsResponse
47
import com.sijanneupane.mvvmnews.repository.NewsRepository
8+
import com.sijanneupane.mvvmnews.utils.Resource
9+
import kotlinx.coroutines.launch
10+
import retrofit2.Response
511

612
class NewsViewModel(
713
val newsRepository: NewsRepository //parameter
814
) : ViewModel(){
15+
16+
//LIVEDATA OBJECT
17+
val breakingNews: MutableLiveData<Resource<NewsResponse>> = MutableLiveData()
18+
//Pagination
19+
var breakingNewsPage= 1
20+
21+
init {
22+
getBreakingNews("in")
23+
}
24+
25+
//we cannot start the function in the coroutine so we start the it here
26+
/*
27+
viewModelScope makes the function alive only as long as the ViewModel is alive
28+
*/
29+
fun getBreakingNews(countryCode: String)= viewModelScope.launch {
30+
breakingNews.postValue(Resource.Loading()) //init loading state before the network call
31+
32+
//actual response
33+
val response= newsRepository.getBreakingNews(countryCode, breakingNewsPage)
34+
35+
//handling response
36+
breakingNews.postValue(handleBreakingNewsResponse(response))
37+
38+
39+
}
40+
41+
private fun handleBreakingNewsResponse(response: Response<NewsResponse>): Resource<NewsResponse>{
42+
if (response.isSuccessful){
43+
response.body()?.let { resultResponse ->
44+
return Resource.Success(resultResponse)
45+
}
46+
}
47+
return Resource.Error(response.message())
48+
}
49+
950
}
Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,69 @@
11
package com.sijanneupane.mvvmnews.ui.fragments
22

33
import android.os.Bundle
4+
import android.util.Log
45
import android.view.View
6+
import android.widget.LinearLayout
57
import androidx.fragment.app.Fragment
8+
import androidx.lifecycle.Observer
69
import androidx.lifecycle.viewModelScope
10+
import androidx.recyclerview.widget.LinearLayoutManager
711
import com.sijanneupane.mvvmnews.R
12+
import com.sijanneupane.mvvmnews.adapters.NewsAdapter
813
import com.sijanneupane.mvvmnews.ui.MainActivity
914
import com.sijanneupane.mvvmnews.ui.NewsViewModel
15+
import com.sijanneupane.mvvmnews.utils.Resource
16+
import kotlinx.android.synthetic.main.fragment_breaking_news.*
1017

1118
class BreakingNewsFragment : Fragment(R.layout.fragment_breaking_news) {
1219
lateinit var viewModel: NewsViewModel
20+
lateinit var newsAdapter: NewsAdapter
21+
22+
val TAG= "BreakingNewsFragment"
1323

1424
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
1525
super.onViewCreated(view, savedInstanceState)
1626

1727
//set viewModels to fragment activity
1828
//and we cast that as MainActivity so that we can have access to the view model created at MainActivity
1929
viewModel= (activity as MainActivity).viewModel
30+
31+
setupRecyclerView()
32+
33+
//subscribe to live data
34+
viewModel.breakingNews.observe(viewLifecycleOwner, Observer { response->
35+
when(response){
36+
is Resource.Success->{
37+
hideProgressBar()
38+
//check null
39+
response.data?.let { newsResponse ->
40+
newsAdapter.differ.submitList(newsResponse.articles)
41+
}
42+
}
43+
is Resource.Error->{
44+
hideProgressBar()
45+
response.message?.let { message->
46+
Log.e(TAG, "An error occured: $message" )
47+
}
48+
}
49+
is Resource.Loading->{
50+
showProgressBar()
51+
}
52+
}
53+
})
54+
}
55+
56+
private fun setupRecyclerView(){
57+
newsAdapter= NewsAdapter()
58+
rvBreakingNews.apply {
59+
adapter = newsAdapter
60+
layoutManager = LinearLayoutManager(activity)
61+
}
62+
}
63+
private fun hideProgressBar(){
64+
paginationProgressBar.visibility= View.INVISIBLE
65+
}
66+
private fun showProgressBar(){
67+
paginationProgressBar.visibility= View.VISIBLE
2068
}
2169
}

0 commit comments

Comments
 (0)