Skip to content

Commit d66b168

Browse files
authored
fix(notifications): pre-crop contact photo to circle to prevent adaptive icon clipping (#828)
Signed-off-by: Brandon McAnsh <git@bmcreations.dev>
1 parent 9dc5ce4 commit d66b168

1 file changed

Lines changed: 26 additions & 5 deletions

File tree

apps/flipcash/shared/notifications/src/main/kotlin/com/flipcash/app/notifications/NotificationService.kt

Lines changed: 26 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,11 @@ import android.content.Intent
77
import android.content.pm.PackageManager
88
import android.os.Build
99
import android.graphics.Bitmap
10+
import android.graphics.Canvas
1011
import android.graphics.ImageDecoder
12+
import android.graphics.Paint
13+
import android.graphics.PorterDuff
14+
import android.graphics.PorterDuffXfermode
1115
import android.media.RingtoneManager
1216
import androidx.core.app.ActivityCompat
1317
import androidx.core.app.NotificationCompat
@@ -152,7 +156,7 @@ class NotificationService : FirebaseMessagingService(),
152156
}
153157

154158
val notificationId = if (isContactChat) {
155-
applyContactChatStyle(builder, groupKey, body)
159+
builder.applyContactChatStyle(groupKey, body)
156160
} else {
157161
builder.setContentTitle(title).setContentText(body)
158162
SecureRandom().nextInt(Int.MAX_VALUE)
@@ -173,8 +177,7 @@ class NotificationService : FirebaseMessagingService(),
173177
}
174178
}
175179

176-
private suspend fun applyContactChatStyle(
177-
builder: NotificationCompat.Builder,
180+
private suspend fun NotificationCompat.Builder.applyContactChatStyle(
178181
groupKey: String,
179182
body: String?,
180183
): Int {
@@ -195,7 +198,7 @@ class NotificationService : FirebaseMessagingService(),
195198
.setName(senderName)
196199
.setKey(groupKey)
197200
.apply {
198-
if (contactPhoto != null) setIcon(IconCompat.createWithAdaptiveBitmap(contactPhoto))
201+
if (contactPhoto != null) setIcon(IconCompat.createWithBitmap(contactPhoto.toCircularBitmap()))
199202
}
200203
.build()
201204

@@ -209,7 +212,7 @@ class NotificationService : FirebaseMessagingService(),
209212

210213
style.addMessage(body.orEmpty(), System.currentTimeMillis(), senderPerson)
211214

212-
builder.setStyle(style)
215+
setStyle(style)
213216
.setGroupAlertBehavior(NotificationCompat.GROUP_ALERT_CHILDREN)
214217

215218
return notificationId
@@ -253,6 +256,24 @@ class NotificationService : FirebaseMessagingService(),
253256
}
254257
}
255258

259+
private fun Bitmap.toCircularBitmap(): Bitmap {
260+
val size = minOf(width, height)
261+
val xOffset = (width - size) / 2
262+
val yOffset = (height - size) / 2
263+
264+
val output = Bitmap.createBitmap(size, size, Bitmap.Config.ARGB_8888)
265+
val canvas = Canvas(output)
266+
267+
val paint = Paint(Paint.ANTI_ALIAS_FLAG)
268+
val half = size / 2f
269+
canvas.drawCircle(half, half, half, paint)
270+
271+
paint.xfermode = PorterDuffXfermode(PorterDuff.Mode.SRC_IN)
272+
canvas.drawBitmap(this, -xOffset.toFloat(), -yOffset.toFloat(), paint)
273+
274+
return output
275+
}
276+
256277
internal fun Context.buildContentIntent(navigation: NavigationTrigger?): PendingIntent {
257278
val target = when (navigation) {
258279
is NavigationTrigger.CurrencyInfo -> Intent(Intent.ACTION_VIEW).apply {

0 commit comments

Comments
 (0)