Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
68 commits
Select commit Hold shift + click to select a range
102efd6
gradle: update dependencies
thewizrd May 17, 2026
1cb489e
gradle: AGP 9.2.1
thewizrd May 18, 2026
9c1e11f
gradle: update for nonTransitiveRClass
thewizrd May 19, 2026
217cebe
nongms: fix build
thewizrd May 21, 2026
88f9126
SimpleWeather: v5.13.0-build15
thewizrd May 21, 2026
01235bb
wearapp: enable all refresh intervals for nongms
thewizrd May 21, 2026
4742a73
weather-api: calculate dewpoint and feels like temp if data unavailable
thewizrd May 21, 2026
6cf3b4b
widgets: add new 1x1 for any WeatherDetailsType
thewizrd May 26, 2026
c3c058c
radar: add support for WeatherAPI maps
thewizrd May 26, 2026
71f90f0
radar: enable interactions for all
thewizrd May 26, 2026
41383a8
WeatherAPI: reorganize providers
thewizrd May 26, 2026
107d08c
weather: add snow to minutely forecast
thewizrd May 30, 2026
672a0c9
GoogleWeather: add minutely and alerts support
thewizrd May 30, 2026
0bd2a87
weather-api: correct date on alerts
thewizrd May 30, 2026
532de0b
weather-api: add support for Open-Meteo
thewizrd May 31, 2026
373ca14
HourlyForecast: remove wind data
thewizrd Jun 1, 2026
3e2dbd1
ForecastsNowViewModel: filter out past minutely data
thewizrd Jun 1, 2026
c1ab38e
gradle: java 21
thewizrd Jun 1, 2026
13dcd61
gradle: update dependencies
thewizrd Jun 1, 2026
3363f94
wear: fix precipitation panel
thewizrd Jun 1, 2026
627b102
WeatherNowScreen: layout rearrange testing
thewizrd Jun 1, 2026
06de1ac
SimpleWeather: v5.14.0-build0
thewizrd Jun 1, 2026
9eb08c0
SimpleWeather: v5.14.0-build1
thewizrd Jun 3, 2026
408799c
gradle: update dependencies
thewizrd Jun 6, 2026
7c37352
OpenMeteoWeatherProvider: fix
thewizrd Jun 7, 2026
097a437
WeatherUnlockedProvider: services will be shutting down June 30th, 2026
thewizrd Jun 7, 2026
4591ed9
WeatherNowScreen: revert layout changes
thewizrd Jun 7, 2026
577ea49
WeatherApiProvider: astro fixes
thewizrd Jun 7, 2026
d1c6220
gradle: targetSdk 37 (Android 17)
thewizrd Jun 7, 2026
056b53c
SimpleWeather: v5.14.0-build2
thewizrd Jun 7, 2026
d69f9a3
SimpleWeather: v5.14.0-build3
thewizrd Jun 7, 2026
dc02361
WeatherApiProvider: additional data
thewizrd Jun 8, 2026
ac81178
SimpleWeather: v5.14.0-build4
thewizrd Jun 8, 2026
b9a2e58
weather-api: update for missing icons
thewizrd Jun 10, 2026
4acb2bd
SimpleWeather: v5.14.0-build5
thewizrd Jun 10, 2026
2229daf
SimpleWeather: roundup bug fixes
thewizrd Jun 16, 2026
6fc27e6
WeatherIconicProvider: update icons
thewizrd Jun 19, 2026
6ce5313
app: update icon usage
thewizrd Jun 20, 2026
a4a17d1
weathernow: enable animations where possible
thewizrd Jun 24, 2026
18295a9
analytics: log selected icon provider
thewizrd Jun 24, 2026
9d7ea23
icons: add visibility and aq
thewizrd Jun 27, 2026
939f469
icons: reorder
thewizrd Jun 27, 2026
cd0cf18
icons: cleanup
thewizrd Jun 27, 2026
8e7f189
MeteoconsIconsProvider: add line variant
thewizrd Jun 28, 2026
a42c0b0
WeatherApiProvider: correct smoky haze icon
thewizrd Jun 28, 2026
182f24d
WeatherProviderImpl: update uv calculation from aqicn
thewizrd Jun 28, 2026
afa6363
wearapp: update icon usage
thewizrd Jun 28, 2026
1421cc3
wearapp: update icon usage in complications
thewizrd Jun 28, 2026
e7cd192
RemoteConfig: default to OpenMeteo if location is within supported mo…
thewizrd Jun 28, 2026
e924cf9
gradle: update dependencies
thewizrd Jun 28, 2026
e487568
SimpleWeather: v5.14.0-build6
thewizrd Jun 28, 2026
475b11d
wearapp: update ranged complication bounds
thewizrd Jun 29, 2026
b1a64b4
SimpleWeather: v5.14.0-build7
thewizrd Jun 29, 2026
b484a6f
JSONParser: fix parsing issue with floats
thewizrd Jun 30, 2026
4c05c8c
SimpleWeather: v5.14.0-build8
thewizrd Jun 30, 2026
9b542c4
MeteoFranceProvider: update api
thewizrd Jul 4, 2026
39fdfba
OpenWeatherMapProvider: nullables
thewizrd Jul 4, 2026
78fd25e
gradle: update dependencies
thewizrd Jul 4, 2026
8d3b63e
SimpleWeather: v5.14.0-build9
thewizrd Jul 4, 2026
d176cb6
icons: fix google weather icon compatibility
thewizrd Jul 17, 2026
19ea5a2
bug fixes
thewizrd Jul 17, 2026
111c41c
gradle: update dependencies
thewizrd Jul 17, 2026
c72fc93
SimpleWeather: v5.14.0-build10
thewizrd Jul 17, 2026
3101a75
RainViewerViewProvider: max zoom level is 7
thewizrd Jul 26, 2026
2dd08b6
gradle: update dependencies
thewizrd Jul 27, 2026
29d556d
weatherkit: adjust alert dates
thewizrd Jul 27, 2026
87f7cf8
SimpleWeather: v5.14.0-build11
thewizrd Jul 27, 2026
cf0366a
Merge branch 'public' into feature/merge
thewizrd Jul 27, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
3 changes: 2 additions & 1 deletion .gitignore
Original file line numberDiff line numberDiff line change
Expand Up@@ -35,4 +35,5 @@ API_KEY.txt
google-services.json
/.privado/
/.detekt
/.kotlin
/.kotlin
/.skills
16 changes: 8 additions & 8 deletions app/build.gradle
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,7 @@
plugins {
id 'com.android.application'
id 'androidx.navigation.safeargs'
id 'kotlin-android'
id 'kotlin-kapt'
id 'com.android.legacy-kapt'
id 'com.google.devtools.ksp'
}

Expand All@@ -18,11 +17,11 @@ android {
targetSdkVersion libs.versions.targetSdkVersion.get().toInteger()
// NOTE: Version Code Format (TargetSDK, Version Name, Build Number, Variant Code (Android: 0, WearOS: 1)
// ex) 345100131 = (34, 5.10, 013, 0)
versionCode 365130140
versionName "5.13.0"
versionCode 375140110
versionName "5.14.0"

vectorDrawables {
useSupportLibrary true
useSupportLibrary = true
}
}

Expand All@@ -47,18 +46,19 @@ android {
dataBinding true
viewBinding true
buildConfig true
resValues true
}

compileOptions {
// Flag to enable support for the new language APIs
coreLibraryDesugaringEnabled true
// Sets Java compatibility to Java 8
sourceCompatibility JavaVersion.VERSION_17
targetCompatibility JavaVersion.VERSION_17
sourceCompatibility JavaVersion.VERSION_21
targetCompatibility JavaVersion.VERSION_21
}

kotlin {
jvmToolchain(17)
jvmToolchain(21)
}

sourceSets {
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -682,6 +682,17 @@ class UnitTests {
settingsManager.setPersonalKey(WeatherAPI.GOOGLE, false)
}

@Throws(WeatherException::class)
@Test
fun getOpenMeteoWeather() {
runBlocking(Dispatchers.Default) {
val provider = weatherModule.weatherManager.getWeatherProvider(WeatherAPI.OPENMETEO)
val weather =
getWeather(provider, Coordinate(52.52, 13.41)) // ~ Berlin
assertTrue(weather.isValid && WeatherUiModel(weather).isValid)
}
}

@Throws(WeatherException::class)
@Test
fun getGooglePollen() {
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -12,20 +12,23 @@ import androidx.test.ext.junit.runners.AndroidJUnit4
import com.thewizrd.common.CommonModule
import com.thewizrd.common.commonModule
import com.thewizrd.common.controls.WeatherUiModel
import com.thewizrd.shared_resources.*
import com.thewizrd.shared_resources.AppState
import com.thewizrd.shared_resources.ApplicationLib
import com.thewizrd.shared_resources.SharedModule
import com.thewizrd.shared_resources.appLib
import com.thewizrd.shared_resources.di.settingsManager
import com.thewizrd.shared_resources.exceptions.WeatherException
import com.thewizrd.shared_resources.locationdata.LocationData
import com.thewizrd.shared_resources.locationdata.WeatherLocationProvider
import com.thewizrd.shared_resources.locationdata.toLocationData
import com.thewizrd.shared_resources.preferences.SettingsManager
import com.thewizrd.shared_resources.sharedDeps
import com.thewizrd.shared_resources.utils.Coordinate
import com.thewizrd.shared_resources.utils.DateTimeUtils
import com.thewizrd.shared_resources.utils.JSONParser
import com.thewizrd.shared_resources.weatherdata.WeatherAPI
import com.thewizrd.shared_resources.weatherdata.WeatherProvider
import com.thewizrd.shared_resources.weatherdata.model.Weather
import com.thewizrd.simpleweather.viewmodels.WeatherNowViewModel
import com.thewizrd.weather_api.aqicn.AQICNProvider
import com.thewizrd.weather_api.google.location.getFromLocationAsync
import com.thewizrd.weather_api.google.location.getFromLocationNameAsync
Expand All@@ -41,15 +44,18 @@ import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.runBlocking
import kotlinx.coroutines.withContext
import org.junit.After
import org.junit.Assert.*
import org.junit.Assert.assertEquals
import org.junit.Assert.assertFalse
import org.junit.Assert.assertNotNull
import org.junit.Assert.assertTrue
import org.junit.Before
import org.junit.Test
import org.junit.runner.RunWith
import java.io.IOException
import java.time.Duration
import java.time.ZonedDateTime
import java.time.format.DateTimeFormatter
import java.util.*
import java.util.Locale

@RunWith(AndroidJUnit4::class)
class UnitTests {
Expand DownExpand Up@@ -546,4 +552,15 @@ class UnitTests {
assertTrue(weather.isValid && WeatherUiModel(weather).isValid)
}
}

@Throws(WeatherException::class)
@Test
fun getOpenMeteoWeather() {
runBlocking(Dispatchers.Default) {
val provider = weatherModule.weatherManager.getWeatherProvider(WeatherAPI.OPENMETEO)
val weather =
getWeather(provider, Coordinate(52.52, 13.41)) // ~ Berlin
assertTrue(weather.isValid && WeatherUiModel(weather).isValid)
}
}
}
Original file line numberDiff line numberDiff line change
Expand Up@@ -9,6 +9,7 @@ import com.google.firebase.remoteconfig.ConfigUpdate
import com.google.firebase.remoteconfig.ConfigUpdateListener
import com.google.firebase.remoteconfig.FirebaseRemoteConfig
import com.google.firebase.remoteconfig.FirebaseRemoteConfigException
import com.thewizrd.shared_resources.R as sharedRes
import com.thewizrd.shared_resources.remoteconfig.remoteConfigService
import com.thewizrd.shared_resources.utils.AnalyticsProps
import com.thewizrd.shared_resources.utils.ContextUtils.isLargeTablet
Expand DownExpand Up@@ -38,7 +39,7 @@ object FirebaseConfigurator {
isCrashlyticsCollectionEnabled = true
sendUnsentReports()
}
FirebaseRemoteConfig.getInstance().setDefaultsAsync(R.xml.remote_config_defaults)
FirebaseRemoteConfig.getInstance().setDefaultsAsync(sharedRes.xml.remote_config_defaults)

if (!BuildConfig.DEBUG) {
Logger.registerLogger(CrashlyticsLoggingTree())
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -32,6 +32,7 @@ import com.thewizrd.simpleweather.utils.NavigationUtils.safeNavigate
import kotlinx.coroutines.launch
import kotlinx.coroutines.tasks.await
import timber.log.Timber
import com.thewizrd.extras.R as extrasRes

fun initializeExtras() {
extrasModule.initialize()
Expand DownExpand Up@@ -84,7 +85,7 @@ fun BaseSettingsFragment.navigateToPremiumFragment() {
showSnackbar(
Snackbar.make(
rootView.context,
R.string.message_premium_required,
extrasRes.string.message_premium_required,
Snackbar.Duration.SHORT
),
null
Expand All@@ -102,7 +103,7 @@ fun SettingsFragment.IconsFragment.navigateUnsupportedIconPack() {
showSnackbar(
Snackbar.make(
rootView.context,
R.string.message_premium_required,
extrasRes.string.message_premium_required,
Snackbar.Duration.SHORT
),
null
Expand All@@ -124,7 +125,7 @@ fun isPremiumSupported(): Boolean {
}

fun isRadarInteractionEnabled(): Boolean {
return extrasModule.isAtLeastProEnabled()
return true
}

fun areNotificationExtrasEnabled(): Boolean {
Expand All@@ -133,8 +134,8 @@ fun areNotificationExtrasEnabled(): Boolean {

fun SettingsFragment.createPremiumPreference(): Preference {
val premiumPref = Preference(requireContext()).apply {
title = context.getString(R.string.pref_title_premium)
summary = context.getString(R.string.pref_summary_premium)
title = context.getString(extrasRes.string.pref_title_premium)
summary = context.getString(extrasRes.string.pref_summary_premium)
setIcon(R.drawable.ic_star_24dp)
order = 0
}
Expand All@@ -147,7 +148,7 @@ fun SettingsFragment.createPremiumPreference(): Preference {
showSnackbar(
Snackbar.make(
rootView.context,
R.string.message_premium_required,
extrasRes.string.message_premium_required,
Snackbar.Duration.SHORT
),
null
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -333,7 +333,7 @@ class RainViewerViewProvider(context: Context, rootView: ViewGroup) : MapTileRad
*/
private fun checkTileExists(x: Int, y: Int, zoom: Int): Boolean {
val minZoom = MIN_ZOOM_LEVEL
val maxZoom = MAX_ZOOM_LEVEL
val maxZoom = 7

return zoom in minZoom..maxZoom
}
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -20,6 +20,7 @@ import com.thewizrd.shared_resources.utils.Coordinate
import com.thewizrd.shared_resources.utils.DateTimeUtils
import com.thewizrd.shared_resources.weatherdata.WeatherAPI
import com.thewizrd.simpleweather.databinding.RadarAnimateContainerBinding
import com.thewizrd.simpleweather.extras.isRadarInteractionEnabled
import com.thewizrd.simpleweather.radar.CachingUrlTileProvider
import com.thewizrd.simpleweather.radar.MapTileRadarViewProvider
import com.thewizrd.weather_api.keys.Keys
Expand DownExpand Up@@ -88,7 +89,7 @@ class TomorrowIoRadarViewProvider(context: Context, rootView: ViewGroup) :

override fun updateRadarView() {
radarContainerBinding!!.radarToolbar.visibility =
if (interactionsEnabled()/* && isRadarInteractionEnabled()*/) View.VISIBLE else View.GONE
if (interactionsEnabled() && isRadarInteractionEnabled()) View.VISIBLE else View.GONE
mapView.getMapAsync(this)
}

Expand Down
Loading