Skip to content

Commit 67ff86c

Browse files
Network properties, responses are clearly handled, made excessive use of companion objects and classes to keep everything clean.
1 parent 4a684f8 commit 67ff86c

File tree

4 files changed

+315
-113
lines changed

4 files changed

+315
-113
lines changed
Lines changed: 176 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,176 @@
1+
package com.developerbreach.developerbreach.repository.network
2+
3+
import com.developerbreach.developerbreach.model.*
4+
import com.developerbreach.developerbreach.utils.*
5+
import com.developerbreach.developerbreach.utils.JsonProperty.Values
6+
import org.json.JSONArray
7+
import org.json.JSONObject
8+
import kotlin.collections.ArrayList
9+
10+
11+
class JsonData {
12+
13+
private val assertEmptyAssertion: String = ""
14+
15+
private fun ifHasString(
16+
jsonObject: JSONObject,
17+
value: String
18+
): String {
19+
var resultString = assertEmptyAssertion
20+
if (jsonObject.has(value)) {
21+
resultString = jsonObject.getString(value)
22+
}
23+
return resultString
24+
}
25+
26+
private fun ifHasInt(
27+
jsonObject: JSONObject,
28+
value: String
29+
): Int {
30+
var resultString = 0
31+
if (jsonObject.has(value)) {
32+
resultString = jsonObject.getInt(value)
33+
}
34+
return resultString
35+
}
36+
37+
private fun getAuthorAvatarUrl(
38+
jsonObject: JSONObject
39+
): String {
40+
val avatarsJsonObject = jsonObject.getJSONObject(JsonProperty.Objects.AVATAR_URLS)
41+
return ifHasString(avatarsJsonObject, Values.AUTHOR_AVATAR_HIGH_RES)
42+
}
43+
44+
companion object {
45+
46+
fun fetchAuthorDataById(
47+
response: String
48+
): Pair<String, String> {
49+
50+
val baseJsonObject = JSONObject(response)
51+
val authorName: String = ifHasString(baseJsonObject, Values.NAME)
52+
val authorAvatarUrl: String = JsonData().getAuthorAvatarUrl(baseJsonObject)
53+
54+
return Pair(authorName, authorAvatarUrl)
55+
}
56+
57+
fun fetchAuthorsJsonData(
58+
response: String
59+
): List<Authors> {
60+
61+
val authorsList: MutableList<Authors> = ArrayList()
62+
val baseJsonArray = JSONArray(response)
63+
64+
for (i: Int in 0 until baseJsonArray.length()) {
65+
66+
val baseJsonObject: JSONObject = baseJsonArray.getJSONObject(i)
67+
val authorId = ifHasInt(baseJsonObject, Values.ID)
68+
val authorName: String = ifHasString(baseJsonObject, Values.NAME)
69+
val authorAvatarUrl: String = JsonData().getAuthorAvatarUrl(baseJsonObject)
70+
71+
authorsList.add(
72+
Authors(authorId, authorName, authorAvatarUrl)
73+
)
74+
}
75+
return authorsList
76+
}
77+
78+
fun fetchCategoriesJsonData(
79+
response: String
80+
): List<Categories> {
81+
82+
val categoriesList: MutableList<Categories> = ArrayList()
83+
val baseJsonArray = JSONArray(response)
84+
85+
for (i: Int in 0 until baseJsonArray.length()) {
86+
87+
val baseJsonObject: JSONObject = baseJsonArray.getJSONObject(i)
88+
val categoryId: Int = ifHasInt(baseJsonObject, Values.ID)
89+
val categoryName: String = ifHasString(baseJsonObject, Values.NAME)
90+
91+
categoriesList.add(
92+
Categories(categoryId, categoryName)
93+
)
94+
}
95+
return categoriesList
96+
}
97+
98+
fun fetchArticleJsonData(
99+
response: String
100+
): List<Article> {
101+
102+
val articlesNetworkList: MutableList<Article> = ArrayList()
103+
val baseJsonArray = JSONArray(response)
104+
105+
for (i: Int in 0 until baseJsonArray.length()) {
106+
107+
val baseJsonObject: JSONObject = baseJsonArray.getJSONObject(i)
108+
val jsonObjectTitle = baseJsonObject.getJSONObject(JsonProperty.Objects.TITLE)
109+
val articleId = ifHasInt(baseJsonObject, Values.ID)
110+
val banner: String = ifHasString(baseJsonObject, Values.BANNER)
111+
val title: String = ifHasString(jsonObjectTitle, Values.TITLE)
112+
113+
articlesNetworkList.add(
114+
Article(articleId, title, banner)
115+
)
116+
}
117+
return articlesNetworkList
118+
}
119+
120+
121+
fun fetchArticleJsonDataById(
122+
response: String
123+
): ArticleDetail {
124+
125+
val baseJsonArray = JSONArray(response)
126+
val baseJsonObject: JSONObject = baseJsonArray.getJSONObject(0)
127+
128+
val jsonObjectTitle = baseJsonObject.getJSONObject(JsonProperty.Objects.TITLE)
129+
val jsonObjectExcerpt = baseJsonObject.getJSONObject(JsonProperty.Objects.EXCERPT)
130+
131+
val articleId = ifHasInt(baseJsonObject, Values.ID)
132+
val authorId = ifHasInt(baseJsonObject, Values.AUTHOR_ID)
133+
val banner: String = ifHasString(baseJsonObject, Values.BANNER)
134+
val title: String = ifHasString(jsonObjectTitle, Values.TITLE)
135+
val postedDate: String = ifHasString(baseJsonObject, Values.POSTED_DATE)
136+
val urlLink: String = ifHasString(baseJsonObject, Values.URL_LINK)
137+
val excerpt: String = ifHasString(jsonObjectExcerpt, Values.EXCERPT)
138+
139+
return ArticleDetail(
140+
articleId, authorId, title, banner, postedDate, urlLink, excerpt
141+
)
142+
}
143+
144+
fun fetchSearchableArticlesJsonData(
145+
response: String
146+
): List<Search> {
147+
148+
val articlesNetworkList: MutableList<Search> = ArrayList()
149+
val baseJsonArray = JSONArray(response)
150+
151+
for (i: Int in 0 until baseJsonArray.length()) {
152+
153+
val baseJsonObject: JSONObject = baseJsonArray.getJSONObject(i)
154+
val articleId = ifHasInt(baseJsonObject, Values.ID)
155+
156+
val jsonObjectTitle = baseJsonObject.getJSONObject(JsonProperty.Objects.TITLE)
157+
val title = ifHasString(jsonObjectTitle, Values.TITLE)
158+
159+
articlesNetworkList.add(
160+
Search(articleId, title)
161+
)
162+
}
163+
return articlesNetworkList
164+
}
165+
166+
private fun ifHasString(
167+
jsonObject: JSONObject,
168+
value: String
169+
) = JsonData().ifHasString(jsonObject, value)
170+
171+
private fun ifHasInt(
172+
jsonObject: JSONObject,
173+
value: String
174+
) = JsonData().ifHasInt(jsonObject, value)
175+
}
176+
}

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

Lines changed: 32 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -6,36 +6,40 @@ import java.net.HttpURLConnection
66
import java.net.URL
77
import java.util.*
88

9+
class NetworkQueryUtils {
910

10-
/**
11-
* This method returns the entire result from the HTTP response.
12-
*
13-
* @param url The URL to fetch the HTTP response from.
14-
* @return The contents of the HTTP response, null if no response
15-
* @throws IOException Related to network and stream reading
16-
*/
17-
@Throws(IOException::class)
18-
fun getResponseFromHttpUrl(url: URL): String {
19-
val urlConnection: HttpURLConnection = url.openConnection() as HttpURLConnection
20-
return try {
21-
val stream: InputStream = urlConnection.inputStream
22-
val scanner = Scanner(stream)
23-
scanner.useDelimiter("\\A")
24-
val hasInput: Boolean = scanner.hasNext()
25-
var response = ""
26-
if (hasInput) {
27-
response = scanner.next()
11+
/**
12+
* This method returns the entire result from the HTTP response.
13+
*
14+
* @param url The URL to fetch the HTTP response from.
15+
* @return The contents of the HTTP response, null if no response
16+
* @throws IOException Related to network and stream reading
17+
*/
18+
@Throws(IOException::class)
19+
fun getResponseFromHttpUrl(
20+
url: URL
21+
): String {
22+
val urlConnection: HttpURLConnection = url.openConnection() as HttpURLConnection
23+
return try {
24+
val stream: InputStream = urlConnection.inputStream
25+
val scanner = Scanner(stream)
26+
scanner.useDelimiter("\\A")
27+
val hasInput: Boolean = scanner.hasNext()
28+
var response = ""
29+
if (hasInput) {
30+
response = scanner.next()
31+
}
32+
scanner.close()
33+
response
34+
} finally {
35+
urlConnection.disconnect()
2836
}
29-
scanner.close()
30-
response
31-
} finally {
32-
urlConnection.disconnect()
3337
}
34-
}
3538

36-
/**
37-
* Returns new URL object from the given string URL.
38-
*/
39-
fun createUrl(stringUrl: String): URL {
40-
return URL(stringUrl)
39+
/**
40+
* Returns new URL object from the given string URL.
41+
*/
42+
fun createUrl(stringUrl: String): URL {
43+
return URL(stringUrl)
44+
}
4145
}

0 commit comments

Comments
 (0)