diff --git a/app/src/main/kotlin/io/homeassistant/companion/android/widgets/camera/CameraWidget.kt b/app/src/main/kotlin/io/homeassistant/companion/android/widgets/camera/CameraWidget.kt index fb9a9e13f4c..ca1d3513e93 100755 --- a/app/src/main/kotlin/io/homeassistant/companion/android/widgets/camera/CameraWidget.kt +++ b/app/src/main/kotlin/io/homeassistant/companion/android/widgets/camera/CameraWidget.kt @@ -17,6 +17,7 @@ import coil3.request.allowHardware import coil3.size.Dimension import coil3.size.Precision import coil3.size.Size +import coil3.toBitmap import dagger.hilt.android.AndroidEntryPoint import io.homeassistant.companion.android.R import io.homeassistant.companion.android.common.data.servers.ServerManager @@ -30,7 +31,6 @@ import io.homeassistant.companion.android.webview.WebViewActivity import io.homeassistant.companion.android.widgets.ACTION_APPWIDGET_CREATED import io.homeassistant.companion.android.widgets.BaseWidgetProvider.Companion.UPDATE_WIDGETS import io.homeassistant.companion.android.widgets.EXTRA_WIDGET_ENTITY -import io.homeassistant.companion.android.widgets.common.RemoteViewsTarget import javax.inject.Inject import kotlinx.coroutines.CancellationException import kotlinx.coroutines.CoroutineScope @@ -166,20 +166,20 @@ class CameraWidget : AppWidgetProvider() { ) Timber.d("Fetching camera image") try { - val request = ImageRequest.Builder(context) - .data(url) - .target(RemoteViewsTarget(this, R.id.widgetCameraImage)) - // RemoteViews requires software bitmaps for serialization - .allowHardware(false) - .diskCachePolicy(CachePolicy.DISABLED) - .memoryCachePolicy(CachePolicy.DISABLED) - .networkCachePolicy(CachePolicy.READ_ONLY) - .size(Size(getScreenWidth(), Dimension.Undefined)) - .precision(Precision.INEXACT) - .build() - // Wait for the image to be loaded before returning the RemoteViews - // to avoid concurrent modifications between Coil and updateAppWidget. - context.imageLoader.enqueue(request).job.join() + context.imageLoader.execute( + ImageRequest.Builder(context) + .data(url) + // RemoteViews requires software bitmaps for serialization + .allowHardware(false) + .diskCachePolicy(CachePolicy.DISABLED) + .memoryCachePolicy(CachePolicy.DISABLED) + .networkCachePolicy(CachePolicy.READ_ONLY) + .size(Size(getScreenWidth(), Dimension.Undefined)) + .precision(Precision.INEXACT) + .build(), + ).image?.toBitmap()?.let { + setImageViewBitmap(R.id.widgetCameraImage, it) + } } catch (e: CancellationException) { throw e } catch (e: Exception) { diff --git a/app/src/main/kotlin/io/homeassistant/companion/android/widgets/common/RemoteViewsTarget.kt b/app/src/main/kotlin/io/homeassistant/companion/android/widgets/common/RemoteViewsTarget.kt deleted file mode 100644 index 0ac0fd1146d..00000000000 --- a/app/src/main/kotlin/io/homeassistant/companion/android/widgets/common/RemoteViewsTarget.kt +++ /dev/null @@ -1,33 +0,0 @@ -package io.homeassistant.companion.android.widgets.common - -import android.widget.RemoteViews -import androidx.annotation.IdRes -import coil3.Image -import coil3.target.Target -import coil3.toBitmap - -/** - * [Target] implementation to load images into a [RemoteViews] ImageView with Coil. - * - * This target only mutates the provided [remoteViews] instance by setting the bitmap on - * [imageViewResId]. It does **not** call [android.appwidget.AppWidgetManager.updateAppWidget]. - * Callers are responsible for triggering the widget update themselves after the request - * completes (for example, in the surrounding widget update logic). - * - * Based on https://coil-kt.github.io/coil/recipes/#remote-views - */ -class RemoteViewsTarget(private val remoteViews: RemoteViews, @IdRes private val imageViewResId: Int) : Target { - - override fun onStart(placeholder: Image?) { - // Skip if null to avoid blinking (there is no placeholder) - placeholder?.let { setDrawable(it) } - } - - override fun onError(error: Image?) = setDrawable(error) - - override fun onSuccess(result: Image) = setDrawable(result) - - private fun setDrawable(image: Image?) { - remoteViews.setImageViewBitmap(imageViewResId, image?.toBitmap()) - } -} diff --git a/app/src/main/kotlin/io/homeassistant/companion/android/widgets/mediaplayer/MediaPlayerControlsWidget.kt b/app/src/main/kotlin/io/homeassistant/companion/android/widgets/mediaplayer/MediaPlayerControlsWidget.kt index ab7e66fc9b4..3bb8e5cccec 100644 --- a/app/src/main/kotlin/io/homeassistant/companion/android/widgets/mediaplayer/MediaPlayerControlsWidget.kt +++ b/app/src/main/kotlin/io/homeassistant/companion/android/widgets/mediaplayer/MediaPlayerControlsWidget.kt @@ -12,6 +12,7 @@ import android.widget.Toast import coil3.imageLoader import coil3.request.ImageRequest import coil3.request.allowHardware +import coil3.toBitmap import com.google.android.material.color.DynamicColors import com.mikepenz.iconics.IconicsDrawable import com.mikepenz.iconics.typeface.library.community.material.CommunityMaterial @@ -25,7 +26,6 @@ import io.homeassistant.companion.android.database.widget.MediaPlayerControlsWid import io.homeassistant.companion.android.database.widget.MediaPlayerControlsWidgetEntity import io.homeassistant.companion.android.database.widget.WidgetBackgroundType import io.homeassistant.companion.android.widgets.BaseWidgetProvider -import io.homeassistant.companion.android.widgets.common.RemoteViewsTarget import java.util.LinkedList import kotlinx.coroutines.CancellationException import kotlinx.coroutines.Dispatchers @@ -254,16 +254,16 @@ class MediaPlayerControlsWidget : BaseWidgetProvider