From 33c30e27faa68a64b07a04dbd9e13a48f96f1ad2 Mon Sep 17 00:00:00 2001 From: Adam Brown Date: Mon, 21 Feb 2022 17:14:36 +0000 Subject: [PATCH] flattening the room and user icon loading into the same file --- .../features/notifications/BitmapLoader.kt | 65 ------------- .../app/features/notifications/IconLoader.kt | 66 ------------- .../notifications/NotificationBitmapLoader.kt | 92 +++++++++++++++++++ .../notifications/RoomGroupMessageCreator.kt | 11 +-- 4 files changed, 96 insertions(+), 138 deletions(-) delete mode 100644 vector/src/main/java/im/vector/app/features/notifications/BitmapLoader.kt delete mode 100644 vector/src/main/java/im/vector/app/features/notifications/IconLoader.kt create mode 100644 vector/src/main/java/im/vector/app/features/notifications/NotificationBitmapLoader.kt diff --git a/vector/src/main/java/im/vector/app/features/notifications/BitmapLoader.kt b/vector/src/main/java/im/vector/app/features/notifications/BitmapLoader.kt deleted file mode 100644 index 9190141dfb..0000000000 --- a/vector/src/main/java/im/vector/app/features/notifications/BitmapLoader.kt +++ /dev/null @@ -1,65 +0,0 @@ -/* - * Copyright 2019 New Vector Ltd - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package im.vector.app.features.notifications - -import android.content.Context -import android.graphics.Bitmap -import androidx.annotation.WorkerThread -import com.bumptech.glide.Glide -import com.bumptech.glide.load.DecodeFormat -import com.bumptech.glide.signature.ObjectKey -import timber.log.Timber -import javax.inject.Inject -import javax.inject.Singleton - -@Singleton -class BitmapLoader @Inject constructor(private val context: Context) { - - private val iconWidth = context.resources.getDimensionPixelSize(android.R.dimen.notification_large_icon_width) - private val iconHeight = context.resources.getDimensionPixelSize(android.R.dimen.notification_large_icon_height) - - /** - * Get icon of a room. - * If already in cache, use it, else load it and call BitmapLoaderListener.onBitmapsLoaded() when ready - */ - @WorkerThread - fun getRoomBitmap(path: String?): Bitmap? { - if (path == null) { - return null - } - return loadRoomBitmap(path) - } - - @WorkerThread - private fun loadRoomBitmap(path: String): Bitmap? { - return path.let { - try { - Glide.with(context) - .asBitmap() - .load(path) - .fitCenter() - .format(DecodeFormat.PREFER_ARGB_8888) - .signature(ObjectKey("room-icon-notification")) - .submit(iconWidth, iconHeight) - .get() - } catch (e: Exception) { - Timber.e(e, "decodeFile failed") - null - } - } - } -} diff --git a/vector/src/main/java/im/vector/app/features/notifications/IconLoader.kt b/vector/src/main/java/im/vector/app/features/notifications/IconLoader.kt deleted file mode 100644 index ec53e89d57..0000000000 --- a/vector/src/main/java/im/vector/app/features/notifications/IconLoader.kt +++ /dev/null @@ -1,66 +0,0 @@ -/* - * Copyright 2019 New Vector Ltd - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package im.vector.app.features.notifications - -import android.content.Context -import android.os.Build -import androidx.annotation.WorkerThread -import androidx.core.graphics.drawable.IconCompat -import com.bumptech.glide.Glide -import com.bumptech.glide.load.DecodeFormat -import com.bumptech.glide.request.RequestOptions -import timber.log.Timber -import javax.inject.Inject -import javax.inject.Singleton - -@Singleton -class IconLoader @Inject constructor(private val context: Context) { - - /** - * Get icon of a user. - * If already in cache, use it, else load it and call IconLoaderListener.onIconsLoaded() when ready - * Before Android P, this does nothing because the icon won't be used - */ - @WorkerThread - fun getUserIcon(path: String?): IconCompat? { - if (path == null || Build.VERSION.SDK_INT < Build.VERSION_CODES.P) { - return null - } - - return loadUserIcon(path) - } - - @WorkerThread - private fun loadUserIcon(path: String): IconCompat? { - return path.let { - try { - Glide.with(context) - .asBitmap() - .load(path) - .apply(RequestOptions.circleCropTransform() - .format(DecodeFormat.PREFER_ARGB_8888)) - .submit() - .get() - } catch (e: Exception) { - Timber.e(e, "decodeFile failed") - null - }?.let { bitmap -> - IconCompat.createWithBitmap(bitmap) - } - } - } -} diff --git a/vector/src/main/java/im/vector/app/features/notifications/NotificationBitmapLoader.kt b/vector/src/main/java/im/vector/app/features/notifications/NotificationBitmapLoader.kt new file mode 100644 index 0000000000..518b011ffd --- /dev/null +++ b/vector/src/main/java/im/vector/app/features/notifications/NotificationBitmapLoader.kt @@ -0,0 +1,92 @@ +/* + * Copyright 2019 New Vector Ltd + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package im.vector.app.features.notifications + +import android.content.Context +import android.graphics.Bitmap +import android.os.Build +import androidx.annotation.WorkerThread +import androidx.core.graphics.drawable.IconCompat +import com.bumptech.glide.Glide +import com.bumptech.glide.load.DecodeFormat +import com.bumptech.glide.load.resource.bitmap.CircleCrop +import com.bumptech.glide.signature.ObjectKey +import timber.log.Timber +import javax.inject.Inject +import javax.inject.Singleton + +@Singleton +class NotificationBitmapLoader @Inject constructor(private val context: Context) { + + /** + * Get icon of a room + */ + @WorkerThread + fun getRoomBitmap(path: String?): Bitmap? { + if (path == null) { + return null + } + return loadRoomBitmap(path) + } + + @WorkerThread + private fun loadRoomBitmap(path: String): Bitmap? { + return try { + Glide.with(context) + .asBitmap() + .load(path) + .format(DecodeFormat.PREFER_ARGB_8888) + .signature(ObjectKey("room-icon-notification")) + .submit() + .get() + } catch (e: Exception) { + Timber.e(e, "decodeFile failed") + null + } + } + + /** + * Get icon of a user. + * Before Android P, this does nothing because the icon won't be used + */ + @WorkerThread + fun getUserIcon(path: String?): IconCompat? { + if (path == null || Build.VERSION.SDK_INT < Build.VERSION_CODES.P) { + return null + } + + return loadUserIcon(path) + } + + @WorkerThread + private fun loadUserIcon(path: String): IconCompat? { + return try { + val bitmap = Glide.with(context) + .asBitmap() + .load(path) + .transform(CircleCrop()) + .format(DecodeFormat.PREFER_ARGB_8888) + .signature(ObjectKey("user-icon-notification")) + .submit() + .get() + IconCompat.createWithBitmap(bitmap) + } catch (e: Exception) { + Timber.e(e, "decodeFile failed") + null + } + } +} diff --git a/vector/src/main/java/im/vector/app/features/notifications/RoomGroupMessageCreator.kt b/vector/src/main/java/im/vector/app/features/notifications/RoomGroupMessageCreator.kt index b57c81f686..8310c15daa 100644 --- a/vector/src/main/java/im/vector/app/features/notifications/RoomGroupMessageCreator.kt +++ b/vector/src/main/java/im/vector/app/features/notifications/RoomGroupMessageCreator.kt @@ -16,7 +16,6 @@ package im.vector.app.features.notifications -import android.content.Context import android.graphics.Bitmap import androidx.core.app.NotificationCompat import androidx.core.app.Person @@ -28,11 +27,9 @@ import timber.log.Timber import javax.inject.Inject class RoomGroupMessageCreator @Inject constructor( - private val iconLoader: IconLoader, - private val bitmapLoader: BitmapLoader, + private val bitmapLoader: NotificationBitmapLoader, private val stringProvider: StringProvider, - private val notificationUtils: NotificationUtils, - private val appContext: Context + private val notificationUtils: NotificationUtils ) { fun createRoomMessage(events: List, roomId: String, userDisplayName: String, userAvatarUrl: String?): RoomNotification.Message { @@ -41,7 +38,7 @@ class RoomGroupMessageCreator @Inject constructor( val roomIsGroup = !firstKnownRoomEvent.roomIsDirect val style = NotificationCompat.MessagingStyle(Person.Builder() .setName(userDisplayName) - .setIcon(iconLoader.getUserIcon(userAvatarUrl)) + .setIcon(bitmapLoader.getUserIcon(userAvatarUrl)) .setKey(firstKnownRoomEvent.matrixID) .build() ).also { @@ -92,7 +89,7 @@ class RoomGroupMessageCreator @Inject constructor( } else { Person.Builder() .setName(event.senderName) - .setIcon(iconLoader.getUserIcon(event.senderAvatarPath)) + .setIcon(bitmapLoader.getUserIcon(event.senderAvatarPath)) .setKey(event.senderId) .build() }