Skip to content

Commit 0f98e51

Browse files
Merge pull request #14 from DevelopersBreach/v1.1.0
Load more articles listener added, more code coverage.
2 parents 5a2cff0 + 6202c6a commit 0f98e51

34 files changed

+344
-277
lines changed

app/lint.xml

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<lint>
3+
<issue id="IconLocation">
4+
<ignore path="src/main/res/drawable/hourglass.webp" />
5+
</issue>
6+
</lint>
Lines changed: 55 additions & 83 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,21 @@
11
package com.developerbreach.developerbreach.controller
22

3+
import android.view.View
4+
import android.widget.ImageView
35
import android.widget.TextView
46
import androidx.navigation.NavController
7+
import androidx.navigation.NavDirections
8+
import androidx.navigation.fragment.FragmentNavigator
59
import androidx.navigation.fragment.FragmentNavigatorExtras
6-
import com.developerbreach.developerbreach.R
710
import com.developerbreach.developerbreach.view.detail.ArticleDetailFragmentDirections
8-
import com.developerbreach.developerbreach.view.favorites.FavoritesFragmentDirections
11+
import com.developerbreach.developerbreach.view.detail.ArticleDetailFragment
912
import com.developerbreach.developerbreach.view.home.HomeFragmentDirections
13+
import com.developerbreach.developerbreach.view.home.HomeFragment
14+
import com.developerbreach.developerbreach.view.list.ArticleListFragment
15+
import com.developerbreach.developerbreach.view.favorites.FavoritesFragment
1016
import com.developerbreach.developerbreach.view.intro.IntroFragmentDirections
11-
import com.developerbreach.developerbreach.view.list.ArticleListFragmentDirections
17+
import com.developerbreach.developerbreach.view.network.NetworkFragmentDirections
1218
import com.developerbreach.developerbreach.view.options.OptionsFragmentDirections
13-
import com.developerbreach.developerbreach.view.search.SearchFragmentDirections
1419
import com.developerbreach.developerbreach.view.settings.SettingsFragmentDirections
1520
import com.google.android.material.card.MaterialCardView
1621

@@ -19,106 +24,73 @@ class AppNavDirections(
1924
private val navController: NavController,
2025
) {
2126

22-
/** IntroFragment **/
23-
24-
fun introToHome() {
25-
navController.navigate(IntroFragmentDirections.introToHome())
27+
private fun navigate(directions: NavDirections) {
28+
navController.navigate(directions)
2629
}
2730

28-
/** HomeFragment **/
29-
30-
fun homeToSearch() {
31-
navController.navigate(HomeFragmentDirections.homeToSearch())
31+
private fun navigateWithExtras(
32+
directions: NavDirections,
33+
extras: FragmentNavigator.Extras
34+
) {
35+
navController.navigate(directions, extras)
3236
}
3337

34-
fun homeToDetail(articleId: Int, view: MaterialCardView) {
35-
navController.navigate(
36-
HomeFragmentDirections.homeToDetail(articleId),
37-
FragmentNavigatorExtras(view to articleId.toString())
38-
)
39-
}
38+
/** IntroFragment */
39+
fun introToHome() = navigate(IntroFragmentDirections.introToHome())
4040

41-
fun homeToOptions() {
42-
navController.navigate(HomeFragmentDirections.homeToOptions())
43-
}
44-
45-
fun homeToIntro() {
46-
navController.navigate(R.id.introFragment)
47-
}
41+
/** HomeFragment */
42+
fun homeToSearch() = navigate(HomeFragmentDirections.homeToSearch())
43+
fun homeToOptions() = navigate(OptionsFragmentDirections.toOptionsFragmentGlobal())
44+
fun homeToIntro() = navigate(IntroFragmentDirections.toIntroFragmentGlobal())
45+
fun homeToArticleList() = navigate(HomeFragmentDirections.homeToArticleList())
4846

49-
fun homeToArticleList() {
50-
navController.navigate(HomeFragmentDirections.homeToArticleList())
51-
}
47+
/** OptionsFragment */
48+
fun optionsToAuthors() = navigate(OptionsFragmentDirections.optionsToAuthors())
49+
fun optionsToFavorites() = navigate(OptionsFragmentDirections.optionsToFavorites())
50+
fun optionsToSearch() = navigate(OptionsFragmentDirections.optionsToSearch())
51+
fun optionsToSettings() = navigate(OptionsFragmentDirections.optionsToSettings())
52+
fun optionsToIntro() = navigate(IntroFragmentDirections.toIntroFragmentGlobal())
5253

53-
/** SearchFragment **/
54+
/** NetworkFragment */
55+
fun toNetworkFragment() = navigate(NetworkFragmentDirections.toNetworkFragmentGlobal())
5456

57+
/** SearchFragment */
5558
fun searchToDetail(articleId: Int, view: TextView) {
56-
navController.navigate(
57-
SearchFragmentDirections.searchToDetail(articleId),
59+
navigateWithExtras(
60+
ArticleDetailFragmentDirections.toDetailFragmentGlobal(articleId),
5861
FragmentNavigatorExtras(view to articleId.toString())
5962
)
6063
}
6164

62-
/** ArticleListFragment **/
63-
64-
fun articlesListToDetail(articleId: Int, view: MaterialCardView) {
65-
navController.navigate(
66-
ArticleListFragmentDirections.articleListToDetail(articleId),
67-
FragmentNavigatorExtras(view to articleId.toString())
68-
)
69-
}
70-
71-
/** FavoritesFragment **/
72-
73-
fun favoritesToDetail(articleId: Int, view: MaterialCardView) {
74-
navController.navigate(
75-
FavoritesFragmentDirections.favoritesToDetail(articleId),
65+
/**
66+
* [HomeFragment] [FavoritesFragment] [ArticleListFragment]
67+
* to
68+
* [ArticleDetailFragment]
69+
*/
70+
fun fragmentsToDetailFragment(
71+
articleId: Int,
72+
view: MaterialCardView
73+
) {
74+
navigateWithExtras(
75+
ArticleDetailFragmentDirections.toDetailFragmentGlobal(articleId),
7676
FragmentNavigatorExtras(view to articleId.toString())
7777
)
7878
}
7979

80-
/** DetailFragment **/
81-
80+
/** DetailFragment */
8281
fun detailToArticleWebView(articleUrlLink: String?) {
83-
navController.navigate(ArticleDetailFragmentDirections.detailToArticleWebView(articleUrlLink))
82+
navigate(ArticleDetailFragmentDirections.detailToArticleWebView(articleUrlLink))
8483
}
8584

86-
fun detailToBanner(bannerUrl: String?) {
87-
navController.navigate(ArticleDetailFragmentDirections.detailToBanner(bannerUrl))
85+
fun detailToBanner(bannerUrl: String?, view: ImageView) {
86+
navigateWithExtras(
87+
ArticleDetailFragmentDirections.detailToBanner(bannerUrl),
88+
FragmentNavigatorExtras(view as View to bannerUrl.toString())
89+
)
8890
}
8991

90-
/** SettingsFragment **/
91-
92+
/** SettingsFragment */
9293
fun settingsToCommonWebView(webUrl: String) {
93-
navController.navigate(SettingsFragmentDirections.settingsToCommonWebView(webUrl))
94-
}
95-
96-
/** OptionsFragment **/
97-
98-
fun optionsToAuthors() {
99-
navController.navigate(OptionsFragmentDirections.optionsToAuthors())
100-
}
101-
102-
fun optionsToFavorites() {
103-
navController.navigate(OptionsFragmentDirections.optionsToFavorites())
104-
}
105-
106-
fun optionsToSearch() {
107-
navController.navigate(OptionsFragmentDirections.optionsToSearch())
94+
navigate(SettingsFragmentDirections.settingsToCommonWebView(webUrl))
10895
}
109-
110-
fun optionsToSettings() {
111-
navController.navigate(OptionsFragmentDirections.optionsToSettings())
112-
}
113-
114-
fun optionsToIntro() {
115-
navController.navigate(OptionsFragmentDirections.optionsToIntro())
116-
}
117-
118-
/** NetworkFragment **/
119-
120-
fun toNetworkFragment() {
121-
navController.navigate(R.id.networkFragment)
122-
}
123-
}
124-
96+
}

app/src/main/java/com/developerbreach/developerbreach/fcm/AppFirebaseService.kt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package com.developerbreach.developerbreach.fcm
22

3+
import android.annotation.SuppressLint
34
import android.app.NotificationChannel
45
import android.app.NotificationManager
56
import android.app.PendingIntent
@@ -30,6 +31,7 @@ class AppFirebaseService : FirebaseMessagingService() {
3031
*
3132
* @param body FCM message body received.
3233
*/
34+
@SuppressLint("UnspecifiedImmutableFlag")
3335
private fun sendNotification(title: String, body: String) {
3436

3537
val intent = Intent(this, MainActivity::class.java)

app/src/main/java/com/developerbreach/developerbreach/model/DataObjectConverters.kt

Lines changed: 0 additions & 32 deletions
This file was deleted.

app/src/main/java/com/developerbreach/developerbreach/repository/AppRepository.kt

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -16,10 +16,12 @@ class AppRepository(
1616
private val database: ArticleDatabase
1717
) {
1818

19-
suspend fun getArticlesData(): List<Article> {
19+
suspend fun getArticlesData(
20+
totalPostsToDoRunQueryOn: Int
21+
): List<Article> {
2022
val listData: List<Article>
2123
withContext(Dispatchers.IO) {
22-
listData = getArticles()
24+
listData = getArticles(totalPostsToDoRunQueryOn)
2325
}
2426
return listData
2527
}
@@ -34,10 +36,12 @@ class AppRepository(
3436
return data
3537
}
3638

37-
suspend fun getSearchableArticlesData(): List<Search> {
39+
suspend fun getSearchableArticlesData(
40+
totalPostsToDoRunQueryOn: Int
41+
): List<Search> {
3842
val listData: List<Search>
3943
withContext(Dispatchers.IO) {
40-
listData = getSearchableArticles()
44+
listData = getSearchableArticles(totalPostsToDoRunQueryOn)
4145
}
4246
return listData
4347
}
@@ -50,12 +54,13 @@ class AppRepository(
5054
return listData
5155
}
5256

53-
suspend fun getArticlesByCategoryId(
54-
categoryId: Int
57+
suspend fun getArticlesByCategory(
58+
categoryId: Int,
59+
postsPage: Int
5560
): List<Article> {
5661
val listData: List<Article>
5762
withContext(Dispatchers.IO) {
58-
listData = getArticlesByCategory(categoryId)
63+
listData = getArticlesByCategoryId(categoryId, postsPage)
5964
}
6065
return listData
6166
}

app/src/main/java/com/developerbreach/developerbreach/repository/network/NetworkService.kt

Lines changed: 30 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -1,29 +1,35 @@
11
package com.developerbreach.developerbreach.repository.network
22

33
import com.developerbreach.developerbreach.model.*
4-
import java.io.IOException
54
import java.net.URL
65

76

8-
fun getArticles(): List<Article> {
9-
val response = NetworkResponse.articleResponse()
7+
fun getArticles(
8+
totalPostsToDoRunQueryOn: Int
9+
): List<Article> {
10+
val response = NetworkResponse.articleResponse(totalPostsToDoRunQueryOn)
1011
return JsonRemoteData.fetchArticleJsonData(response)
1112
}
1213

13-
fun getArticleDetails(articleId: Int): ArticleDetail {
14+
fun getArticleDetails(
15+
articleId: Int
16+
): ArticleDetail {
1417
val response = NetworkResponse.articleDetailResponse(articleId)
1518
return JsonRemoteData.fetchArticleJsonDataById(response)
1619
}
1720

18-
fun getSearchableArticles(): List<Search> {
19-
val response = NetworkResponse.searchResponse()
21+
fun getSearchableArticles(
22+
totalPostsToDoRunQueryOn: Int
23+
): List<Search> {
24+
val response = NetworkResponse.searchResponse(totalPostsToDoRunQueryOn)
2025
return JsonRemoteData.fetchSearchableArticlesJsonData(response)
2126
}
2227

23-
fun getArticlesByCategory(
24-
categoryId: Int
28+
fun getArticlesByCategoryId(
29+
categoryId: Int,
30+
postsPage: Int
2531
): List<Article> {
26-
val response = NetworkResponse.articleResponseByCategoryId(categoryId)
32+
val response = NetworkResponse.articleResponseByCategoryId(categoryId, postsPage)
2733
return JsonRemoteData.fetchArticleJsonData(response)
2834
}
2935

@@ -44,54 +50,53 @@ fun getAuthorById(
4450
return JsonRemoteData.fetchAuthorDataById(response)
4551
}
4652

47-
// TODO verify Exception essentials
48-
object NetworkResponse {
53+
internal object NetworkResponse {
4954

50-
@Throws(IOException::class)
51-
fun articleResponse(): String {
52-
val uriString: String = QueryBuilder.articleBuilder(8)
55+
fun articleResponse(
56+
totalPostsToDoRunQueryOn: Int
57+
): String {
58+
val uriString: String = QueryBuilder.articleBuilder(totalPostsToDoRunQueryOn)
5359
val requestUrl: URL = createUrl(uriString)
5460
return getResponseFromHttpUrl(requestUrl)
5561
}
5662

57-
@Throws(IOException::class)
58-
fun articleDetailResponse(articleId: Int): String {
63+
fun articleDetailResponse(
64+
articleId: Int
65+
): String {
5966
val uriString: String = QueryBuilder.articleByIdBuilder(articleId)
6067
val requestUrl: URL = createUrl(uriString)
6168
return getResponseFromHttpUrl(requestUrl)
6269
}
6370

64-
@Throws(IOException::class)
65-
fun searchResponse(): String {
66-
val uriString: String = QueryBuilder.articleBuilder(28)
71+
fun searchResponse(
72+
totalPostsToDoRunQueryOn: Int
73+
): String {
74+
val uriString: String = QueryBuilder.articleBuilder(totalPostsToDoRunQueryOn)
6775
val requestUrl: URL = createUrl(uriString)
6876
return getResponseFromHttpUrl(requestUrl)
6977
}
7078

71-
@Throws(IOException::class)
7279
fun articleResponseByCategoryId(
73-
categoryId: Int
80+
categoryId: Int,
81+
postsPage: Int
7482
): String {
75-
val uriString: String = QueryBuilder.articlesByCategoryBuilder(categoryId)
83+
val uriString: String = QueryBuilder.articlesByCategoryBuilder(categoryId, postsPage)
7684
val requestUrl: URL = createUrl(uriString)
7785
return getResponseFromHttpUrl(requestUrl)
7886
}
7987

80-
@Throws(IOException::class)
8188
fun categoryResponse(): String {
8289
val uriString: String = QueryBuilder.categoryBuilder()
8390
val requestUrl: URL = createUrl(uriString)
8491
return getResponseFromHttpUrl(requestUrl)
8592
}
8693

87-
@Throws(IOException::class)
8894
fun authorResponse(): String {
8995
val uriString: String = QueryBuilder.authorBuilder()
9096
val requestUrl: URL = createUrl(uriString)
9197
return getResponseFromHttpUrl(requestUrl)
9298
}
9399

94-
@Throws(IOException::class)
95100
fun authorResponseById(authorId: Int): String {
96101
val uriString: String = QueryBuilder.authorBuilderById(authorId)
97102
val requestUrl: URL = createUrl(uriString)

0 commit comments

Comments
 (0)