Skip to content

Commit 7afae7b

Browse files
committed
Upgrade project.
1 parent 1be9ad2 commit 7afae7b

File tree

14 files changed

+161
-151
lines changed

14 files changed

+161
-151
lines changed

app/build.gradle

+13-13
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,11 @@ apply plugin: 'kotlin-android'
33
apply plugin: 'kotlin-android-extensions'
44

55
android {
6-
compileSdkVersion 29
6+
compileSdkVersion 30
77
defaultConfig {
88
applicationId "com.sharmadhiraj.androidpaginglibrarystepbystepimplementationguide"
99
minSdkVersion 16
10-
targetSdkVersion 29
10+
targetSdkVersion 30
1111
multiDexEnabled true
1212
versionCode 1
1313
versionName "1.0"
@@ -28,31 +28,31 @@ dependencies {
2828
implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
2929

3030
//Support
31-
implementation 'androidx.appcompat:appcompat:1.1.0'
32-
implementation 'com.google.android.material:material:1.1.0'
33-
implementation 'androidx.recyclerview:recyclerview:1.1.0'
31+
implementation 'androidx.appcompat:appcompat:1.3.0'
32+
implementation 'com.google.android.material:material:1.3.0'
33+
implementation 'androidx.recyclerview:recyclerview:1.2.0'
3434
implementation 'androidx.cardview:cardview:1.0.0'
3535

3636
//Architecture Components
3737
implementation 'androidx.lifecycle:lifecycle-extensions:2.2.0'
3838

3939
//Paging
40-
implementation 'androidx.paging:paging-runtime:2.1.2'
40+
implementation 'androidx.paging:paging-runtime-ktx:3.0.0'
4141

4242
//Networking
43-
implementation 'com.squareup.retrofit2:retrofit:2.6.1'
44-
implementation 'com.squareup.retrofit2:converter-gson:2.6.1'
45-
implementation 'com.squareup.retrofit2:adapter-rxjava2:2.4.0'
43+
implementation 'com.squareup.retrofit2:retrofit:2.9.0'
44+
implementation 'com.squareup.retrofit2:converter-gson:2.9.0'
45+
implementation 'com.squareup.retrofit2:adapter-rxjava2:2.9.0'
4646

4747
//Rx
48-
implementation 'io.reactivex.rxjava2:rxjava:2.2.6'
48+
implementation 'io.reactivex.rxjava2:rxjava:2.2.10'
4949
implementation 'io.reactivex.rxjava2:rxandroid:2.1.1'
5050

5151
//Image
5252
implementation 'com.squareup.picasso:picasso:2.71828'
5353

5454
//Testing
55-
testImplementation 'junit:junit:4.13'
56-
androidTestImplementation 'androidx.test:runner:1.2.0'
57-
androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0'
55+
testImplementation 'junit:junit:4.13.2'
56+
androidTestImplementation 'androidx.test:runner:1.3.0'
57+
androidTestImplementation 'androidx.test.espresso:espresso-core:3.3.0'
5858
}

app/src/main/java/com/sharmadhiraj/androidpaginglibrarystepbystepimplementationguide/activity/NewsListActivity.kt

+5-4
Original file line numberDiff line numberDiff line change
@@ -32,15 +32,16 @@ class NewsListActivity : AppCompatActivity() {
3232
newsListAdapter = NewsListAdapter { viewModel.retry() }
3333
recycler_view.adapter = newsListAdapter
3434
viewModel.newsList.observe(this,
35-
Observer {
36-
newsListAdapter.submitList(it)
37-
})
35+
Observer {
36+
newsListAdapter.submitList(it)
37+
})
3838
}
3939

4040
private fun initState() {
4141
txt_error.setOnClickListener { viewModel.retry() }
4242
viewModel.getState().observe(this, Observer { state ->
43-
progress_bar.visibility = if (viewModel.listIsEmpty() && state == LOADING) VISIBLE else GONE
43+
progress_bar.visibility =
44+
if (viewModel.listIsEmpty() && state == LOADING) VISIBLE else GONE
4445
txt_error.visibility = if (viewModel.listIsEmpty() && state == ERROR) VISIBLE else GONE
4546
if (!viewModel.listIsEmpty()) {
4647
newsListAdapter.setState(state ?: State.DONE)

app/src/main/java/com/sharmadhiraj/androidpaginglibrarystepbystepimplementationguide/adapter/ListFooterViewHolder.kt

+1-1
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ class ListFooterViewHolder(view: View) : RecyclerView.ViewHolder(view) {
2222
companion object {
2323
fun create(retry: () -> Unit, parent: ViewGroup): ListFooterViewHolder {
2424
val view = LayoutInflater.from(parent.context)
25-
.inflate(R.layout.item_list_footer, parent, false)
25+
.inflate(R.layout.item_list_footer, parent, false)
2626
view.txt_error.setOnClickListener { retry() }
2727
return ListFooterViewHolder(view)
2828
}

app/src/main/java/com/sharmadhiraj/androidpaginglibrarystepbystepimplementationguide/adapter/NewsListAdapter.kt

+4-1
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,10 @@ class NewsListAdapter(private val retry: () -> Unit)
1616
private var state = State.LOADING
1717

1818
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder {
19-
return if (viewType == DATA_VIEW_TYPE) NewsViewHolder.create(parent) else ListFooterViewHolder.create(retry, parent)
19+
return if (viewType == DATA_VIEW_TYPE) NewsViewHolder.create(parent) else ListFooterViewHolder.create(
20+
retry,
21+
parent
22+
)
2023
}
2124

2225
override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) {

app/src/main/java/com/sharmadhiraj/androidpaginglibrarystepbystepimplementationguide/adapter/NewsViewHolder.kt

+1-1
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ class NewsViewHolder(view: View) : RecyclerView.ViewHolder(view) {
2222
companion object {
2323
fun create(parent: ViewGroup): NewsViewHolder {
2424
val view = LayoutInflater.from(parent.context)
25-
.inflate(R.layout.item_news, parent, false)
25+
.inflate(R.layout.item_news, parent, false)
2626
return NewsViewHolder(view)
2727
}
2828
}

app/src/main/java/com/sharmadhiraj/androidpaginglibrarystepbystepimplementationguide/data/NetworkService.kt

+6-6
Original file line numberDiff line numberDiff line change
@@ -11,17 +11,17 @@ interface NetworkService {
1111

1212
@GET("everything?q=sports&apiKey=aa67d8d98c8e4ad1b4f16dbd5f3be348")
1313
fun getNews(
14-
@Query("page") page: Int,
15-
@Query("pageSize") pageSize: Int
14+
@Query("page") page: Int,
15+
@Query("pageSize") pageSize: Int
1616
): Single<Response>
1717

1818
companion object {
1919
fun getService(): NetworkService {
2020
val retrofit = Retrofit.Builder()
21-
.baseUrl("https://newsapi.org/v2/")
22-
.addCallAdapterFactory(RxJava2CallAdapterFactory.create())
23-
.addConverterFactory(GsonConverterFactory.create())
24-
.build()
21+
.baseUrl("https://newsapi.org/v2/")
22+
.addCallAdapterFactory(RxJava2CallAdapterFactory.create())
23+
.addConverterFactory(GsonConverterFactory.create())
24+
.build()
2525
return retrofit.create(NetworkService::class.java)
2626
}
2727
}

app/src/main/java/com/sharmadhiraj/androidpaginglibrarystepbystepimplementationguide/data/NewsDataSource.kt

+38-31
Original file line numberDiff line numberDiff line change
@@ -11,50 +11,55 @@ import io.reactivex.functions.Action
1111
import io.reactivex.schedulers.Schedulers
1212

1313
class NewsDataSource(
14-
private val networkService: NetworkService,
15-
private val compositeDisposable: CompositeDisposable)
16-
: PageKeyedDataSource<Int, News>() {
14+
private val networkService: NetworkService,
15+
private val compositeDisposable: CompositeDisposable
16+
) : PageKeyedDataSource<Int, News>() {
1717

1818
var state: MutableLiveData<State> = MutableLiveData()
1919
private var retryCompletable: Completable? = null
2020

2121

22-
override fun loadInitial(params: LoadInitialParams<Int>, callback: LoadInitialCallback<Int, News>) {
22+
override fun loadInitial(
23+
params: LoadInitialParams<Int>,
24+
callback: LoadInitialCallback<Int, News>
25+
) {
2326
updateState(State.LOADING)
2427
compositeDisposable.add(
25-
networkService.getNews(1, params.requestedLoadSize)
26-
.subscribe(
27-
{ response ->
28-
updateState(DONE)
29-
callback.onResult(response.news,
30-
null,
31-
2
32-
)
33-
},
34-
{
35-
updateState(ERROR)
36-
setRetry(Action { loadInitial(params, callback) })
37-
}
28+
networkService.getNews(1, params.requestedLoadSize)
29+
.subscribe(
30+
{ response ->
31+
updateState(DONE)
32+
callback.onResult(
33+
response.news,
34+
null,
35+
2
3836
)
37+
},
38+
{
39+
updateState(ERROR)
40+
setRetry(Action { loadInitial(params, callback) })
41+
}
42+
)
3943
)
4044
}
4145

4246
override fun loadAfter(params: LoadParams<Int>, callback: LoadCallback<Int, News>) {
4347
updateState(State.LOADING)
4448
compositeDisposable.add(
45-
networkService.getNews(params.key, params.requestedLoadSize)
46-
.subscribe(
47-
{ response ->
48-
updateState(DONE)
49-
callback.onResult(response.news,
50-
params.key + 1
51-
)
52-
},
53-
{
54-
updateState(ERROR)
55-
setRetry(Action { loadAfter(params, callback) })
56-
}
49+
networkService.getNews(params.key, params.requestedLoadSize)
50+
.subscribe(
51+
{ response ->
52+
updateState(DONE)
53+
callback.onResult(
54+
response.news,
55+
params.key + 1
5756
)
57+
},
58+
{
59+
updateState(ERROR)
60+
setRetry(Action { loadAfter(params, callback) })
61+
}
62+
)
5863
)
5964
}
6065

@@ -67,10 +72,12 @@ class NewsDataSource(
6772

6873
fun retry() {
6974
if (retryCompletable != null) {
70-
compositeDisposable.add(retryCompletable!!
75+
compositeDisposable.add(
76+
retryCompletable!!
7177
.subscribeOn(Schedulers.io())
7278
.observeOn(AndroidSchedulers.mainThread())
73-
.subscribe())
79+
.subscribe()
80+
)
7481
}
7582
}
7683

app/src/main/java/com/sharmadhiraj/androidpaginglibrarystepbystepimplementationguide/data/NewsDataSourceFactory.kt

+3-3
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,9 @@ import androidx.paging.DataSource
55
import io.reactivex.disposables.CompositeDisposable
66

77
class NewsDataSourceFactory(
8-
private val compositeDisposable: CompositeDisposable,
9-
private val networkService: NetworkService)
10-
: DataSource.Factory<Int, News>() {
8+
private val compositeDisposable: CompositeDisposable,
9+
private val networkService: NetworkService
10+
) : DataSource.Factory<Int, News>() {
1111

1212
val newsDataSourceLiveData = MutableLiveData<NewsDataSource>()
1313

app/src/main/java/com/sharmadhiraj/androidpaginglibrarystepbystepimplementationguide/data/Response.kt

+5-5
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,12 @@ package com.sharmadhiraj.androidpaginglibrarystepbystepimplementationguide.data
33
import com.google.gson.annotations.SerializedName
44

55
data class Response(
6-
@SerializedName("articles")
7-
val news: List<News>
6+
@SerializedName("articles")
7+
val news: List<News>
88
)
99

1010
data class News(
11-
val title: String,
12-
@SerializedName("urlToImage")
13-
val image: String?
11+
val title: String,
12+
@SerializedName("urlToImage")
13+
val image: String?
1414
)

app/src/main/java/com/sharmadhiraj/androidpaginglibrarystepbystepimplementationguide/viewModel/NewsListViewModel.kt

+8-8
Original file line numberDiff line numberDiff line change
@@ -14,22 +14,22 @@ class NewsListViewModel : ViewModel() {
1414
var newsList: LiveData<PagedList<News>>
1515
private val compositeDisposable = CompositeDisposable()
1616
private val pageSize = 5
17-
private val newsDataSourceFactory: NewsDataSourceFactory
17+
private val newsDataSourceFactory: NewsDataSourceFactory =
18+
NewsDataSourceFactory(compositeDisposable, networkService)
1819

1920
init {
20-
newsDataSourceFactory = NewsDataSourceFactory(compositeDisposable, networkService)
2121
val config = PagedList.Config.Builder()
22-
.setPageSize(pageSize)
23-
.setInitialLoadSizeHint(pageSize * 2)
24-
.setEnablePlaceholders(false)
25-
.build()
22+
.setPageSize(pageSize)
23+
.setInitialLoadSizeHint(pageSize * 2)
24+
.setEnablePlaceholders(false)
25+
.build()
2626
newsList = LivePagedListBuilder(newsDataSourceFactory, config).build()
2727
}
2828

2929

3030
fun getState(): LiveData<State> = Transformations.switchMap(
31-
newsDataSourceFactory.newsDataSourceLiveData,
32-
NewsDataSource::state
31+
newsDataSourceFactory.newsDataSourceLiveData,
32+
NewsDataSource::state
3333
)
3434

3535
fun retry() {

app/src/main/res/drawable-v24/ic_launcher_foreground.xml

+6-6
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,13 @@
22
xmlns:aapt="http://schemas.android.com/aapt"
33
android:width="108dp"
44
android:height="108dp"
5-
android:viewportHeight="108"
6-
android:viewportWidth="108">
5+
android:viewportWidth="108"
6+
android:viewportHeight="108">
77
<path
88
android:fillType="evenOdd"
99
android:pathData="M32,64C32,64 38.39,52.99 44.13,50.95C51.37,48.37 70.14,49.57 70.14,49.57L108.26,87.69L108,109.01L75.97,107.97L32,64Z"
10-
android:strokeColor="#00000000"
11-
android:strokeWidth="1">
10+
android:strokeWidth="1"
11+
android:strokeColor="#00000000">
1212
<aapt:attr name="android:fillColor">
1313
<gradient
1414
android:endX="78.5885"
@@ -29,6 +29,6 @@
2929
android:fillColor="#FFFFFF"
3030
android:fillType="nonZero"
3131
android:pathData="M66.94,46.02L66.94,46.02C72.44,50.07 76,56.61 76,64L32,64C32,56.61 35.56,50.11 40.98,46.06L36.18,41.19C35.45,40.45 35.45,39.3 36.18,38.56C36.91,37.81 38.05,37.81 38.78,38.56L44.25,44.05C47.18,42.57 50.48,41.71 54,41.71C57.48,41.71 60.78,42.57 63.68,44.05L69.11,38.56C69.84,37.81 70.98,37.81 71.71,38.56C72.44,39.3 72.44,40.45 71.71,41.19L66.94,46.02ZM62.94,56.92C64.08,56.92 65,56.01 65,54.88C65,53.76 64.08,52.85 62.94,52.85C61.8,52.85 60.88,53.76 60.88,54.88C60.88,56.01 61.8,56.92 62.94,56.92ZM45.06,56.92C46.2,56.92 47.13,56.01 47.13,54.88C47.13,53.76 46.2,52.85 45.06,52.85C43.92,52.85 43,53.76 43,54.88C43,56.01 43.92,56.92 45.06,56.92Z"
32-
android:strokeColor="#00000000"
33-
android:strokeWidth="1" />
32+
android:strokeWidth="1"
33+
android:strokeColor="#00000000" />
3434
</vector>

0 commit comments

Comments
 (0)