From ead8b065546b2db3136196cf9c1b37416c654999 Mon Sep 17 00:00:00 2001 From: Lee245 Date: Tue, 27 Feb 2024 20:03:43 +0100 Subject: [PATCH] Added 6-day KNMI forecast (#44) https://github.com/CNugteren/NLWeer/pull/44 --------- Co-authored-by: Leonard --- .idea/migrations.xml | 10 + .idea/misc.xml | 3 +- app/build.gradle | 4 +- app/src/main/AndroidManifest.xml | 4 +- .../foss/cnugteren/nlweer/MainActivity.kt | 3 + .../java/foss/cnugteren/nlweer/MapData.kt | 1 + .../ui/fragments/BuienradarChartFragment.kt | 7 +- .../fragments/KnmiSixDayForecastFragment.kt | 279 ++++++++++++++++++ .../nlweer/ui/fragments/KnmiTextFragment.kt | 40 +-- .../nlweer/ui/fragments/SettingsFragment.kt | 6 +- .../main/res/drawable/menu_sixdayforecast.xml | 12 + .../layout/fragment_knmi_sixdayforecast.xml | 33 +++ .../main/res/layout/fragment_knmi_text.xml | 33 +-- .../main/res/menu/activity_main_drawer.xml | 4 + .../main/res/navigation/mobile_navigation.xml | 1 + app/src/main/res/values-fr/strings.xml | 3 +- app/src/main/res/values-nl/strings.xml | 3 +- app/src/main/res/values/strings.xml | 3 +- 18 files changed, 388 insertions(+), 61 deletions(-) create mode 100644 .idea/migrations.xml create mode 100644 app/src/main/java/foss/cnugteren/nlweer/ui/fragments/KnmiSixDayForecastFragment.kt create mode 100644 app/src/main/res/drawable/menu_sixdayforecast.xml create mode 100644 app/src/main/res/layout/fragment_knmi_sixdayforecast.xml diff --git a/.idea/migrations.xml b/.idea/migrations.xml new file mode 100644 index 0000000..f8051a6 --- /dev/null +++ b/.idea/migrations.xml @@ -0,0 +1,10 @@ + + + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml index d6c42ae..8978d23 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -1,7 +1,6 @@ - - + diff --git a/app/build.gradle b/app/build.gradle index 419eb0a..ee27fca 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -3,11 +3,11 @@ apply plugin: 'com.android.application' apply plugin: 'kotlin-android' android { - compileSdk 30 + compileSdk 34 defaultConfig { applicationId "foss.cnugteren.nlweer" minSdkVersion 21 - targetSdkVersion 30 + targetSdkVersion 34 versionCode 11 versionName "1.9.0" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 6adf574..87218f8 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -15,10 +15,10 @@ + android:theme="@style/AppTheme.NoActionBar" + android:exported="true"> - diff --git a/app/src/main/java/foss/cnugteren/nlweer/MainActivity.kt b/app/src/main/java/foss/cnugteren/nlweer/MainActivity.kt index f5ef1c0..520d404 100644 --- a/app/src/main/java/foss/cnugteren/nlweer/MainActivity.kt +++ b/app/src/main/java/foss/cnugteren/nlweer/MainActivity.kt @@ -132,6 +132,9 @@ class MainActivity : AppCompatActivity() { R.id.nav_knmi_text -> { fragment(item.navId) {label = getString(item.stringId) } } + R.id.nav_knmi_sixdayforecast -> { + fragment(item.navId) {label = getString(item.stringId) } + } R.id.nav_knmi_pluim -> { fragment(item.navId) {label = getString(item.stringId) } } diff --git a/app/src/main/java/foss/cnugteren/nlweer/MapData.kt b/app/src/main/java/foss/cnugteren/nlweer/MapData.kt index 1354f12..0e0d7f4 100644 --- a/app/src/main/java/foss/cnugteren/nlweer/MapData.kt +++ b/app/src/main/java/foss/cnugteren/nlweer/MapData.kt @@ -40,6 +40,7 @@ val KNMI_ITEMS = arrayOf( MapData(R.string.menu_knmi_rain_m1_no_temp, R.id.nav_knmi_rain_m1_no_temp, 0, R.id.knmi_menu, "https://cdn.knmi.nl/knmi/map/page/weer/actueel-weer/neerslagradar/WWWRADAR_loop.gif", 425, 445, arrayOf(50.60f, 1.85f, 54.05f, 7.20f, -0.10f, 0.09f)), // Special maps MapData(R.string.menu_knmi_text, R.id.nav_knmi_text, 1, R.id.knmi_menu, "N/A", 0, 0, arrayOf(0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f)), + MapData(R.string.menu_knmi_sixdayforecast, R.id.nav_knmi_sixdayforecast, 1, R.id.knmi_menu, "N/A", 0, 0, arrayOf(0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f)), MapData(R.string.menu_knmi_pluim, R.id.nav_knmi_pluim, 0, R.id.knmi_menu, "N/A", 0, 0, arrayOf(0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f)) ) diff --git a/app/src/main/java/foss/cnugteren/nlweer/ui/fragments/BuienradarChartFragment.kt b/app/src/main/java/foss/cnugteren/nlweer/ui/fragments/BuienradarChartFragment.kt index 637005f..97419df 100644 --- a/app/src/main/java/foss/cnugteren/nlweer/ui/fragments/BuienradarChartFragment.kt +++ b/app/src/main/java/foss/cnugteren/nlweer/ui/fragments/BuienradarChartFragment.kt @@ -101,7 +101,7 @@ class BuienradarChartFragment : Fragment() { var background = Color.WHITE if (darkMode == "dark_mode_yes") { textColour = Color.WHITE - background = Color.rgb(46, 46, 46) // matches Android's dark mode colours + background = Color.rgb(48, 48, 48) // matches Android's dark mode colours } val chart = binding.buienradarChart @@ -154,6 +154,11 @@ class BuienradarChartFragment : Fragment() { // When complete: parses the result override fun onPostExecute(htmlDocument: Document?) { + // It may be that the user has already moved on to the next fragment + if (_binding == null) { + return + } + val chart = binding.buienradarChart if (htmlDocument == null || htmlDocument.text() == "") { chart.setNoDataText(getString(R.string.menu_buienradar_chart_error) + ": " + diff --git a/app/src/main/java/foss/cnugteren/nlweer/ui/fragments/KnmiSixDayForecastFragment.kt b/app/src/main/java/foss/cnugteren/nlweer/ui/fragments/KnmiSixDayForecastFragment.kt new file mode 100644 index 0000000..b4dde8f --- /dev/null +++ b/app/src/main/java/foss/cnugteren/nlweer/ui/fragments/KnmiSixDayForecastFragment.kt @@ -0,0 +1,279 @@ +package foss.cnugteren.nlweer.ui.fragments + +import android.content.res.Resources +import android.os.AsyncTask +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.webkit.URLUtil +import androidx.core.view.marginEnd +import androidx.core.view.marginStart +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.FragmentKnmiSixdayforecastBinding +import org.jsoup.Jsoup +import org.jsoup.nodes.Document +import org.jsoup.nodes.Element +import kotlin.math.ceil +import kotlin.math.floor +import kotlin.math.min + +class KnmiSixDayForecastFragment : Fragment() { + + private var _binding: FragmentKnmiSixdayforecastBinding? = null + // This property is only valid between onCreateView and + // onDestroyView. + private val binding get() = _binding!! + + override fun onCreateView( + inflater: LayoutInflater, + container: ViewGroup?, + savedInstanceState: Bundle? + ): View? { + _binding = FragmentKnmiSixdayforecastBinding.inflate(inflater, container, false) + + // Pull down to refresh the page + val root = binding.root + val pullToRefresh = root.findViewById(R.id.pullToRefresh) + pullToRefresh.setOnRefreshListener(SwipeRefreshLayout.OnRefreshListener { + refreshPage() + pullToRefresh.isRefreshing = false + }) + + // Do display floating navigation buttons + val activity = this.activity as MainActivity + activity.toggleNavigationButtons(true) + + // The web-viewer for the content + val webView = binding.webView + webView.settings.javaScriptEnabled = true + + loadPage() + + return root + } + + override fun onDestroyView() { + super.onDestroyView() + _binding = null + } + + private fun getURL(): String { + return "https://www.knmi.nl/nederland-nu/weer/verwachtingen" + } + + private fun refreshPage() { + val webView = binding.webView + webView.clearCache(false) + loadPage() + } + + private fun loadPage() { + val webView = binding.webView + val htmlBuilder = HtmlBuilder() + webView.loadData(htmlBuilder.buildHtmlPageWithLoadingMessage(), "text/html", "utf-8") + RetrieveWebPage().execute(getURL()) + } + + internal inner class RetrieveWebPage : AsyncTask() { + + // Retrieves the data from the URL using JSoup (async) + @Deprecated("Deprecated in Java") + override fun doInBackground(vararg urls: String): Document? { + try { + return Jsoup.connect(urls[0]).get() + } catch (e: Exception) { + return null + } + } + + // When complete: parses the result + @Deprecated("Deprecated in Java") + override fun onPostExecute(htmlDocument: Document?) { + // It may be that the user has already moved on to the next fragment + if (_binding == null) { + return + } + + val webView = binding.webView + val htmlBuilder = HtmlBuilder() + if (htmlDocument == null) { + webView.loadData(htmlBuilder.buildHtmPageWithLoadingError(), "text/html", "utf-8") + return + } + + val tableWrapperElement = htmlDocument.select("div.weather-map__table-wrp").firstOrNull() + if (tableWrapperElement == null){ + webView.loadData(htmlBuilder.buildHtmPageWithLoadingError(), "text/html", "utf-8") + return + } + + val tableData = getTableData(tableWrapperElement) + val htmlPageToShow = htmlBuilder.buildHtmlPageWithTables(tableData) + webView.loadData(htmlPageToShow, "text/html", "UTF-8") + } + + // Get the weather data per day of the week + private fun getTableData(tableWrapperElement: Element) : Array> { + val weatherPerDay = tableWrapperElement.select("li") + val tableData = Array>(weatherPerDay.size, { Array(15, {""}) }) + weatherPerDay.forEachIndexed { colIndex, column -> + var rowIndex = 0 + + val dayOfTheWeek = column.selectFirst("strong.weather-map__table-cell") + ?.text() + if (dayOfTheWeek != null) { + tableData[colIndex][rowIndex] = dayOfTheWeek + rowIndex++ + } + + column.select("span.weather-map__table-cell").forEach { rowItem -> + // If cell contains image, get the src link + val imageItem = rowItem.selectFirst("img") + if (imageItem != null) { + tableData[colIndex][rowIndex] = imageItem.attr("src") + rowIndex++ + } + else { + // Item contains just text; split into header and data, if applicable + rowItem.text().split(' ', ignoreCase = false, limit = 2).forEach { item -> + tableData[colIndex][rowIndex] = item + rowIndex++ + } + } + } + } + + return tableData + } + } + + internal inner class HtmlBuilder { + + // Width in pixels of column containing KNMI weather data + private val columnWidth get() = 110 + + // Image size in pixels + private val imageSize get() = 54 + + // Font size to be used in HTML; in pixels + private val fontSize get() = 14 + + // Row height used for every other row for aesthetic reasons; in pixels + private val paddedRowHeight get() = 24 + + fun buildHtmlPageWithTables(tableData: Array>) : String { + val columnsPerTable = calculateColumnsPerTable(tableData) + val tablesHtml = getHtmlTables(tableData, columnsPerTable) + + return getHtmlPageWithContent(tablesHtml) + } + + private fun calculateColumnsPerTable(tableData: Array>): Int { + val webView = binding.webView + val widthPx = Resources.getSystem().displayMetrics.widthPixels + val density = Resources.getSystem().displayMetrics.density + val effectiveWidth = floor((widthPx / density).toDouble()); + val usableWidth = effectiveWidth - (webView.marginStart + webView.marginEnd) / density + val columnsPerRow = floor(usableWidth / columnWidth).toInt() + + return min(columnsPerRow, tableData.size) + } + + private fun getHtmlTables(tableData: Array>, columnsPerTable: Int) : String { + val numberOfTables = ceil(tableData.size.toDouble() / columnsPerTable).toInt() + val numberOfRowsPerTable = tableData[0].size + var htmlTable = "" + var totalNumberOfColumns = tableData.size + + for (tableNumber in 0.. + + + """.trimMargin() + + for (row in 0..""" + var column = tableNumber * columnsPerTable + // Loop until either all columns for the current table have been processed, + // or all columns have already been processed + while (column < (tableNumber + 1 ) * columnsPerTable && column < totalNumberOfColumns) { + var content = tableData[column][row] + if (URLUtil.isValidUrl(content)) { + content = """""" + } + htmlTable += "$content" + + column++ + } + htmlTable += """""" + } + + htmlTable += "" + htmlTable += "

" + // Add additional spacing between tables + if (tableNumber < numberOfTables - 1) { + htmlTable += """
""" + } + } + + return htmlTable + } + + fun buildHtmlPageWithLoadingMessage() : String { + val loadingMessageHtml = "

" + getString(R.string.menu_knmi_text_loading) + "

" + """
""" + return getHtmlPageWithContent(loadingMessageHtml) + } + + fun buildHtmPageWithLoadingError() : String { + val errorMessageHtml = "

" + getString(R.string.menu_knmi_text_failed) + "

" + """
""" + return getHtmlPageWithContent(errorMessageHtml) + } + + 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") + var backgroundColor = "rgb(250, 250, 250)" + var textColor = "black" + if (darkMode == "dark_mode_yes") { + backgroundColor = "rgb(48, 48, 48)" // Android dark mode color + textColor = "rgb(193, 193, 193)" // Android dark mode color + } + + return """ + + + + """ + content + """ +

""".trimIndent() + getString(R.string.menu_knmi_text_source) + """

+ """.trimIndent() + } + } +} \ No newline at end of file diff --git a/app/src/main/java/foss/cnugteren/nlweer/ui/fragments/KnmiTextFragment.kt b/app/src/main/java/foss/cnugteren/nlweer/ui/fragments/KnmiTextFragment.kt index 612ef32..ac60762 100644 --- a/app/src/main/java/foss/cnugteren/nlweer/ui/fragments/KnmiTextFragment.kt +++ b/app/src/main/java/foss/cnugteren/nlweer/ui/fragments/KnmiTextFragment.kt @@ -61,13 +61,13 @@ class KnmiTextFragment : Fragment() { private fun loadPage() { val root = binding.root - val headers = arrayOf("Vandaag & Morgen", "Vooruitzichten", "", "Vooruitzichten lange termijn") + val headers = arrayOf("Vandaag & Morgen", "Vooruitzichten", "Vooruitzichten lange termijn") root.findViewById(R.id.textViewHeader0).text = headers[0] root.findViewById(R.id.textViewHeader1).text = headers[1] - root.findViewById(R.id.textViewHeader3).text = headers[3] + root.findViewById(R.id.textViewHeader2).text = headers[2] root.findViewById(R.id.textViewContent0).text = getString(R.string.menu_knmi_text_loading) root.findViewById(R.id.textViewContent1).text = getString(R.string.menu_knmi_text_loading) - root.findViewById(R.id.textViewContent3).text = getString(R.string.menu_knmi_text_loading) + root.findViewById(R.id.textViewContent2).text = getString(R.string.menu_knmi_text_loading) RetrieveWebPage().execute(getURL()) } @@ -84,11 +84,16 @@ class KnmiTextFragment : Fragment() { // When complete: parses the result override fun onPostExecute(htmlDocument: Document?) { + // It may be that the user has already moved on to the next fragment + if (_binding == null) { + return + } + val root = binding.root if (htmlDocument == null) { root.findViewById(R.id.textViewContent0).text = getString(R.string.menu_knmi_text_failed) root.findViewById(R.id.textViewContent1).text = getString(R.string.menu_knmi_text_failed) - root.findViewById(R.id.textViewContent3).text = getString(R.string.menu_knmi_text_failed) + root.findViewById(R.id.textViewContent2).text = getString(R.string.menu_knmi_text_failed) return } val contents = arrayOf("", "", "", "") @@ -114,32 +119,14 @@ class KnmiTextFragment : Fragment() { } } - // The icons/numbers week overview - if (index == 2) { - group.select("div.weather-map__table-wrp").forEach { element -> - element.select("li").forEach { column -> - var tableData = "" - column.select("span.weather-map__table-cell").forEachIndexed { index, item -> - if (index == 0) { - tableData += "[" + item.text() + "] " - } - else { - tableData += item.text() + " " - } - } - contents[2] += tableData + "\n\n" - } - } - } - // The long term report if (index == 3) { group.select("div.col-sm-12.col-md-7").forEach { element -> element.select("p").forEach { paragraph -> - contents[3] += paragraph.text() + "\n\n" + contents[2] += paragraph.text() + "\n\n" } element.select("span.meta").forEach { paragraph -> - contents[3] += "Laatste update: " + paragraph.text() + "\n\n" + contents[2] += "Laatste update: " + paragraph.text() + "\n\n" } } } @@ -149,8 +136,7 @@ class KnmiTextFragment : Fragment() { // Displays the found data root.findViewById(R.id.textViewContent0).text = contents[0].trimEnd() root.findViewById(R.id.textViewContent1).text = contents[1].trimEnd() - root.findViewById(R.id.textViewContent2).text = contents[2].trimEnd() - root.findViewById(R.id.textViewContent3).text = contents[3].trimEnd() + "\n\n" + root.findViewById(R.id.textViewContent2).text = contents[2].trimEnd() + "\n\n" } } -} \ No newline at end of file +} diff --git a/app/src/main/java/foss/cnugteren/nlweer/ui/fragments/SettingsFragment.kt b/app/src/main/java/foss/cnugteren/nlweer/ui/fragments/SettingsFragment.kt index 57c87d7..8532cc6 100644 --- a/app/src/main/java/foss/cnugteren/nlweer/ui/fragments/SettingsFragment.kt +++ b/app/src/main/java/foss/cnugteren/nlweer/ui/fragments/SettingsFragment.kt @@ -145,7 +145,11 @@ class SettingsFragment : PreferenceFragmentCompat(), defaultViewSelection.setDefaultValue(R.id.nav_knmi_rain_m1.toString()) } - override fun onSharedPreferenceChanged(sharedPreferences: SharedPreferences, key: String) { + override fun onSharedPreferenceChanged(sharedPreferences: SharedPreferences?, key: String?) { + if (sharedPreferences == null || key == null){ + return + } + val pref = findPreference(key) // If the value of the settings change, sets the new values as summaries diff --git a/app/src/main/res/drawable/menu_sixdayforecast.xml b/app/src/main/res/drawable/menu_sixdayforecast.xml new file mode 100644 index 0000000..9c03092 --- /dev/null +++ b/app/src/main/res/drawable/menu_sixdayforecast.xml @@ -0,0 +1,12 @@ + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_knmi_sixdayforecast.xml b/app/src/main/res/layout/fragment_knmi_sixdayforecast.xml new file mode 100644 index 0000000..25aeac7 --- /dev/null +++ b/app/src/main/res/layout/fragment_knmi_sixdayforecast.xml @@ -0,0 +1,33 @@ + + + + + + + + + + + + diff --git a/app/src/main/res/layout/fragment_knmi_text.xml b/app/src/main/res/layout/fragment_knmi_text.xml index 4705f4d..35a3f76 100644 --- a/app/src/main/res/layout/fragment_knmi_text.xml +++ b/app/src/main/res/layout/fragment_knmi_text.xml @@ -14,18 +14,6 @@ android:layout_height="wrap_content" android:scrollbars="horizontal"> - - + app:layout_constraintTop_toTopOf="parent" /> + app:layout_constraintTop_toBottomOf="@+id/textViewHeader2" /> + app:layout_constraintTop_toBottomOf="@+id/textViewContent2"/> diff --git a/app/src/main/res/menu/activity_main_drawer.xml b/app/src/main/res/menu/activity_main_drawer.xml index 6feb21a..b9510bd 100644 --- a/app/src/main/res/menu/activity_main_drawer.xml +++ b/app/src/main/res/menu/activity_main_drawer.xml @@ -106,6 +106,10 @@ android:id="@+id/nav_knmi_text" android:icon="@drawable/menu_weather_report" android:title="@string/menu_knmi_text" /> + + diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index 7e88d1b..479d627 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -41,6 +41,7 @@ Bulletin météo Source:\nhttps://www.knmi.nl/nederland-nu/weer/verwachtingen + Prévisions à 6 jours En cours de chargement… Les données n\'ont pas pu être chargées Pluim @@ -118,7 +119,7 @@ Icônes d\'application et de menu Icône principale de l\'application: Copyright Mozilla, CC BY 4.0, https://commons.wikimedia.org/w/index.php?curid=59726384\n \nIcône de la lune: Copyright OOjs UI Team, licence MIT, https://phabricator.wikimedia.org/diffusion/GOJU/browse/master/LICENSE-MIT\n -\nIcônes de soleil, vent, plui, neige, vitesse du vent, grêle, nuage, bruine, graphique, humidité, brouillard, alerte, flèche, satellite et rapport: Copyright Icon Fonts, CC BY 3.0, http://www.onlinewebfonts.com/icon\n +\nIcônes de soleil, vent, plui, neige, vitesse du vent, grêle, nuage, bruine, graphique, humidité, brouillard, alerte, flèche, satellite, prévisions et rapport: Copyright Icon Fonts, CC BY 3.0, http://www.onlinewebfonts.com/icon\n \nIcônes de température, de isobars et de lever du soleil: Icônes créées par Hirschwolf et Freepik sur www.flaticon.com Version de NLWeer diff --git a/app/src/main/res/values-nl/strings.xml b/app/src/main/res/values-nl/strings.xml index 0955f66..ac26aa8 100644 --- a/app/src/main/res/values-nl/strings.xml +++ b/app/src/main/res/values-nl/strings.xml @@ -42,6 +42,7 @@ Weerbericht Bron:\nhttps://www.knmi.nl/nederland-nu/weer/verwachtingen + 6-Daagse verwachting Data wordt geladen… Data kon niet geladen worden Pluim @@ -119,7 +120,7 @@ App- en menu-iconen Appicoon: Copyright Mozilla, CC BY 4.0, https://commons.wikimedia.org/w/index.php?curid=59726384\n \nMaanicoon: Copyright OOjs UI Team, MIT licentie, https://phabricator.wikimedia.org/diffusion/GOJU/browse/master/LICENSE-MIT\n -\nZon-, wind-, regen-, sneeuw-, windsnelheid-, hagel-, wolk-, miezer-, grafiek-, vochtigheid-, mist-, waarschuwing-, pijl-, satelliet- en weerberichticonen: Copyright Icon Fonts, CC BY 3.0, http://www.onlinewebfonts.com/icon\n +\nZon-, wind-, regen-, sneeuw-, windsnelheid-, hagel-, wolk-, miezer-, grafiek-, vochtigheid-, mist-, waarschuwing-, pijl-, satelliet-, 6-daagse verwachting- en weerberichticonen: Copyright Icon Fonts, CC BY 3.0, http://www.onlinewebfonts.com/icon\n \nTemperatuur-, isolijn- en zonsopgangiconen: Gemaakt door Hirschwolf en Freepik van www.flaticon.com NLWeer versie-informatie diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index fc18edd..7e06721 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -41,6 +41,7 @@ Weather report Source:\nhttps://www.knmi.nl/nederland-nu/weer/verwachtingen + 6-Day forecast Data is being loaded… Data could not be loaded Pluim @@ -118,7 +119,7 @@ App and menu icons Main app icon: Copyright by Mozilla, CC BY 4.0, https://commons.wikimedia.org/w/index.php?curid=59726384\n \nMoon icon: Copyright OOjs UI Team, MIT License, https://phabricator.wikimedia.org/diffusion/GOJU/browse/master/LICENSE-MIT\n -\nSun, wind, rain, snow, wind speed, hail, cloud, drizzle, graph, humidity, fog, warning, arrow, satellite, and report icons: Copyright by Icon Fonts, CC BY 3.0, http://www.onlinewebfonts.com/icon\n +\nSun, wind, rain, snow, wind speed, hail, cloud, drizzle, graph, humidity, fog, warning, arrow, satellite, 6-day forecast, and report icons: Copyright by Icon Fonts, CC BY 3.0, http://www.onlinewebfonts.com/icon\n \nTemperature, isobar, and sunrise icons: Icons made by Hirschwolf and Freepik from www.flaticon.com NLWeer version info