From 68b8987704441b89efeb03675f703700e034f108 Mon Sep 17 00:00:00 2001 From: Daniel Shokouhi Date: Tue, 1 Sep 2020 21:44:13 -0700 Subject: [PATCH] Use a foreground service for the sensor worker to make updates more reliable (#854) --- .../companion/android/sensors/SensorWorker.kt | 37 +++++++++++++++++++ app/src/main/res/values/strings.xml | 1 + 2 files changed, 38 insertions(+) diff --git a/app/src/main/java/io/homeassistant/companion/android/sensors/SensorWorker.kt b/app/src/main/java/io/homeassistant/companion/android/sensors/SensorWorker.kt index a1f899341..fd32231be 100644 --- a/app/src/main/java/io/homeassistant/companion/android/sensors/SensorWorker.kt +++ b/app/src/main/java/io/homeassistant/companion/android/sensors/SensorWorker.kt @@ -1,14 +1,21 @@ package io.homeassistant.companion.android.sensors +import android.app.NotificationChannel +import android.app.NotificationManager import android.content.Context +import android.content.Context.NOTIFICATION_SERVICE +import android.os.Build import android.util.Log +import androidx.core.app.NotificationCompat import androidx.work.Constraints import androidx.work.CoroutineWorker import androidx.work.ExistingPeriodicWorkPolicy +import androidx.work.ForegroundInfo import androidx.work.NetworkType import androidx.work.PeriodicWorkRequestBuilder import androidx.work.WorkManager import androidx.work.WorkerParameters +import io.homeassistant.companion.android.R import io.homeassistant.companion.android.common.dagger.GraphComponentAccessor import io.homeassistant.companion.android.domain.integration.IntegrationUseCase import java.util.concurrent.TimeUnit @@ -22,10 +29,15 @@ class SensorWorker( ) : CoroutineWorker(appContext, workerParams) { companion object { private const val TAG = "SensorWorker" + const val channelId = "Sensor Worker" + const val NOTIFICATION_ID = 42 + var notificationText = "" + fun start(context: Context) { val constraints = Constraints.Builder() .setRequiredNetworkType(NetworkType.CONNECTED).build() + notificationText = context.getString(R.string.updating_sensors) val sensorWorker = PeriodicWorkRequestBuilder(15, TimeUnit.MINUTES) .setConstraints(constraints) @@ -38,6 +50,8 @@ class SensorWorker( @Inject lateinit var integrationUseCase: IntegrationUseCase + private val notificationManager = appContext.getSystemService(NOTIFICATION_SERVICE) as NotificationManager + init { DaggerSensorComponent.builder() .appComponent((appContext.applicationContext as GraphComponentAccessor).appComponent) @@ -47,7 +61,30 @@ class SensorWorker( override suspend fun doWork(): Result = withContext(Dispatchers.IO) { Log.d(TAG, "Updating all Sensors.") + createNotificationChannel() + val notification = NotificationCompat.Builder(applicationContext, channelId) + .setSmallIcon(R.drawable.ic_stat_ic_notification) + .setContentTitle(notificationText) + .setPriority(NotificationCompat.PRIORITY_LOW) + .build() + + val foregroundInfo = ForegroundInfo(NOTIFICATION_ID, notification) + setForeground(foregroundInfo) + SensorReceiver().updateSensors(appContext, integrationUseCase) Result.success() } + + private fun createNotificationChannel() { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { + var notificationChannel = + notificationManager?.getNotificationChannel(channelId) + if (notificationChannel == null) { + notificationChannel = NotificationChannel( + channelId, TAG, NotificationManager.IMPORTANCE_LOW + ) + notificationManager?.createNotificationChannel(notificationChannel) + } + } + } } diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 2b192a0c5..0d43fe246 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -185,6 +185,7 @@ like to connect to: Theme Unable to Register Application Unique Id + Updating Sensors Url Invalid Unable to parse your Home Assistant URL. It should look like https://example.com Username