Skip to content

Commit cb5134e

Browse files
committed
refactory RSS
1 parent 5496d00 commit cb5134e

16 files changed

Lines changed: 141 additions & 176 deletions

File tree

app/src/main/java/org/secfirst/umbrella/whitelabel/data/database/content/ContentDao.kt

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import org.secfirst.umbrella.whitelabel.data.database.form.Item
1212
import org.secfirst.umbrella.whitelabel.data.database.form.associateFormForeignKey
1313
import org.secfirst.umbrella.whitelabel.data.database.lesson.*
1414
import org.secfirst.umbrella.whitelabel.data.database.reader.FeedSource
15+
import org.secfirst.umbrella.whitelabel.data.database.reader.RSS
1516
import org.secfirst.umbrella.whitelabel.data.database.segment.Markdown
1617
import org.secfirst.umbrella.whitelabel.data.disk.Root
1718
import org.secfirst.umbrella.whitelabel.data.disk.convertTo
@@ -73,4 +74,10 @@ interface ContentDao : BaseDao {
7374
modelAdapter<FeedSource>().saveAll(feedSources)
7475
}
7576
}
77+
78+
suspend fun insertDefaultRSS(rssList: List<RSS>) {
79+
withContext(ioContext) {
80+
modelAdapter<RSS>().saveAll(rssList)
81+
}
82+
}
7683
}

app/src/main/java/org/secfirst/umbrella/whitelabel/data/database/content/ContentRepo.kt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import org.secfirst.umbrella.whitelabel.data.database.form.Form
66
import org.secfirst.umbrella.whitelabel.data.database.lesson.Module
77
import org.secfirst.umbrella.whitelabel.data.database.lesson.Subject
88
import org.secfirst.umbrella.whitelabel.data.database.reader.FeedSource
9+
import org.secfirst.umbrella.whitelabel.data.database.reader.RSS
910
import org.secfirst.umbrella.whitelabel.data.database.segment.Markdown
1011
import org.secfirst.umbrella.whitelabel.data.disk.Root
1112

@@ -16,6 +17,8 @@ interface ContentRepo {
1617

1718
suspend fun insertFeedSource(feedSources: List<FeedSource>)
1819

20+
suspend fun insertDefaultRSS(rssList: List<RSS>)
21+
1922
suspend fun saveAllChecklists(checklists: List<Checklist>)
2023

2124
suspend fun saveAllMarkdowns(markdowns: List<Markdown>)

app/src/main/java/org/secfirst/umbrella/whitelabel/data/database/content/ContentRepository.kt

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,12 +6,16 @@ import org.secfirst.umbrella.whitelabel.data.database.form.Form
66
import org.secfirst.umbrella.whitelabel.data.database.lesson.Module
77
import org.secfirst.umbrella.whitelabel.data.database.lesson.Subject
88
import org.secfirst.umbrella.whitelabel.data.database.reader.FeedSource
9+
import org.secfirst.umbrella.whitelabel.data.database.reader.RSS
910
import org.secfirst.umbrella.whitelabel.data.database.segment.Markdown
1011
import org.secfirst.umbrella.whitelabel.data.disk.Root
1112
import javax.inject.Inject
1213

1314
class ContentRepository @Inject constructor(private val contentDao: ContentDao) : ContentRepo {
1415

16+
17+
override suspend fun insertDefaultRSS(rssList: List<RSS>) = contentDao.insertDefaultRSS(rssList)
18+
1519
override suspend fun getSubject(sha1ID: String) = contentDao.getSubject(sha1ID)
1620

1721
override suspend fun getDifficulty(sha1ID: String) = contentDao.getDifficulty(sha1ID)

app/src/main/java/org/secfirst/umbrella/whitelabel/data/database/reader/entity.kt

Lines changed: 32 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import android.os.Parcelable
44
import com.einmalfel.earl.Enclosure
55
import com.einmalfel.earl.Feed
66
import com.einmalfel.earl.Item
7+
import com.raizlabs.android.dbflow.annotation.Column
78
import com.raizlabs.android.dbflow.annotation.PrimaryKey
89
import com.raizlabs.android.dbflow.annotation.Table
910
import kotlinx.android.parcel.Parcelize
@@ -17,11 +18,17 @@ data class RefRSS(var items: MutableList<RefRSSItem> = mutableListOf())
1718
data class RefRSSItem(val link: String)
1819

1920
@Table(database = AppDatabase::class)
20-
data class RSS(@PrimaryKey
21-
var url_: String = "", var title_: String = "",
22-
var description_: String = "", var publicationDate_: Date = Date(),
23-
var imageLink_: String = "", var copyRight_: String = "",
24-
var author_: String = "", var items_: MutableList<Article> = mutableListOf()) : Feed, Serializable {
21+
data class RSS(@PrimaryKey(autoincrement = true)
22+
var id: Long = 0,
23+
@Column
24+
var url_: String = "",
25+
var title_: String = "",
26+
var description_: String = "",
27+
var publicationDate_: Date = Date(),
28+
var imageLink_: String = "",
29+
var copyRight_: String = "",
30+
var author_: String = "",
31+
var items_: MutableList<Article> = mutableListOf()) : Feed, Serializable {
2532

2633
override fun getLink(): String = url_
2734

@@ -39,7 +46,7 @@ data class RSS(@PrimaryKey
3946

4047
override fun getPublicationDate(): Date = publicationDate_
4148

42-
constructor(link: String = "") : this(link, "", "", Date(), "", "", "")
49+
constructor(link: String) : this(0, link, "", "", Date(), "", "", "")
4350

4451
}
4552

@@ -67,27 +74,26 @@ data class Article(var url_: String = "", var title_: String = "",
6774

6875
}
6976

70-
val Feed.convertToRSS: RSS
71-
get() {
72-
val rss = RSS()
73-
rss.url_ = this.link ?: ""
74-
rss.title_ = this.title
75-
rss.description_ = this.description ?: ""
76-
rss.publicationDate_ = this.publicationDate ?: Date()
77-
rss.imageLink_ = this.imageLink ?: ""
78-
rss.copyRight_ = this.copyright ?: ""
79-
rss.author_ = this.author ?: ""
80-
val articleList = mutableListOf<Article>()
81-
items.forEach {
82-
val article = Article(it.link
83-
?: "", it.title ?: "", it.description
84-
?: "", it.publicationDate!!, it.imageLink ?: "", "", it.author
85-
?: "", it.enclosures)
86-
articleList.add(article)
87-
}
88-
rss.items_ = articleList
89-
return rss
77+
78+
fun Feed.updateRSS(rss: RSS): RSS {
79+
rss.url_ = this.link ?: rss.url_
80+
rss.title_ = this.title
81+
rss.description_ = this.description ?: ""
82+
rss.publicationDate_ = this.publicationDate ?: Date()
83+
rss.imageLink_ = this.imageLink ?: ""
84+
rss.copyRight_ = this.copyright ?: ""
85+
rss.author_ = this.author ?: ""
86+
val articleList = mutableListOf<Article>()
87+
items.forEach {
88+
val article = Article(it.link
89+
?: "", it.title ?: "", it.description
90+
?: "", it.publicationDate!!, it.imageLink ?: "", "", it.author
91+
?: "", it.enclosures)
92+
articleList.add(article)
9093
}
94+
rss.items_ = articleList
95+
return rss
96+
}
9197

9298
const val RSS_FILE_NAME: String = "default_rss.json"
9399

app/src/main/java/org/secfirst/umbrella/whitelabel/feature/content/interactor/ContentBaseInteractor.kt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import org.secfirst.umbrella.whitelabel.data.database.form.Form
66
import org.secfirst.umbrella.whitelabel.data.database.lesson.Module
77
import org.secfirst.umbrella.whitelabel.data.database.lesson.Subject
88
import org.secfirst.umbrella.whitelabel.data.database.reader.FeedSource
9+
import org.secfirst.umbrella.whitelabel.data.database.reader.RSS
910
import org.secfirst.umbrella.whitelabel.data.database.segment.Markdown
1011
import org.secfirst.umbrella.whitelabel.data.disk.Root
1112
import org.secfirst.umbrella.whitelabel.feature.base.interactor.BaseInteractor
@@ -21,6 +22,8 @@ interface ContentBaseInteractor : BaseInteractor {
2122

2223
suspend fun persistFeedSource(feedSources: List<FeedSource>)
2324

25+
suspend fun persistRSS(rssList: List<RSS>)
26+
2427
suspend fun saveAllChecklists(checklists: List<Checklist>)
2528

2629
suspend fun saveAllMarkdowns(markdowns: List<Markdown>)

app/src/main/java/org/secfirst/umbrella/whitelabel/feature/content/interactor/ContentInteractorImp.kt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import org.secfirst.umbrella.whitelabel.data.database.form.Form
77
import org.secfirst.umbrella.whitelabel.data.database.lesson.Module
88
import org.secfirst.umbrella.whitelabel.data.database.lesson.Subject
99
import org.secfirst.umbrella.whitelabel.data.database.reader.FeedSource
10+
import org.secfirst.umbrella.whitelabel.data.database.reader.RSS
1011
import org.secfirst.umbrella.whitelabel.data.database.segment.Markdown
1112
import org.secfirst.umbrella.whitelabel.data.disk.Root
1213
import org.secfirst.umbrella.whitelabel.data.disk.TentRepo
@@ -25,6 +26,8 @@ class ContentInteractorImp @Inject constructor(apiHelper: ApiHelper,
2526
private val elementLoader: ElementLoader)
2627
: BaseInteractorImp(apiHelper, preferenceHelper), ContentBaseInteractor {
2728

29+
override suspend fun persistRSS(rssList: List<RSS>) = contentRepo.insertDefaultRSS(rssList)
30+
2831
override suspend fun getSubject(sha1ID: String) = contentRepo.getSubject(sha1ID)
2932

3033
override suspend fun getDifficulty(sha1ID: String) = contentRepo.getDifficulty(sha1ID)

app/src/main/java/org/secfirst/umbrella/whitelabel/feature/content/presenter/ContentPresenterImp.kt

Lines changed: 21 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import org.secfirst.umbrella.whitelabel.data.database.form.Form
1010
import org.secfirst.umbrella.whitelabel.data.database.lesson.Module
1111
import org.secfirst.umbrella.whitelabel.data.database.lesson.Subject
1212
import org.secfirst.umbrella.whitelabel.data.database.reader.FeedSource
13+
import org.secfirst.umbrella.whitelabel.data.database.reader.RSS
1314
import org.secfirst.umbrella.whitelabel.data.database.segment.Markdown
1415
import org.secfirst.umbrella.whitelabel.data.database.segment.removeHead
1516
import org.secfirst.umbrella.whitelabel.data.database.segment.replaceMarkdownImage
@@ -63,7 +64,7 @@ class ContentPresenterImp<V : ContentView, I : ContentBaseInteractor>
6364
}
6465
TypeFile.CHECKLIST.value -> {
6566
val newChecklist = parseYmlFile(file, Checklist::class)
66-
newChecklist.id= pathId
67+
newChecklist.id = pathId
6768
val oldChecklist = it.getChecklist(pathId)
6869
oldChecklist?.let { oldChecklistSafe ->
6970
checklists.add(updateChecklistForeignKey(newChecklist, oldChecklistSafe))
@@ -102,6 +103,7 @@ class ContentPresenterImp<V : ContentView, I : ContentBaseInteractor>
102103
it.persist(root)
103104
}
104105
it.persistFeedSource(createFeedSources())
106+
it.persistRSS(createDefaultRSS())
105107
getView()?.downloadContentCompleted(isFetchData)
106108
}
107109
}
@@ -119,7 +121,7 @@ class ContentPresenterImp<V : ContentView, I : ContentBaseInteractor>
119121
val module = newElement.convertToModule
120122
val oldModule = it.getModule(sha1ID)
121123
oldModule?.let { oldModuleSafe ->
122-
// modules.add(module.updateModuleContent(oldModuleSafe))
124+
// modules.add(module.updateModuleContent(oldModuleSafe))
123125
}
124126
}
125127
SUB_ELEMENT_LEVEL -> {
@@ -224,6 +226,23 @@ class ContentPresenterImp<V : ContentView, I : ContentBaseInteractor>
224226
return feedSources
225227
}
226228

229+
private fun createDefaultRSS(): List<RSS> {
230+
val rssList = mutableListOf<RSS>()
231+
val rss1 = RSS("https://threatpost.com/feed/")
232+
val rss2 = RSS("https://krebsonsecurity.com/feed/")
233+
val rss3 = RSS("http://feeds.bbci.co.uk/news/world/rss.xml?edition=uk")
234+
val rss4 = RSS("http://rss.cnn.com/rss/edition.rss")
235+
val rss5 = RSS("https://www.aljazeera.com/xml/rss/all.xml")
236+
val rss6 = RSS("https://www.theguardian.com/world/rss")
237+
rssList.add(rss1)
238+
rssList.add(rss2)
239+
rssList.add(rss3)
240+
rssList.add(rss4)
241+
rssList.add(rss5)
242+
rssList.add(rss6)
243+
return rssList
244+
}
245+
227246
override fun cleanContent() {
228247
val cacheDir = UmbrellaApplication.instance.cacheDir
229248
FileUtils.deleteQuietly(cacheDir)

app/src/main/java/org/secfirst/umbrella/whitelabel/feature/reader/presenter/ReaderPresenterImp.kt

Lines changed: 18 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,10 @@ package org.secfirst.umbrella.whitelabel.feature.reader.presenter
33
import android.util.Log
44
import com.einmalfel.earl.EarlParser
55
import com.google.gson.Gson
6-
import getAssetFileBy
7-
import org.secfirst.umbrella.whitelabel.data.database.reader.*
6+
import org.secfirst.umbrella.whitelabel.data.database.reader.FeedLocation
7+
import org.secfirst.umbrella.whitelabel.data.database.reader.FeedSource
8+
import org.secfirst.umbrella.whitelabel.data.database.reader.RSS
9+
import org.secfirst.umbrella.whitelabel.data.database.reader.updateRSS
810
import org.secfirst.umbrella.whitelabel.data.network.FeedItemResponse
911
import org.secfirst.umbrella.whitelabel.feature.base.presenter.BasePresenterImp
1012
import org.secfirst.umbrella.whitelabel.feature.reader.interactor.ReaderBaseInteractor
@@ -19,7 +21,7 @@ class ReaderPresenterImp<V : ReaderView, I : ReaderBaseInteractor>
1921
interactor: I) : BasePresenterImp<V, I>(
2022
interactor = interactor), ReaderBasePresenter<V, I> {
2123

22-
override fun setSkipPassword(value : Boolean) {
24+
override fun setSkipPassword(value: Boolean) {
2325
interactor?.setSkipPassword(value)
2426
}
2527

@@ -53,10 +55,11 @@ class ReaderPresenterImp<V : ReaderView, I : ReaderBaseInteractor>
5355
isFirstRequest: Boolean) {
5456
interactor?.let {
5557
launchSilent(uiContext) {
56-
5758
try {
58-
val feedResponseBody = it.doFeedCall(feedLocation.iso2, getSelectedFeedSources(feedSources), "0").await()
59-
val feedItemResponse = Gson().fromJson(feedResponseBody.string(), Array<FeedItemResponse>::class.java)
59+
val feedResponseBody = it.doFeedCall(feedLocation.iso2,
60+
getSelectedFeedSources(feedSources), "0").await()
61+
val feedItemResponse = Gson()
62+
.fromJson(feedResponseBody.string(), Array<FeedItemResponse>::class.java)
6063
getView()?.startFeedController(feedItemResponse, isFirstRequest)
6164
} catch (exception: Exception) {
6265
getView()?.feedError()
@@ -86,32 +89,17 @@ class ReaderPresenterImp<V : ReaderView, I : ReaderBaseInteractor>
8689

8790
override fun submitFetchRss() {
8891
launchSilent(uiContext) {
89-
var refRss: RefRSS
90-
interactor?.let {
91-
val databaseRss = it.fetchRss()
92-
if (databaseRss.isEmpty()) {
93-
val assetsRss = mutableListOf<RSS>()
94-
refRss = getRssFromAssert()
95-
refRss.items.forEach { item -> assetsRss.add(RSS(item.link)) }
96-
submitRss(assetsRss)
97-
getView()?.showAllRss(processRss(assetsRss))
98-
}
99-
getView()?.showAllRss(processRss(databaseRss))
100-
}
101-
}
102-
}
103-
104-
private fun submitRss(rssList: MutableList<RSS>) {
105-
launchSilent(uiContext) {
106-
interactor?.insertAllRss(rssList)
92+
var rssList = listOf<RSS>()
93+
interactor?.let { rssList = it.fetchRss() }
94+
getView()?.showAllRss(processRss(rssList))
10795
}
10896
}
10997

11098
override fun submitInsertRss(rss: RSS) {
11199
launchSilent(uiContext) {
112100
interactor?.let {
113101
it.insertRss(rss)
114-
processRss(rss.link)?.let { rss -> getView()?.showNewestRss(rss) }
102+
processRss(rss)?.let { rss -> getView()?.showNewestRss(rss) }
115103
}
116104
}
117105
}
@@ -141,7 +129,7 @@ class ReaderPresenterImp<V : ReaderView, I : ReaderBaseInteractor>
141129
try {
142130
val responseBody = it.doRSsCall(rssIt.url_).await()
143131
val feed = EarlParser.parseOrThrow(responseBody.byteStream(), 0)
144-
rssResult.add(feed.convertToRSS)
132+
rssResult.add(feed.updateRSS(rssIt))
145133
} catch (exception: Exception) {
146134
Log.e(tag, "could't load the RSS:, ${rssIt.link}")
147135
}
@@ -150,14 +138,14 @@ class ReaderPresenterImp<V : ReaderView, I : ReaderBaseInteractor>
150138
return rssResult
151139
}
152140

153-
private suspend fun processRss(url: String): RSS? {
141+
private suspend fun processRss(rss: RSS): RSS? {
154142
interactor?.let {
155143
try {
156-
val responseBody = it.doRSsCall(url).await()
144+
val responseBody = it.doRSsCall(rss.url_).await()
157145
val feed = EarlParser.parseOrThrow(responseBody.byteStream(), 0)
158-
return feed.convertToRSS
146+
return feed.updateRSS(rss)
159147
} catch (exception: Exception) {
160-
Log.e(tag, "could't load the RSS:, $url")
148+
Log.e(tag, "could't load the RSS")
161149
}
162150
}
163151
return null
@@ -169,10 +157,4 @@ class ReaderPresenterImp<V : ReaderView, I : ReaderBaseInteractor>
169157
selectedSources.forEach { codeSources.add(it.code) }
170158
return codeSources.joinToString(",")
171159
}
172-
173-
private fun getRssFromAssert(): RefRSS {
174-
val input = getAssetFileBy(RSS_FILE_NAME)
175-
val jsonInString = input.bufferedReader().use { it.readText() }
176-
return Gson().fromJson(jsonInString, RefRSS::class.java)
177-
}
178160
}

app/src/main/java/org/secfirst/umbrella/whitelabel/feature/reader/view/HostReaderController.kt

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@ import android.view.ViewGroup
66
import kotlinx.android.synthetic.main.host_reader_view.*
77
import org.secfirst.umbrella.whitelabel.R
88
import org.secfirst.umbrella.whitelabel.feature.base.view.BaseController
9-
import org.secfirst.umbrella.whitelabel.feature.reader.view.rss.adapter.ReaderAdapter
109

1110

1211
class HostReaderController : BaseController() {

app/src/main/java/org/secfirst/umbrella/whitelabel/feature/reader/view/rss/adapter/ReaderAdapter.kt renamed to app/src/main/java/org/secfirst/umbrella/whitelabel/feature/reader/view/ReaderAdapter.kt

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,33 +1,31 @@
1-
package org.secfirst.umbrella.whitelabel.feature.reader.view.rss.adapter
1+
package org.secfirst.umbrella.whitelabel.feature.reader.view
22

33
import com.bluelinelabs.conductor.Controller
44
import com.bluelinelabs.conductor.Router
55
import com.bluelinelabs.conductor.RouterTransaction
66
import com.bluelinelabs.conductor.support.RouterPagerAdapter
7+
import org.secfirst.umbrella.whitelabel.R
78
import org.secfirst.umbrella.whitelabel.feature.reader.view.feed.FeedSettingsController
89
import org.secfirst.umbrella.whitelabel.feature.reader.view.rss.RssController
9-
import org.secfirst.umbrella.whitelabel.feature.reader.view.server.ServerController
1010

11-
class ReaderAdapter(host: Controller) : RouterPagerAdapter(host) {
11+
class ReaderAdapter(private val host: Controller) : RouterPagerAdapter(host) {
1212
override fun configureRouter(router: Router, position: Int) {
1313
if (!router.hasRootController()) {
1414
when (position) {
1515
0 -> router.setRoot(RouterTransaction.with(FeedSettingsController()))
1616
1 -> router.setRoot(RouterTransaction.with(RssController()))
17-
2 -> router.setRoot(RouterTransaction.with(ServerController()))
1817
}
1918
}
2019
}
2120

2221
override fun getPageTitle(position: Int): String {
2322
return when (position) {
24-
0 -> "FEED"
25-
1 -> "RSS"
26-
2 -> "SWITCH SERVER"
23+
0 -> host.applicationContext?.getString(R.string.feed_title_tab) ?: ""
24+
1 -> host.applicationContext?.getString(R.string.rss_title_tab) ?: ""
2725
else -> ""
2826
}
2927
}
3028

31-
override fun getCount() = 3
29+
override fun getCount() = 2
3230

3331
}

0 commit comments

Comments
 (0)