Fix placeholder icons

This commit is contained in:
Emma Vanbrabant 2020-05-09 20:46:37 +01:00
parent 54ecc25831
commit 957d51cf3f
2 changed files with 25 additions and 37 deletions

View file

@ -17,11 +17,13 @@
package im.vector.riotx.features.home
import android.content.Context
import android.graphics.Bitmap
import android.graphics.drawable.Drawable
import android.widget.ImageView
import androidx.annotation.AnyThread
import androidx.annotation.UiThread
import androidx.core.content.ContextCompat
import androidx.core.graphics.drawable.toBitmap
import com.amulyakhare.textdrawable.TextDrawable
import com.bumptech.glide.request.RequestOptions
import com.bumptech.glide.request.target.DrawableImageViewTarget
@ -73,9 +75,9 @@ class AvatarRenderer @Inject constructor(private val activeSessionHolder: Active
}
@AnyThread
fun shortcutDrawable(context: Context, glideRequest: GlideRequests, matrixItem: MatrixItem): Drawable {
fun shortcutDrawable(context: Context, glideRequest: GlideRequests, matrixItem: MatrixItem, iconSize: Int): Bitmap {
return glideRequest
.asDrawable()
.asBitmap()
.apply {
val resolvedUrl = resolvedUrl(matrixItem.avatarUrl)
if (resolvedUrl != null) {
@ -86,10 +88,11 @@ class AvatarRenderer @Inject constructor(private val activeSessionHolder: Active
.beginConfig()
.bold()
.endConfig()
.buildRect(matrixItem.firstLetterOfDisplayName(), avatarColor))
.buildRect(matrixItem.firstLetterOfDisplayName(), avatarColor)
.toBitmap(width = iconSize, height = iconSize))
}
}
.submit()
.submit(iconSize, iconSize)
.get()
}
@ -103,10 +106,7 @@ class AvatarRenderer @Inject constructor(private val activeSessionHolder: Active
@AnyThread
fun getPlaceholderDrawable(context: Context, matrixItem: MatrixItem): Drawable {
val avatarColor = when (matrixItem) {
is MatrixItem.UserItem -> ContextCompat.getColor(context, getColorFromUserId(matrixItem.id))
else -> ContextCompat.getColor(context, getColorFromRoomId(matrixItem.id))
}
val avatarColor = avatarColor(matrixItem, context)
return TextDrawable.builder()
.beginConfig()
.bold()
@ -117,9 +117,7 @@ class AvatarRenderer @Inject constructor(private val activeSessionHolder: Active
// PRIVATE API *********************************************************************************
private fun buildGlideRequest(glideRequest: GlideRequests, avatarUrl: String?): GlideRequest<Drawable> {
val resolvedUrl = activeSessionHolder.getSafeActiveSession()?.contentUrlResolver()
?.resolveThumbnail(avatarUrl, THUMBNAIL_SIZE, THUMBNAIL_SIZE, ContentUrlResolver.ThumbnailMethod.SCALE)
val resolvedUrl = resolvedUrl(avatarUrl)
return glideRequest
.load(resolvedUrl)
.apply(RequestOptions.circleCropTransform())

View file

@ -19,13 +19,10 @@ package im.vector.riotx.features.home
import android.annotation.SuppressLint
import android.content.Context
import android.graphics.Bitmap
import android.graphics.Canvas
import android.graphics.drawable.Drawable
import android.os.Build
import androidx.core.content.pm.ShortcutInfoCompat
import androidx.core.content.pm.ShortcutManagerCompat
import androidx.core.graphics.drawable.IconCompat
import im.vector.matrix.android.api.session.room.model.RoomSummary
import im.vector.matrix.android.api.session.room.model.tag.RoomTag
import im.vector.matrix.android.api.util.toMatrixItem
import im.vector.riotx.core.glide.GlideApp
@ -51,14 +48,24 @@ class ShortcutsHandler @Inject constructor(
.observeOn(Schedulers.computation())
.subscribe { rooms ->
val shortcuts = rooms
.favoriteRooms()
.filter { room -> room.tags.any { it.name == RoomTag.ROOM_TAG_FAVOURITE } }
.take(n = 4) // Android only allows us to create 4 shortcuts
.map { room ->
val intent = RoomDetailActivity.shortcutIntent(context, room.roomId)
val drawable = avatarRenderer.shortcutDrawable(context, GlideApp.with(context), room.toMatrixItem())
val adaptiveIconSize = dimensionConverter.dpToPx(adaptiveIconSizeDp)
val adaptiveIconOuterSides = dimensionConverter.dpToPx(adaptiveIconOuterSidesDp)
val size = if (useAdaptiveIcon) {
adaptiveIconSize - adaptiveIconOuterSides
} else {
dimensionConverter.dpToPx(72)
}
val bitmap = avatarRenderer.shortcutDrawable(context, GlideApp.with(context), room.toMatrixItem(), size)
ShortcutInfoCompat.Builder(context, room.roomId)
.setShortLabel(room.displayName)
.setIcon(drawable.toProfileImageIcon())
.setIcon(bitmap.toProfileImageIcon())
.setIntent(intent)
.build()
}
@ -70,28 +77,11 @@ class ShortcutsHandler @Inject constructor(
// PRIVATE API *********************************************************************************
private fun List<RoomSummary>.favoriteRooms(): List<RoomSummary> {
return filter { room -> room.tags.any { it.name == RoomTag.ROOM_TAG_FAVOURITE } }
.take(n = 4) // Android only allows us to create 4 shortcuts
}
private fun Drawable.toProfileImageIcon(): IconCompat {
val adaptiveIconSize = dimensionConverter.dpToPx(adaptiveIconSizeDp)
val adaptiveIconOuterSides = dimensionConverter.dpToPx(adaptiveIconOuterSidesDp)
val bitmap = Bitmap.createBitmap(adaptiveIconSize, adaptiveIconSize, Bitmap.Config.ARGB_8888)
val canvas = Canvas(bitmap)
private fun Bitmap.toProfileImageIcon(): IconCompat {
return if (useAdaptiveIcon) {
setBounds(adaptiveIconOuterSides, adaptiveIconOuterSides, adaptiveIconSize - adaptiveIconOuterSides, adaptiveIconSize - adaptiveIconOuterSides)
draw(canvas)
IconCompat.createWithAdaptiveBitmap(bitmap)
IconCompat.createWithAdaptiveBitmap(this)
} else {
setBounds(0, 0, bitmap.width, bitmap.height)
draw(canvas)
IconCompat.createWithBitmap(bitmap)
IconCompat.createWithBitmap(this)
}
}
}