From 99961e8a4e99d73a77541936ed44cd58ee4916c0 Mon Sep 17 00:00:00 2001 From: yattoz <12408848+yattoz@users.noreply.github.com> Date: Sun, 8 Dec 2019 13:27:55 +0100 Subject: [PATCH] added RSS parser and simple news reader. Clicking on title opens website --- app/build.gradle | 5 +- .../fr/forum_thalie/tsumugi/ui/news/News.kt | 1 + .../tsumugi/ui/news/NewsAdapter.kt | 11 ++++- .../tsumugi/ui/news/NewsFragment.kt | 2 +- .../tsumugi/ui/news/NewsViewModel.kt | 47 +++++++++++++++++-- 5 files changed, 58 insertions(+), 8 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 5a306fc..5564318 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -69,12 +69,15 @@ dependencies { implementation 'androidx.lifecycle:lifecycle-extensions:2.1.0' implementation 'androidx.lifecycle:lifecycle-viewmodel-ktx:2.1.0' - implementation 'androidx.recyclerview:recyclerview:1.0.0' + implementation 'androidx.recyclerview:recyclerview:1.1.0' implementation 'androidx.preference:preference:1.1.0' // jsoup HTML parser library @ https://jsoup.org/ // implementation 'org.jsoup:jsoup:1.12.1' + // RSS parser library @ https://github.com/prof18/RSS-Parser + implementation 'com.prof.rssparser:rssparser:2.0.4' + def work_version = "2.2.0" implementation "androidx.work:work-runtime-ktx:$work_version" diff --git a/app/src/main/java/fr/forum_thalie/tsumugi/ui/news/News.kt b/app/src/main/java/fr/forum_thalie/tsumugi/ui/news/News.kt index 2c7d6fd..9d4cef8 100644 --- a/app/src/main/java/fr/forum_thalie/tsumugi/ui/news/News.kt +++ b/app/src/main/java/fr/forum_thalie/tsumugi/ui/news/News.kt @@ -7,6 +7,7 @@ class News { var text: String = "" var header: String = "" var author: String = "" + var link: String = "" var date: Date = Date() override fun toString() : String diff --git a/app/src/main/java/fr/forum_thalie/tsumugi/ui/news/NewsAdapter.kt b/app/src/main/java/fr/forum_thalie/tsumugi/ui/news/NewsAdapter.kt index 1e5b728..eb1e494 100644 --- a/app/src/main/java/fr/forum_thalie/tsumugi/ui/news/NewsAdapter.kt +++ b/app/src/main/java/fr/forum_thalie/tsumugi/ui/news/NewsAdapter.kt @@ -1,17 +1,21 @@ package fr.forum_thalie.tsumugi.ui.news import android.annotation.SuppressLint +import android.content.Context +import android.content.Intent +import android.net.Uri import android.widget.TextView import android.view.LayoutInflater import android.view.ViewGroup import androidx.constraintlayout.widget.ConstraintLayout +import androidx.core.content.ContextCompat.startActivity import androidx.core.text.HtmlCompat import androidx.core.widget.TextViewCompat import androidx.recyclerview.widget.RecyclerView import fr.forum_thalie.tsumugi.R import kotlin.collections.ArrayList -class NewsAdapter(private val dataSet: ArrayList +class NewsAdapter(private val dataSet: ArrayList, private val c: Context /*, context: Context, resource: Int, @@ -45,6 +49,11 @@ class NewsAdapter(private val dataSet: ArrayList val author = holder.itemView.findViewById(R.id.news_author) val header = holder.itemView.findViewById(R.id.news_header) title.text = dataSet[position].title + title.setOnClickListener { + val i = Intent(Intent.ACTION_VIEW) + i.data = Uri.parse(dataSet[position].link) + c.startActivity(i) + } text.text = HtmlCompat.fromHtml(dataSet[position].text, HtmlCompat.FROM_HTML_MODE_LEGACY) header.text = HtmlCompat.fromHtml(dataSet[position].header, HtmlCompat.FROM_HTML_MODE_LEGACY).replace(Regex("\n"), " ") author.text = "| ${dataSet[position].author}" diff --git a/app/src/main/java/fr/forum_thalie/tsumugi/ui/news/NewsFragment.kt b/app/src/main/java/fr/forum_thalie/tsumugi/ui/news/NewsFragment.kt index 5eff667..f71b89b 100644 --- a/app/src/main/java/fr/forum_thalie/tsumugi/ui/news/NewsFragment.kt +++ b/app/src/main/java/fr/forum_thalie/tsumugi/ui/news/NewsFragment.kt @@ -29,7 +29,7 @@ class NewsFragment : Fragment() { val root = inflater.inflate(R.layout.fragment_news, container, false) as androidx.swiperefreshlayout.widget.SwipeRefreshLayout viewManager = LinearLayoutManager(context) - viewAdapter = NewsAdapter(newsViewModel.newsArray) + viewAdapter = NewsAdapter(newsViewModel.newsArray, context!!) recyclerView = root.findViewById(R.id.news_recycler).apply { // use this setting to improve performance if you know that changes // in content do not change the layout size of the RecyclerView diff --git a/app/src/main/java/fr/forum_thalie/tsumugi/ui/news/NewsViewModel.kt b/app/src/main/java/fr/forum_thalie/tsumugi/ui/news/NewsViewModel.kt index f0a862e..4190957 100644 --- a/app/src/main/java/fr/forum_thalie/tsumugi/ui/news/NewsViewModel.kt +++ b/app/src/main/java/fr/forum_thalie/tsumugi/ui/news/NewsViewModel.kt @@ -3,21 +3,28 @@ package fr.forum_thalie.tsumugi.ui.news import android.util.Log import androidx.lifecycle.ViewModel import androidx.recyclerview.widget.RecyclerView +import com.prof.rssparser.Parser import fr.forum_thalie.tsumugi.Async import fr.forum_thalie.tsumugi.tag +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.Job +import kotlinx.coroutines.launch import org.json.JSONArray import org.json.JSONObject import java.net.URL import java.text.SimpleDateFormat import java.util.* import kotlin.collections.ArrayList +import kotlin.math.max +import kotlin.math.min class NewsViewModel : ViewModel() { val newsArray : ArrayList = ArrayList() - private val urlToScrape = "https://r-a-d.io/api/news" + private val urlToScrape = "https://tsumugi.forum-thalie.fr/?feed=rss2" private val scrape : (Any?) -> Unit = { @@ -41,12 +48,42 @@ class NewsViewModel : ViewModel() { } } + private val viewModelJob = Job() + private val coroutineScope = CoroutineScope(Dispatchers.Main + viewModelJob) + fun fetch(root: androidx.swiperefreshlayout.widget.SwipeRefreshLayout? = null, viewAdapter: RecyclerView.Adapter<*>? = null) { - val post : (parameter: Any?) -> Unit = { - root?.isRefreshing = false - viewAdapter?.notifyDataSetChanged() + val maxNumberOfArticles = 5 + coroutineScope.launch(Dispatchers.Main) { + Log.d(tag, "launching coroutine") + try { + val parser = Parser() + val articleList = parser.getArticles(urlToScrape) + newsArray.clear() + for (i in 0 until min(articleList.size, maxNumberOfArticles)) + { + val item = articleList[i] + Log.d(tag, "i = $i / ${articleList.size}") + val news = News() + news.title = item.title ?: "" + news.link = item.link ?: urlToScrape + news.author = item.author ?: "" + news.text = item.content ?: "" + news.header = item.description ?: "" + + //val formatter6 = SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.getDefault()) + + //news.date = formatter6.parse(item.pubDate ?: Date().toString()) ?: Date() + + Log.d(tag, "$news - ${item.pubDate}") + newsArray.add(news) + } + // The list contains all article's data. For example you can use it for your adapter. + root?.isRefreshing = false + viewAdapter?.notifyDataSetChanged() + } catch (e: Exception) { + // Handle the exception + } } - Async(scrape, post) } } \ No newline at end of file