[Android] Theme About webview
Nicolas Pomepuy
git at videolan.org
Tue Aug 13 10:17:11 CEST 2019
vlc-android | branch: master | Nicolas Pomepuy <nicolas.pomepuy at gmail.com> | Mon Aug 12 10:17:03 2019 +0200| [10c837e1f47adc5c638951eafa4f8b2846f5c70b] | committer: Nicolas Pomepuy
Theme About webview
> https://code.videolan.org/videolan/vlc-android/commit/10c837e1f47adc5c638951eafa4f8b2846f5c70b
---
vlc-android/assets/licence.htm | 2 +-
vlc-android/assets/licence_dark.css | 1 +
vlc-android/assets/licence_light.css | 1 +
.../src/org/videolan/vlc/gui/AboutFragment.kt | 65 ++++++++++++++++++----
4 files changed, 58 insertions(+), 11 deletions(-)
diff --git a/vlc-android/assets/licence.htm b/vlc-android/assets/licence.htm
index b662e9f70..ab9821b57 100644
--- a/vlc-android/assets/licence.htm
+++ b/vlc-android/assets/licence.htm
@@ -7,7 +7,7 @@
<meta http-equiv="content-type" content="text/html;charset=utf-8" />
</head>
-<body id="top" style="background-color: #EBEBEE">
+<body id="top">
<h1>VLC for Android</h1>
<p>Copyleft © 1996-2019 VideoLAN, VLC authors</p>
<div>
diff --git a/vlc-android/assets/licence_dark.css b/vlc-android/assets/licence_dark.css
new file mode 100644
index 000000000..f13165282
--- /dev/null
+++ b/vlc-android/assets/licence_dark.css
@@ -0,0 +1 @@
+html,body{color:#fafafa;background:#323232;}a:link {color: #ff7d00;}
\ No newline at end of file
diff --git a/vlc-android/assets/licence_light.css b/vlc-android/assets/licence_light.css
new file mode 100644
index 000000000..39634dc78
--- /dev/null
+++ b/vlc-android/assets/licence_light.css
@@ -0,0 +1 @@
+html,body{color:#212121;background:#fafafa;}a:link {color: #ff7d00;}
\ No newline at end of file
diff --git a/vlc-android/src/org/videolan/vlc/gui/AboutFragment.kt b/vlc-android/src/org/videolan/vlc/gui/AboutFragment.kt
index 456ce7bf8..b6482fc08 100644
--- a/vlc-android/src/org/videolan/vlc/gui/AboutFragment.kt
+++ b/vlc-android/src/org/videolan/vlc/gui/AboutFragment.kt
@@ -20,11 +20,15 @@
package org.videolan.vlc.gui
+import android.annotation.SuppressLint
+import android.content.res.Configuration
import android.os.Bundle
+import android.util.Base64
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.webkit.WebView
+import android.webkit.WebViewClient
import android.widget.ScrollView
import androidx.appcompat.app.AppCompatActivity
import androidx.fragment.app.Fragment
@@ -33,7 +37,6 @@ import com.google.android.material.tabs.TabLayout
import kotlinx.coroutines.*
import org.videolan.tools.coroutineScope
import org.videolan.vlc.BuildConfig
-import org.videolan.vlc.R
import org.videolan.vlc.gui.audio.AudioPagerAdapter
import org.videolan.vlc.gui.helpers.UiTools
import org.videolan.vlc.util.Util
@@ -46,27 +49,25 @@ private const val MODE_TOTAL = 2 // Number of audio browser modes
class AboutFragment : Fragment() {
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View {
- return inflater.inflate(R.layout.about, container, false)
+ return inflater.inflate(org.videolan.vlc.R.layout.about, container, false)
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
(activity as? AppCompatActivity)?.supportActionBar?.title = "VLC ${BuildConfig.VERSION_NAME}"
- //Fix android 7 Locale problem with webView
- //https://stackoverflow.com/questions/40398528/android-webview-locale-changes-abruptly-on-android-n
- val aboutMain = view.findViewById<ScrollView>(R.id.about_main)
- val webView = view.findViewById<WebView>(R.id.webview)
- val revision = getString(R.string.build_revision)
+ val aboutMain = view.findViewById<ScrollView>(org.videolan.vlc.R.id.about_main)
+ val webView = view.findViewById<WebView>(org.videolan.vlc.R.id.webview)
+ val revision = getString(org.videolan.vlc.R.string.build_revision)
val lists = arrayOf(aboutMain, webView)
- val titles = arrayOf(getString(R.string.about), getString(R.string.licence))
- val viewPager = view.findViewById<ViewPager>(R.id.pager).apply {
+ val titles = arrayOf(getString(org.videolan.vlc.R.string.about), getString(org.videolan.vlc.R.string.licence))
+ val viewPager = view.findViewById<ViewPager>(org.videolan.vlc.R.id.pager).apply {
offscreenPageLimit = MODE_TOTAL - 1
adapter = AudioPagerAdapter(lists as Array<View>, titles)
}
- requireActivity().findViewById<TabLayout>(R.id.sliding_tabs).apply {
+ requireActivity().findViewById<TabLayout>(org.videolan.vlc.R.id.sliding_tabs).apply {
visibility = View.VISIBLE
setupWithViewPager(viewPager)
}
@@ -76,7 +77,51 @@ class AboutFragment : Fragment() {
}
UiTools.fillAboutView(view)
webView.loadData(asset, "text/html", "UTF8")
+
+ webView.webViewClient = object : WebViewClient() {
+
+ override fun onPageFinished(view: WebView, url: String) {
+
+ // Inject CSS when page is done loading
+ injectCSS(webView, when (context?.resources?.configuration?.uiMode?.and(Configuration.UI_MODE_NIGHT_MASK)) {
+ Configuration.UI_MODE_NIGHT_YES -> {
+ "licence_dark.css"
+ }
+ Configuration.UI_MODE_NIGHT_NO -> {
+ "licence_light.css"
+ }
+ else -> {
+ "licence_light.css"
+ }
+ })
+ super.onPageFinished(view, url)
+ }
+ }
+
+
}
}
+ @SuppressLint("SetJavaScriptEnabled")
+ private fun injectCSS(webView: WebView, cssAsset: String) {
+ try {
+ webView.settings.javaScriptEnabled = true
+ val inputStream = requireActivity().assets.open(cssAsset)
+ val buffer = ByteArray(inputStream.available())
+ inputStream.read(buffer)
+ inputStream.close()
+ val encoded = Base64.encodeToString(buffer, Base64.NO_WRAP)
+ webView.loadUrl("javascript:(function() {" +
+ "var parent = document.getElementsByTagName('head').item(0);" +
+ "var style = document.createElement('style');" +
+ "style.type = 'text/css';" +
+ // Tell the browser to BASE64-decode the string into your script !!!
+ "style.innerHTML = window.atob('" + encoded + "');" +
+ "parent.appendChild(style)" +
+ "})()")
+ webView.settings.javaScriptEnabled = false
+ } catch (e: Exception) {
+ e.printStackTrace()
+ }
+ }
}
More information about the Android
mailing list