From 459e044f06c3ff46771f10c14e8065b82137d610 Mon Sep 17 00:00:00 2001 From: yattoz <12408848+yattoz@users.noreply.github.com> Date: Sun, 8 Dec 2019 23:42:22 +0100 Subject: [PATCH] added fallback webView for API19- (no TLSv1.2 for RSS Parser) --- app/build.gradle | 1 + .../tsumugi/ui/news/NewsFragment.kt | 34 +++++++++++++- .../tsumugi/ui/news/NewsViewModel.kt | 11 +++-- .../tsumugi/ui/news/WebViewNews.kt | 47 +++++++++++++++++++ app/src/main/res/layout/fragment_chat.xml | 2 +- app/src/main/res/layout/fragment_news.xml | 42 +++++++++++++---- build.gradle | 2 +- 7 files changed, 123 insertions(+), 16 deletions(-) create mode 100644 app/src/main/java/fr/forum_thalie/tsumugi/ui/news/WebViewNews.kt diff --git a/app/build.gradle b/app/build.gradle index 5564318..71d7ee4 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -77,6 +77,7 @@ dependencies { // RSS parser library @ https://github.com/prof18/RSS-Parser implementation 'com.prof.rssparser:rssparser:2.0.4' + implementation 'com.github.ahorn:android-rss:1.0-rc1' 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/NewsFragment.kt b/app/src/main/java/fr/forum_thalie/tsumugi/ui/news/NewsFragment.kt index f71b89b..d71b947 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 @@ -1,10 +1,13 @@ package fr.forum_thalie.tsumugi.ui.news +import android.os.Build import android.os.Bundle import android.util.Log import android.view.LayoutInflater import android.view.View import android.view.ViewGroup +import android.view.WindowManager +import android.webkit.WebView import androidx.fragment.app.Fragment import androidx.lifecycle.ViewModelProviders import androidx.recyclerview.widget.LinearLayoutManager @@ -23,10 +26,39 @@ class NewsFragment : Fragment() { container: ViewGroup?, savedInstanceState: Bundle? ): View? { + var root = inflater.inflate(R.layout.fragment_news, container, false) as View + if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.KITKAT) + { + root = inflater.inflate(R.layout.fragment_news, container, false) as androidx.coordinatorlayout.widget.CoordinatorLayout + activity?.window?.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN) + val webView = WebView(context) + + newsViewModel = + ViewModelProviders.of(this).get(NewsViewModel::class.java) + + if (!newsViewModel.isWebViewLoaded) + { + try { + val webViewS = root.findViewById(R.id.news_webview) + val webViewChat = WebViewNews(webViewS as WebView) + webViewChat.start() + } catch (e: Exception) { + root = inflater.inflate(R.layout.fragment_error_chat, container, false) + } + + newsViewModel.isWebViewLoaded = true + Log.d(tag, "webview created") + } else { + Log.d(tag, "webview already created!?") + } + + return root + } + newsViewModel = ViewModelProviders.of(this).get(NewsViewModel::class.java) - val root = inflater.inflate(R.layout.fragment_news, container, false) as androidx.swiperefreshlayout.widget.SwipeRefreshLayout + root = inflater.inflate(R.layout.fragment_news, container, false) as androidx.swiperefreshlayout.widget.SwipeRefreshLayout viewManager = LinearLayoutManager(context) viewAdapter = NewsAdapter(newsViewModel.newsArray, context!!) 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 32eb180..b198131 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 @@ -1,5 +1,6 @@ package fr.forum_thalie.tsumugi.ui.news +import android.os.Build import android.util.Log import androidx.lifecycle.ViewModel import androidx.recyclerview.widget.RecyclerView @@ -23,6 +24,7 @@ import kotlin.math.min class NewsViewModel : ViewModel() { val newsArray : ArrayList = ArrayList() + var isWebViewLoaded = false private val urlToScrape = "https://tsumugi.forum-thalie.fr/?feed=rss2" @@ -53,10 +55,12 @@ class NewsViewModel : ViewModel() { fun fetch(root: androidx.swiperefreshlayout.widget.SwipeRefreshLayout? = null, viewAdapter: RecyclerView.Adapter<*>? = null) { + if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.KITKAT) + return // the RSS Parser does not support API20- because of no TLS v1.2 + val maxNumberOfArticles = 5 coroutineScope.launch(Dispatchers.Main) { Log.d(tag, "launching coroutine") - try { val parser = Parser() val articleList = parser.getArticles(urlToScrape) newsArray.clear() @@ -81,10 +85,7 @@ class NewsViewModel : ViewModel() { } // 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 - } + } } } \ No newline at end of file diff --git a/app/src/main/java/fr/forum_thalie/tsumugi/ui/news/WebViewNews.kt b/app/src/main/java/fr/forum_thalie/tsumugi/ui/news/WebViewNews.kt new file mode 100644 index 0000000..a92ef1c --- /dev/null +++ b/app/src/main/java/fr/forum_thalie/tsumugi/ui/news/WebViewNews.kt @@ -0,0 +1,47 @@ +package fr.forum_thalie.tsumugi.ui.news + +import android.annotation.SuppressLint +import android.content.Intent +import android.net.Uri +import android.webkit.WebChromeClient +import android.webkit.WebView + +class WebViewNews(private val webView: WebView) { + + @SuppressLint("SetJavaScriptEnabled") + fun start() { + + val webSetting = this.webView.settings + webSetting.javaScriptEnabled = true + webSetting.setSupportZoom(true) + + /* TODO: in the future, it could be nice to have a parameters screen where you can: + - Set the text zoom + - Set your username (to not type it every time, would it be possible?) + - Hide the chat? + - do more? */ + webSetting.textZoom = 90 + + webSetting.setSupportMultipleWindows(true) + // needs to open target="_blank" links as KiwiIRC links have this attribute. + // shamelessly ripped off https://stackoverflow.com/questions/18187714/android-open-target-blank-links-in-webview-with-external-browser + this.webView.webChromeClient = object : WebChromeClient() { + override fun onCreateWindow( + view: WebView, + dialog: Boolean, + userGesture: Boolean, + resultMsg: android.os.Message + ): Boolean { + val result = view.hitTestResult + val data = result.extra + val context = view.context + val browserIntent = Intent(Intent.ACTION_VIEW, Uri.parse(data)) + context.startActivity(browserIntent) + return false + } + } + + webView.loadUrl("https://tsumugi.forum-thalie.fr/") + } + +} diff --git a/app/src/main/res/layout/fragment_chat.xml b/app/src/main/res/layout/fragment_chat.xml index 823f93c..7c82252 100644 --- a/app/src/main/res/layout/fragment_chat.xml +++ b/app/src/main/res/layout/fragment_chat.xml @@ -35,7 +35,7 @@ This WebView is just the size of the screen, to make it practical. --> diff --git a/app/src/main/res/layout/fragment_news.xml b/app/src/main/res/layout/fragment_news.xml index 264f2c7..b16e070 100644 --- a/app/src/main/res/layout/fragment_news.xml +++ b/app/src/main/res/layout/fragment_news.xml @@ -1,16 +1,42 @@ - - + android:layout_height="wrap_content" + android:layout_marginStart="8dp" + android:layout_marginTop="8dp" + android:layout_marginEnd="8dp" + android:textAlignment="center" + android:textSize="20sp" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toTopOf="parent"/> + +--> - - \ No newline at end of file + + + + + + + \ No newline at end of file diff --git a/build.gradle b/build.gradle index 960ef03..fd13350 100644 --- a/build.gradle +++ b/build.gradle @@ -18,7 +18,7 @@ allprojects { repositories { google() jcenter() - + maven { url 'https://jitpack.io' } } }