From d5f9c24da467b29b5b9031c98c6e2f9aab904954 Mon Sep 17 00:00:00 2001 From: Alex Baker Date: Thu, 17 Oct 2024 00:18:23 -0500 Subject: [PATCH] Check if watch is connected before refreshing --- .../java/org/tasks/injection/FlavorModule.kt | 13 ++++- .../java/org/tasks/injection/FlavorModule.kt | 39 +++++++++++++++ .../java/org/tasks/wear/WearDataService.kt | 11 ----- .../java/org/tasks/wear/WearRefresherImpl.kt | 47 +++++++++++++++++++ .../java/org/tasks/wear/WearService.kt | 27 ----------- .../org/tasks/receivers/RefreshReceiver.kt | 5 +- .../main/java/org/tasks/wear/WearRefresher.kt | 5 ++ 7 files changed, 107 insertions(+), 40 deletions(-) create mode 100644 app/src/googleplay/java/org/tasks/wear/WearRefresherImpl.kt create mode 100644 app/src/main/java/org/tasks/wear/WearRefresher.kt diff --git a/app/src/generic/java/org/tasks/injection/FlavorModule.kt b/app/src/generic/java/org/tasks/injection/FlavorModule.kt index 0f85979f3..2260ffbc1 100644 --- a/app/src/generic/java/org/tasks/injection/FlavorModule.kt +++ b/app/src/generic/java/org/tasks/injection/FlavorModule.kt @@ -4,7 +4,13 @@ import dagger.Module import dagger.Provides import dagger.hilt.InstallIn import dagger.hilt.components.SingletonComponent -import org.tasks.location.* +import org.tasks.location.Geocoder +import org.tasks.location.GeocoderNominatim +import org.tasks.location.LocationService +import org.tasks.location.LocationServiceAndroid +import org.tasks.location.MapFragment +import org.tasks.location.OsmMapFragment +import org.tasks.wear.WearRefresher @Module @InstallIn(SingletonComponent::class) @@ -17,4 +23,9 @@ class FlavorModule { @Provides fun getGeocoder(nominatim: GeocoderNominatim): Geocoder = nominatim + + @Provides + fun getWearRefresher(): WearRefresher = object : WearRefresher { + override suspend fun refresh() = Unit + } } \ No newline at end of file diff --git a/app/src/googleplay/java/org/tasks/injection/FlavorModule.kt b/app/src/googleplay/java/org/tasks/injection/FlavorModule.kt index 61c4f4ce0..c009a4646 100644 --- a/app/src/googleplay/java/org/tasks/injection/FlavorModule.kt +++ b/app/src/googleplay/java/org/tasks/injection/FlavorModule.kt @@ -1,10 +1,16 @@ package org.tasks.injection +import android.content.Context +import com.google.android.horologist.annotations.ExperimentalHorologistApi +import com.google.android.horologist.data.WearDataLayerRegistry +import com.google.android.horologist.datalayer.phone.PhoneDataLayerAppHelper import dagger.Lazy import dagger.Module import dagger.Provides import dagger.hilt.InstallIn +import dagger.hilt.android.qualifiers.ApplicationContext import dagger.hilt.components.SingletonComponent +import kotlinx.coroutines.CoroutineScope import org.tasks.location.Geocoder import org.tasks.location.GeocoderMapbox import org.tasks.location.GoogleMapFragment @@ -14,6 +20,9 @@ import org.tasks.location.LocationServiceGooglePlay import org.tasks.location.MapFragment import org.tasks.location.OsmMapFragment import org.tasks.play.PlayServices +import org.tasks.wear.LastUpdateSerializer +import org.tasks.wear.WearRefresher +import org.tasks.wear.WearRefresherImpl @Module @InstallIn(SingletonComponent::class) @@ -34,4 +43,34 @@ class FlavorModule { @Provides fun getGeocoder(mapbox: GeocoderMapbox): Geocoder = mapbox + + @OptIn(ExperimentalHorologistApi::class) + @Provides + fun wearDataLayerRegistry( + @ApplicationContext applicationContext: Context, + @ApplicationScope coroutineScope: CoroutineScope, + ): WearDataLayerRegistry = WearDataLayerRegistry.fromContext( + application = applicationContext, + coroutineScope = coroutineScope, + ).apply { + registerSerializer(LastUpdateSerializer) + } + + @OptIn(ExperimentalHorologistApi::class) + @Provides + fun phoneDataLayerAppHelper( + @ApplicationContext applicationContext: Context, + wearDataLayerRegistry: WearDataLayerRegistry, + ) = PhoneDataLayerAppHelper( + context = applicationContext, + registry = wearDataLayerRegistry, + ) + + @OptIn(ExperimentalHorologistApi::class) + @Provides + fun getWearRefresher( + phoneDataLayerAppHelper: PhoneDataLayerAppHelper, + wearDataLayerRegistry: WearDataLayerRegistry, + @ApplicationScope scope: CoroutineScope, + ): WearRefresher = WearRefresherImpl(phoneDataLayerAppHelper, wearDataLayerRegistry, scope) } \ No newline at end of file diff --git a/app/src/googleplay/java/org/tasks/wear/WearDataService.kt b/app/src/googleplay/java/org/tasks/wear/WearDataService.kt index 0ffa5765c..8011b20f7 100644 --- a/app/src/googleplay/java/org/tasks/wear/WearDataService.kt +++ b/app/src/googleplay/java/org/tasks/wear/WearDataService.kt @@ -1,16 +1,12 @@ package org.tasks.wear -import androidx.datastore.core.DataStore import androidx.lifecycle.lifecycleScope import com.google.android.horologist.annotations.ExperimentalHorologistApi -import com.google.android.horologist.data.ProtoDataStoreHelper.protoDataStore import com.google.android.horologist.data.WearDataLayerRegistry import com.google.android.horologist.datalayer.grpc.server.BaseGrpcDataService import com.todoroo.astrid.dao.TaskDao import com.todoroo.astrid.service.TaskCompleter import dagger.hilt.android.AndroidEntryPoint -import org.tasks.GrpcProto.LastUpdate -import org.tasks.LocalBroadcastManager import org.tasks.WearServiceGrpcKt import org.tasks.preferences.Preferences import javax.inject.Inject @@ -22,11 +18,6 @@ class WearDataService : BaseGrpcDataService by lazy { - registry.protoDataStore(lifecycleScope) - } override val registry: WearDataLayerRegistry by lazy { WearDataLayerRegistry.fromContext( @@ -42,8 +33,6 @@ class WearDataService : BaseGrpcDataService + Timber.d("Connected nodes: ${nodes.joinToString()}") + watchConnected = nodes.isNotEmpty() + } + .launchIn(scope) + } + + private val lastUpdate: DataStore by lazy { + registry.protoDataStore(scope) + } + + override suspend fun refresh() { + if (watchConnected) { + lastUpdate.updateData { + it.copy { + now = System.currentTimeMillis() + } + } + } + } +} \ No newline at end of file diff --git a/app/src/googleplay/java/org/tasks/wear/WearService.kt b/app/src/googleplay/java/org/tasks/wear/WearService.kt index 5eb75ca5b..4f1d5f497 100644 --- a/app/src/googleplay/java/org/tasks/wear/WearService.kt +++ b/app/src/googleplay/java/org/tasks/wear/WearService.kt @@ -1,22 +1,15 @@ package org.tasks.wear -import android.content.Intent -import androidx.datastore.core.DataStore import com.todoroo.astrid.dao.TaskDao import com.todoroo.astrid.service.TaskCompleter -import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers -import kotlinx.coroutines.launch import kotlinx.coroutines.withContext -import org.tasks.GrpcProto import org.tasks.GrpcProto.CompleteTaskRequest import org.tasks.GrpcProto.CompleteTaskResponse import org.tasks.GrpcProto.GetTasksRequest import org.tasks.GrpcProto.Task import org.tasks.GrpcProto.Tasks -import org.tasks.LocalBroadcastManager import org.tasks.WearServiceGrpcKt -import org.tasks.copy import org.tasks.filters.MyTasksFilter import org.tasks.preferences.Preferences @@ -24,28 +17,8 @@ class WearService( private val taskDao: TaskDao, private val preferences: Preferences, private val taskCompleter: TaskCompleter, - private val lastUpdate: DataStore, - localBroadcastManager: LocalBroadcastManager, ) : WearServiceGrpcKt.WearServiceCoroutineImplBase() { - private val scope = CoroutineScope(Dispatchers.IO) - - init { - localBroadcastManager.registerRefreshReceiver( - object : android.content.BroadcastReceiver() { - override fun onReceive(context: android.content.Context?, intent: Intent?) { - scope.launch { - lastUpdate.updateData { - it.copy { - now = System.currentTimeMillis() - } - } - } - } - } - ) - } - override suspend fun getTasks(request: GetTasksRequest): Tasks { return Tasks.newBuilder() .addAllTasks(getTasks()) diff --git a/app/src/main/java/org/tasks/receivers/RefreshReceiver.kt b/app/src/main/java/org/tasks/receivers/RefreshReceiver.kt index 794181246..6e8998100 100644 --- a/app/src/main/java/org/tasks/receivers/RefreshReceiver.kt +++ b/app/src/main/java/org/tasks/receivers/RefreshReceiver.kt @@ -6,12 +6,13 @@ import com.todoroo.astrid.provider.Astrid2TaskProvider import dagger.hilt.android.AndroidEntryPoint import dagger.hilt.android.qualifiers.ApplicationContext import org.tasks.R -import org.tasks.data.dao.TaskDao import org.tasks.data.count +import org.tasks.data.dao.TaskDao import org.tasks.injection.InjectingJobIntentService import org.tasks.preferences.DefaultFilterProvider import org.tasks.preferences.Preferences import org.tasks.provider.TasksContentProvider +import org.tasks.wear.WearRefresher import timber.log.Timber import javax.inject.Inject @@ -21,6 +22,7 @@ class RefreshReceiver : InjectingJobIntentService() { @Inject lateinit var defaultFilterProvider: DefaultFilterProvider @Inject lateinit var taskDao: TaskDao @Inject lateinit var preferences: Preferences + @Inject lateinit var wearRefresher: WearRefresher override suspend fun doWork(intent: Intent) { if (preferences.getBoolean(R.string.p_badges_enabled, true)) { @@ -34,5 +36,6 @@ class RefreshReceiver : InjectingJobIntentService() { } catch (e: Exception) { Timber.e(e) } + wearRefresher.refresh() } } \ No newline at end of file diff --git a/app/src/main/java/org/tasks/wear/WearRefresher.kt b/app/src/main/java/org/tasks/wear/WearRefresher.kt new file mode 100644 index 000000000..df3cdfc50 --- /dev/null +++ b/app/src/main/java/org/tasks/wear/WearRefresher.kt @@ -0,0 +1,5 @@ +package org.tasks.wear + +interface WearRefresher { + suspend fun refresh() +} \ No newline at end of file