Как загрузить IconCompat с помощью AdaptiveBitmap с помощью Glide

#android #android-notifications #android-glide #android-bubbles

#Android #android-уведомления #android-glide #android-пузырьки

Вопрос:

Как использовать кэш Glide для загрузки значков уведомлений? Это IconCompat, используемый в объекте Person в уведомлениях и ярлыках MessagingStyle. Кроме того, пузырьки требуют использования обоих из них.

Я использовал Glid в качестве парового:

 private IconCompat loadIcon(String url) throws ExecutionException, InterruptedException {
    RequestOptions requestOptions = new RequestOptions().override(ADAPTIVE_BITMAP_SIZE);
    Bitmap bitmap = Glide.with(G.app).asBitmap().apply(requestOptions).load(url).submit().get();
    return IconCompat.createWithAdaptiveBitmap(bitmap);
}
 

У меня есть несколько вопросов об этом решении

  • Какой должен быть размер ADAPTIVE_BITMAP_SIZE ?
  • Когда растровое изображение будет переработано?
  • Как обрабатывать ошибки при загрузке растрового изображения?

Ответ №1:

Создайте пользовательский TargetWrapper значок для асинхронной загрузки. Настройте свой Glide, используя ваш экземпляр TargetWrapper.

 asyncLoadIcon("http://YOUR_URL.com"){
    val person = Person.Builder()
        .setName("John Doe")
        .setIcon(it)

    notificationManagerHelper.notify(
        person.build()
    )
}
 

Вспомогательная функция для асинхронной загрузки растрового изображения затем переносится в значок

  private fun asyncLoadIcon(avatar: String?, block: (IconCompat?) -> Unit) {
        if (avatar.isNullOrEmpty())
            block(null)
        else {
            GlideHelper.createWithAdaptiveBitmap(requireContext(), avatar) { result ->
                if (result?.isSuccess() == true)
                    block(IconCompat.createWithAdaptiveBitmap(result.toData()))
                else block(null)
            }
        }
    }
 

Вот функция запроса изображения Glide с получением растрового изображения с обратным вызовом.

 fun createWithAdaptiveBitmap(
    context: Context,
    url: String,
    listener: ((Result<Bitmap>?) -> Unit)
) {
    val options = RequestOptions()
        .diskCacheStrategy(DiskCacheStrategy.DATA)
        .override(Target.SIZE_ORIGINAL, Target.SIZE_ORIGINAL)
        .dontTransform()

    Glide.with(context)
        .asBitmap()
        .apply(options)
        .load(url)
        .into(CustomTargetWrapper(listener))
}
 

Класс CustomTargetWrapper для асинхронной загрузки растрового изображения.

 class CustomTargetWrapper(
    private val listener: ((Result<Bitmap>?) -> Unit)
) : CustomTarget<Bitmap>() {

    override fun onResourceReady(resource: Bitmap, transition: Transition<in Bitmap>?) {
        listener.invoke(Result.Success(resource))
    }

    override fun onLoadCleared(placeholder: Drawable?) {
        listener.invoke(null)
    }

    override fun onLoadFailed(errorDrawable: Drawable?) {
        super.onLoadFailed(errorDrawable)
        listener.invoke(Result.Error(IOException("Glide load failed")))
    }
}