Skip to content

Commit 087a507

Browse files
Refactor widget and worker to use UserPreferencesRepository
Refactored DayAheadWidget and WidgetUpdateWorker to use UserPreferencesRepository instead of accessing SharedPreferences directly. This improves architectural consistency and centralizes data access logic. Changes: - Updated UserPreferencesRepository to expose summary flow and hasLocation method. - Updated DayAheadWidget to inject UserPreferencesRepository and collect summary flow. - Updated WidgetUpdateWorker to inject UserPreferencesRepository and use it for location check, preference retrieval, and summary saving.
1 parent 8311584 commit 087a507

File tree

3 files changed

+22
-13
lines changed

3 files changed

+22
-13
lines changed

app/src/main/java/com/example/theloop/DayAheadWidget.kt

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import android.appwidget.AppWidgetManager
44
import android.appwidget.AppWidgetProvider
55
import android.content.Context
66
import android.widget.RemoteViews
7+
import com.example.theloop.data.repository.UserPreferencesRepository
78
import com.example.theloop.data.repository.WeatherRepository
89
import com.example.theloop.models.WeatherResponse
910
import com.example.theloop.utils.AppConstants
@@ -21,14 +22,16 @@ class DayAheadWidget : AppWidgetProvider() {
2122
@Inject
2223
lateinit var weatherRepository: WeatherRepository
2324

25+
@Inject
26+
lateinit var userPreferencesRepository: UserPreferencesRepository
27+
2428
override fun onUpdate(context: Context, appWidgetManager: AppWidgetManager, appWidgetIds: IntArray) {
2529
val pendingResult = goAsync()
2630

2731
CoroutineScope(Dispatchers.IO).launch {
2832
try {
2933
val weather = weatherRepository.weatherData.first()
30-
val summary = context.getSharedPreferences(AppConstants.PREFS_NAME, Context.MODE_PRIVATE)
31-
.getString(AppConstants.KEY_SUMMARY_CACHE, context.getString(R.string.widget_default_summary))
34+
val summary = userPreferencesRepository.summary.first()
3235

3336
for (appWidgetId in appWidgetIds) {
3437
updateAppWidget(context, appWidgetManager, appWidgetId, weather, summary)

app/src/main/java/com/example/theloop/WidgetUpdateWorker.kt

Lines changed: 8 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import androidx.work.CoroutineWorker
66
import androidx.work.WorkerParameters
77
import com.example.theloop.data.repository.CalendarRepository
88
import com.example.theloop.data.repository.NewsRepository
9+
import com.example.theloop.data.repository.UserPreferencesRepository
910
import com.example.theloop.data.repository.WeatherRepository
1011
import com.example.theloop.utils.AppConstants
1112
import com.example.theloop.utils.SummaryUtils
@@ -24,23 +25,19 @@ class WidgetUpdateWorker @AssistedInject constructor(
2425
@Assisted workerParams: WorkerParameters,
2526
private val weatherRepo: WeatherRepository,
2627
private val newsRepo: NewsRepository,
27-
private val calendarRepo: CalendarRepository
28+
private val calendarRepo: CalendarRepository,
29+
private val userPreferencesRepository: UserPreferencesRepository
2830
) : CoroutineWorker(appContext, workerParams) {
2931

3032
override suspend fun doWork(): Result {
31-
val prefs = applicationContext.getSharedPreferences(AppConstants.PREFS_NAME, Context.MODE_PRIVATE)
32-
val latStr = prefs.getString(AppConstants.KEY_LATITUDE, null)
33-
val lonStr = prefs.getString(AppConstants.KEY_LONGITUDE, null)
34-
val unit = prefs.getString(AppConstants.KEY_TEMP_UNIT, AppConstants.DEFAULT_TEMP_UNIT) ?: AppConstants.DEFAULT_TEMP_UNIT
35-
val userName = prefs.getString(AppConstants.KEY_USER_NAME, "User") ?: "User"
36-
37-
if (latStr == null || lonStr == null) {
33+
if (!userPreferencesRepository.hasLocation()) {
3834
return Result.success()
3935
}
4036

4137
return try {
42-
val lat = latStr.toDouble()
43-
val lon = lonStr.toDouble()
38+
val (lat, lon) = userPreferencesRepository.location.first()
39+
val unit = userPreferencesRepository.tempUnit.first()
40+
val userName = userPreferencesRepository.userName.first()
4441

4542
// Update Data (saves to DB)
4643
val weatherSuccess = weatherRepo.refresh(lat, lon, unit)
@@ -66,7 +63,7 @@ class WidgetUpdateWorker @AssistedInject constructor(
6663
} else null
6764

6865
if (summary != null) {
69-
prefs.edit().putString(AppConstants.KEY_SUMMARY_CACHE, summary).apply()
66+
userPreferencesRepository.saveSummary(summary)
7067
}
7168

7269
// Trigger widget update

app/src/main/java/com/example/theloop/data/repository/UserPreferencesRepository.kt

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package com.example.theloop.data.repository
22

33
import android.content.Context
44
import android.content.SharedPreferences
5+
import com.example.theloop.R
56
import com.example.theloop.utils.AppConstants
67
import dagger.hilt.android.qualifiers.ApplicationContext
78
import kotlinx.coroutines.channels.awaitClose
@@ -36,6 +37,10 @@ class UserPreferencesRepository @Inject constructor(
3637
.map { prefs.getString(AppConstants.KEY_USER_NAME, "User") ?: "User" }
3738
.distinctUntilChanged()
3839

40+
val summary: Flow<String> = prefsChangeFlow
41+
.map { prefs.getString(AppConstants.KEY_SUMMARY_CACHE, context.getString(R.string.widget_default_summary)) ?: context.getString(R.string.widget_default_summary) }
42+
.distinctUntilChanged()
43+
3944
val location: Flow<Pair<Double, Double>> = prefsChangeFlow
4045
.map {
4146
val latStr = prefs.getString(AppConstants.KEY_LATITUDE, AppConstants.DEFAULT_LATITUDE.toString())
@@ -57,6 +62,10 @@ class UserPreferencesRepository @Inject constructor(
5762
prefs.edit().putString(AppConstants.KEY_SUMMARY_CACHE, summary).apply()
5863
}
5964

65+
fun hasLocation(): Boolean {
66+
return prefs.contains(AppConstants.KEY_LATITUDE) && prefs.contains(AppConstants.KEY_LONGITUDE)
67+
}
68+
6069
// Helper to get current location synchronously if needed (though Flow is better)
6170
fun getLocationSync(): Pair<Double, Double> {
6271
val latStr = prefs.getString(AppConstants.KEY_LATITUDE, AppConstants.DEFAULT_LATITUDE.toString())

0 commit comments

Comments
 (0)