Skip to content

Commit

Permalink
Dark mode improvements (#69)
Browse files Browse the repository at this point in the history
* Add 'system default' option for dark mode

* Rename 'app dark mode' option to 'theme'

* Also make system dark mode work on the 7-day forecast
  • Loading branch information
CNugteren authored Feb 14, 2025
1 parent e1d6017 commit 4659ac2
Show file tree
Hide file tree
Showing 8 changed files with 49 additions and 38 deletions.
11 changes: 10 additions & 1 deletion app/src/main/java/foss/cnugteren/nlweer/MainActivity.kt
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,7 @@ class MainActivity : AppCompatActivity() {
private var locationManager : LocationManager? = null
var gpsLat: Float? = null
var gpsLon: Float? = null
var appIsInDarkMode: Boolean = false
private var baseContextWrappingDelegate: AppCompatDelegate? = null
private lateinit var binding: ActivityMainBinding
private var navGraphCreated: Boolean = false
Expand Down Expand Up @@ -225,15 +226,23 @@ class MainActivity : AppCompatActivity() {
// Dark mode
fun setAppTheme() {
val sharedPreferences = PreferenceManager.getDefaultSharedPreferences(applicationContext)
val darkModeSetting = sharedPreferences.getString("dark_mode", "dark_mode_no")
val darkModeSetting = sharedPreferences.getString("dark_mode", "dark_mode_system")
if (darkModeSetting == "dark_mode_yes") {
AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES)
appIsInDarkMode = true
}
else if (darkModeSetting == "dark_mode_system") {
AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_FOLLOW_SYSTEM)
val darkModeFlags = resources.configuration.uiMode and Configuration.UI_MODE_NIGHT_MASK
appIsInDarkMode = darkModeFlags == Configuration.UI_MODE_NIGHT_YES
}
else {
AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_NO)
appIsInDarkMode = false
}
}


// Menu button: refresh
fun onClickRefresh(@Suppress("UNUSED_PARAMETER") v: MenuItem) {
val navHostFragment = supportFragmentManager.findFragmentById(R.id.nav_host_fragment)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -95,11 +95,10 @@ class BuienradarChartFragment : Fragment() {
}

fun loadPage() {
val sharedPreferences = PreferenceManager.getDefaultSharedPreferences(requireContext())
val darkMode = sharedPreferences.getString("dark_mode", "dark_mode_no")
val activity = this.activity as MainActivity
var textColour = Color.BLACK
var background = Color.WHITE
if (darkMode == "dark_mode_yes") {
if (activity.appIsInDarkMode) {
textColour = Color.WHITE
background = Color.rgb(48, 48, 48) // matches Android's dark mode colours
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,15 +8,16 @@ import android.view.ViewGroup
import android.webkit.WebView
import android.webkit.WebViewClient
import androidx.fragment.app.Fragment
import androidx.preference.PreferenceManager
import androidx.swiperefreshlayout.widget.SwipeRefreshLayout
import foss.cnugteren.nlweer.MainActivity
import foss.cnugteren.nlweer.R
import foss.cnugteren.nlweer.databinding.FragmentKnmiPluimBinding

class WebClientKnmiPluim : WebViewClient() {
class WebClientKnmiPluim(activity: MainActivity) : WebViewClient() {
// From https://stackoverflow.com/questions/14423981/android-webview-display-only-some-part-of-website

private var mainActivity: MainActivity = activity

@Deprecated("Deprecated in Java")
override fun shouldOverrideUrlLoading(
view: WebView,
Expand All @@ -38,9 +39,8 @@ class WebClientKnmiPluim : WebViewClient() {
"document.getElementsByClassName('columns')[3].style.display='none';" +
"document.getElementsByClassName('chart-legend__wrp')[0].style.display='none';" +
"}\n)()")
val sharedPreferences = PreferenceManager.getDefaultSharedPreferences(view.context)
val darkMode = sharedPreferences.getString("dark_mode", "dark_mode_no")
if (darkMode == "dark_mode_yes") {

if (mainActivity.appIsInDarkMode) {
view.setBackgroundColor(Color.parseColor("#2e2e2e")); // matches Android's dark mode colours
}
}
Expand Down Expand Up @@ -74,7 +74,7 @@ class KnmiPluimFragment : Fragment() {

// The web-viewer for the content
val webView = binding.webView
val webViewClientModified = WebClientKnmiPluim()
val webViewClientModified = WebClientKnmiPluim(activity)
webView.settings.javaScriptEnabled = true
webView.webViewClient = webViewClientModified

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -75,11 +75,13 @@ class KnmiSixDayForecastFragment : Fragment() {

private fun loadPage() {
val webView = binding.webView
webView.loadData(HtmlBuilder().buildHtmlPageWithLoadingMessage(), "text/html", "utf-8")
RetrieveWebPage().execute(getURL())
val activity = this.activity as MainActivity
webView.loadData(HtmlBuilder().buildHtmlPageWithLoadingMessage(activity.appIsInDarkMode), "text/html", "utf-8")
RetrieveWebPage(activity).execute(getURL())
}

internal inner class RetrieveWebPage : AsyncTask<String, Void, Document>() {
internal inner class RetrieveWebPage(activity: MainActivity) : AsyncTask<String, Void, Document>() {
private var mainActivity: MainActivity = activity

// Retrieves the data from the URL using JSoup (async)
@Deprecated("Deprecated in Java")
Expand All @@ -98,27 +100,26 @@ class KnmiSixDayForecastFragment : Fragment() {
if (_binding == null) {
return
}

val webView = binding.webView
val htmlBuilder = HtmlBuilder()
if (htmlDocument == null) {
webView.loadData(htmlBuilder.buildHtmPageWithLoadingError(), "text/html", "utf-8")
webView.loadData(htmlBuilder.buildHtmPageWithLoadingError(mainActivity.appIsInDarkMode), "text/html", "utf-8")
return
}

val weatherForecastTable = htmlDocument.select("div.weather-forecast__table").firstOrNull()
if (weatherForecastTable == null){
webView.loadData(htmlBuilder.buildHtmPageWithLoadingError(), "text/html", "utf-8")
webView.loadData(htmlBuilder.buildHtmPageWithLoadingError(mainActivity.appIsInDarkMode), "text/html", "utf-8")
return
}

try {
val tableData = getTableData(weatherForecastTable)
val htmlPageToShow = htmlBuilder.buildHtmlPageWithTables(tableData)
val htmlPageToShow = htmlBuilder.buildHtmlPageWithTables(tableData, mainActivity.appIsInDarkMode)
webView.loadData(htmlPageToShow, "text/html", "UTF-8")
}
catch (ex: Exception) {
webView.loadData(htmlBuilder.buildHtmPageWithLoadingError(), "text/html", "utf-8")
webView.loadData(htmlBuilder.buildHtmPageWithLoadingError(mainActivity.appIsInDarkMode), "text/html", "utf-8")
}
}

Expand Down Expand Up @@ -204,11 +205,11 @@ class KnmiSixDayForecastFragment : Fragment() {
// Row height used for every other row for aesthetic reasons; in pixels
private val paddedRowHeight get() = 24

fun buildHtmlPageWithTables(tableData: Array<Array<String>>) : String {
fun buildHtmlPageWithTables(tableData: Array<Array<String>>, appIsInDarkMode: Boolean) : String {
val columnsPerTable = calculateColumnsPerTable(tableData)
val tablesHtml = getHtmlTables(tableData, columnsPerTable)

return getHtmlPageWithContent(tablesHtml)
return getHtmlPageWithContent(tablesHtml, appIsInDarkMode)
}

private fun calculateColumnsPerTable(tableData: Array<Array<String>>): Int {
Expand Down Expand Up @@ -264,23 +265,20 @@ class KnmiSixDayForecastFragment : Fragment() {
return htmlTable
}

fun buildHtmlPageWithLoadingMessage() : String {
fun buildHtmlPageWithLoadingMessage(appIsInDarkMode: Boolean) : String {
val loadingMessageHtml = "<p>" + getString(R.string.menu_knmi_text_loading) + "</p>" + """<br style="line-height: 10px">"""
return getHtmlPageWithContent(loadingMessageHtml)
return getHtmlPageWithContent(loadingMessageHtml, appIsInDarkMode)
}

fun buildHtmPageWithLoadingError() : String {
fun buildHtmPageWithLoadingError(appIsInDarkMode: Boolean) : String {
val errorMessageHtml = "<p>" + getString(R.string.menu_knmi_text_failed) + "</p>" + """<br style="line-height: 10px">"""
return getHtmlPageWithContent(errorMessageHtml)
return getHtmlPageWithContent(errorMessageHtml, appIsInDarkMode)
}

private fun getHtmlPageWithContent(content: String) : String {
val webView = binding.webView
val sharedPreferences = PreferenceManager.getDefaultSharedPreferences(webView.context)
val darkMode = sharedPreferences.getString("dark_mode", "dark_mode_no")
private fun getHtmlPageWithContent(content: String, appIsInDarkMode: Boolean) : String {
var backgroundColor = "rgb(250, 250, 250)"
var textColor = "black"
if (darkMode == "dark_mode_yes") {
if (appIsInDarkMode) {
backgroundColor = "rgb(48, 48, 48)" // Android dark mode color
textColor = "rgb(193, 193, 193)" // Android dark mode color
}
Expand Down
7 changes: 4 additions & 3 deletions app/src/main/res/values-fr/strings.xml
Original file line number Diff line number Diff line change
Expand Up @@ -95,9 +95,10 @@
<string name="settings_location_shape">Forme du balise de position</string>
<string name="settings_location_colour">Couleur du balise de position</string>

<string name="settings_dark_mode">Mode sombre</string>
<string name="dark_mode_no">Désactivé</string>
<string name="dark_mode_yes">Activé</string>
<string name="settings_dark_mode">Thème</string>
<string name="dark_mode_no">Clair</string>
<string name="dark_mode_yes">Obscur</string>
<string name="dark_mode_system">Défaut du système</string>

<string name="settings_languages">Langue</string>
<string name="language_system">Défaut du système</string>
Expand Down
7 changes: 4 additions & 3 deletions app/src/main/res/values-nl/strings.xml
Original file line number Diff line number Diff line change
Expand Up @@ -96,9 +96,10 @@
<string name="settings_location_shape">Vorm van de locatiemarker</string>
<string name="settings_location_colour">Kleur van de locatiemarker</string>

<string name="settings_dark_mode">Donkere modus</string>
<string name="dark_mode_no">Uit</string>
<string name="dark_mode_yes">Aan</string>
<string name="settings_dark_mode">Thema</string>
<string name="dark_mode_no">Licht</string>
<string name="dark_mode_yes">Donker</string>
<string name="dark_mode_system">Systeemstandaard</string>

<string name="settings_languages">Weergavetaal</string>
<string name="language_system">Systeemstandaard</string>
Expand Down
2 changes: 2 additions & 0 deletions app/src/main/res/values/arrays.xml
Original file line number Diff line number Diff line change
Expand Up @@ -45,11 +45,13 @@
<string-array name="dark_mode_items">
<item>@string/dark_mode_no</item>
<item>@string/dark_mode_yes</item>
<item>@string/dark_mode_system</item>
</string-array>

<string-array name="dark_mode_values">
<item>dark_mode_no</item>
<item>dark_mode_yes</item>
<item>dark_mode_system</item>
</string-array>

<string-array name="location_shape_items">
Expand Down
7 changes: 4 additions & 3 deletions app/src/main/res/values/strings.xml
Original file line number Diff line number Diff line change
Expand Up @@ -95,9 +95,10 @@
<string name="settings_location_shape">Location marker shape</string>
<string name="settings_location_colour">Location marker colour</string>

<string name="settings_dark_mode">App dark mode</string>
<string name="dark_mode_no">Disabled</string>
<string name="dark_mode_yes">Enabled</string>
<string name="settings_dark_mode">Theme</string>
<string name="dark_mode_no">Light</string>
<string name="dark_mode_yes">Dark</string>
<string name="dark_mode_system">System default</string>

<string name="settings_languages">Display language</string>
<string name="language_system">System default</string>
Expand Down

0 comments on commit 4659ac2

Please sign in to comment.