Skip to content

Commit 5658354

Browse files
committed
MVVM arc skeleton
1 parent 328a435 commit 5658354

File tree

9 files changed

+123
-0
lines changed

9 files changed

+123
-0
lines changed
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
package com.sijanneupane.mvvmnews.repository
2+
3+
import com.sijanneupane.mvvmnews.db.ArticleDatabase
4+
5+
class NewsRepository(
6+
val db: ArticleDatabase //parameter
7+
) {
8+
}

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

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,17 +2,26 @@ package com.sijanneupane.mvvmnews.ui
22

33
import androidx.appcompat.app.AppCompatActivity
44
import android.os.Bundle
5+
import androidx.lifecycle.ViewModelProvider
56
import androidx.navigation.fragment.findNavController
67
import androidx.navigation.ui.setupWithNavController
78
import com.sijanneupane.mvvmnews.R
9+
import com.sijanneupane.mvvmnews.db.ArticleDatabase
10+
import com.sijanneupane.mvvmnews.repository.NewsRepository
811
import kotlinx.android.synthetic.main.activity_main.*
912

1013
class MainActivity : AppCompatActivity() {
14+
lateinit var viewModel: NewsViewModel
1115

1216
override fun onCreate(savedInstanceState: Bundle?) {
1317
super.onCreate(savedInstanceState)
1418
setContentView(R.layout.activity_main)
1519

20+
//initializations and assign
21+
val repository= NewsRepository(ArticleDatabase(this))
22+
val viewModelProviderFactory= NewsViewModelProviderFactory(repository)
23+
viewModel= ViewModelProvider(this, viewModelProviderFactory).get(NewsViewModel::class.java)
24+
1625
bottomNavigationView.setupWithNavController(newsNavHostFrag.findNavController())
1726

1827

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
package com.sijanneupane.mvvmnews.ui
2+
3+
import androidx.lifecycle.ViewModel
4+
import com.sijanneupane.mvvmnews.repository.NewsRepository
5+
6+
class NewsViewModel(
7+
val newsRepository: NewsRepository //parameter
8+
) : ViewModel(){
9+
}
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
package com.sijanneupane.mvvmnews.ui
2+
3+
import androidx.lifecycle.ViewModel
4+
import androidx.lifecycle.ViewModelProvider
5+
import com.sijanneupane.mvvmnews.repository.NewsRepository
6+
/*
7+
To define how our view model should be created
8+
*/
9+
class NewsViewModelProviderFactory(
10+
val newsRepository: NewsRepository
11+
) : ViewModelProvider.Factory{
12+
13+
override fun <T : ViewModel?> create(modelClass: Class<T>): T {
14+
return NewsViewModel(newsRepository) as T
15+
}
16+
}
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,18 @@
11
package com.sijanneupane.mvvmnews.ui.fragments
22

3+
import android.os.Bundle
4+
import android.view.View
35
import androidx.fragment.app.Fragment
46
import com.sijanneupane.mvvmnews.R
7+
import com.sijanneupane.mvvmnews.ui.MainActivity
8+
import com.sijanneupane.mvvmnews.ui.NewsViewModel
59

610
class ArticleFragment : Fragment(R.layout.fragment_article){
11+
lateinit var viewModel: NewsViewModel
12+
13+
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
14+
super.onViewCreated(view, savedInstanceState)
15+
viewModel= (activity as MainActivity).viewModel
16+
17+
}
718
}
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,21 @@
11
package com.sijanneupane.mvvmnews.ui.fragments
22

3+
import android.os.Bundle
4+
import android.view.View
35
import androidx.fragment.app.Fragment
6+
import androidx.lifecycle.viewModelScope
47
import com.sijanneupane.mvvmnews.R
8+
import com.sijanneupane.mvvmnews.ui.MainActivity
9+
import com.sijanneupane.mvvmnews.ui.NewsViewModel
510

611
class BreakingNewsFragment : Fragment(R.layout.fragment_breaking_news) {
12+
lateinit var viewModel: NewsViewModel
13+
14+
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
15+
super.onViewCreated(view, savedInstanceState)
16+
17+
//set viewModels to fragment activity
18+
//and we cast that as MainActivity so that we can have access to the view model created at MainActivity
19+
viewModel= (activity as MainActivity).viewModel
20+
}
721
}
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,21 @@
11
package com.sijanneupane.mvvmnews.ui.fragments
22

3+
import android.os.Bundle
4+
import android.view.View
35
import androidx.fragment.app.Fragment
46
import com.sijanneupane.mvvmnews.R
7+
import com.sijanneupane.mvvmnews.ui.MainActivity
8+
import com.sijanneupane.mvvmnews.ui.NewsViewModel
59

610
class SavedNewsFragment : Fragment(R.layout.fragment_saved_news) {
11+
12+
lateinit var viewModel: NewsViewModel
13+
14+
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
15+
super.onViewCreated(view, savedInstanceState)
16+
17+
//set viewModels to fragment activity
18+
//and we cast that as MainActivity so that we can have access to the view model created at MainActivity
19+
viewModel= (activity as MainActivity).viewModel
20+
}
721
}
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,21 @@
11
package com.sijanneupane.mvvmnews.ui.fragments
22

3+
import android.os.Bundle
4+
import android.view.View
35
import androidx.fragment.app.Fragment
46
import com.sijanneupane.mvvmnews.R
7+
import com.sijanneupane.mvvmnews.ui.MainActivity
8+
import com.sijanneupane.mvvmnews.ui.NewsViewModel
59

610
class SearchNewsFragment : Fragment (R.layout.fragment_search_news) {
11+
12+
lateinit var viewModel: NewsViewModel
13+
14+
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
15+
super.onViewCreated(view, savedInstanceState)
16+
17+
//set viewModels to fragment activity
18+
//and we cast that as MainActivity so that we can have access to the view model created at MainActivity
19+
viewModel= (activity as MainActivity).viewModel
20+
}
721
}
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
package com.sijanneupane.mvvmnews.utils
2+
/*
3+
RESOURCE:
4+
recommended by google
5+
to wrap around network responses
6+
7+
this will be an generic class
8+
very useful to differentiate between success and error responses
9+
and also helps in handling the loading state
10+
*/
11+
/*
12+
SEALED CLASS:
13+
kind of an abstract class where we can define which class are allowed to inherit the from this Resource Class
14+
*/
15+
sealed class Resource<T>(
16+
//parameters
17+
val data: T?=null,
18+
val message: String?= null,
19+
20+
){
21+
22+
//classes allowed to inherit
23+
class Success<T>(data: T) : Resource<T>(data)
24+
class Error<T>(message: String, data: T?= null): Resource<T>(data, message)
25+
class Loading<T>: Resource<T>()
26+
27+
28+
}

0 commit comments

Comments
 (0)