srctree

Robin Linden parent 1f9b91f8 f4730c65
Display avatars in notifications

inlinesplit
atox/src/main/kotlin/ui/NotificationHelper.kt added: 49, removed: 10, total 39
@@ -4,12 +4,21 @@ import android.app.Notification
import android.app.NotificationChannel
import android.app.NotificationManager
import android.content.Context
import android.graphics.Bitmap
import android.graphics.Canvas
import android.graphics.Paint
import android.graphics.PorterDuff
import android.graphics.PorterDuffXfermode
import android.graphics.Rect
import android.os.Build
import androidx.core.app.NotificationCompat
import androidx.core.app.NotificationCompat.EXTRA_TEXT_LINES
import androidx.core.app.Person
import androidx.core.content.getSystemService
import androidx.core.graphics.drawable.IconCompat
import androidx.core.os.bundleOf
import androidx.navigation.NavDeepLinkBuilder
import com.squareup.picasso.Picasso
import com.squareup.picasso.Transformation
import javax.inject.Inject
import javax.inject.Singleton
import ltd.evilcorp.atox.R
@@ -55,6 +64,27 @@ class NotificationHelper @Inject constructor(
 
fun dismissNotifications(publicKey: PublicKey) = notifier.cancel(publicKey.string().hashCode())
 
private val circleTransform = object : Transformation {
override fun transform(bitmap: Bitmap): Bitmap {
val output = Bitmap.createBitmap(bitmap.width, bitmap.height, Bitmap.Config.ARGB_8888)
val canvas = Canvas(output)
val paint = Paint()
val rect = Rect(0, 0, bitmap.width, bitmap.height)
 
paint.isAntiAlias = true
canvas.drawARGB(0, 0, 0, 0)
canvas.drawCircle(bitmap.width / 2.0f, bitmap.height / 2.0f, bitmap.width / 2.0f, paint)
paint.xfermode = PorterDuffXfermode(PorterDuff.Mode.SRC_IN)
canvas.drawBitmap(bitmap, rect, rect, paint)
if (bitmap != output) {
bitmap.recycle()
}
return output
}
 
override fun key() = "circleTransform"
}
 
fun showMessageNotification(contact: Contact, message: String) {
val notificationBuilder = NotificationCompat.Builder(context, MESSAGE)
.setSmallIcon(android.R.drawable.sym_action_chat)
@@ -74,16 +104,25 @@ class NotificationHelper @Inject constructor(
}
 
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
val messages = notifier.activeNotifications.find { it.notification.group == contact.publicKey }
?.notification?.extras?.getCharSequenceArray(EXTRA_TEXT_LINES)?.toMutableList()
?: ArrayList<CharSequence>()
val icon = if (contact.avatarUri.isNotEmpty()) {
IconCompat.createWithBitmap(Picasso.get().load(contact.avatarUri).transform(circleTransform).get())
} else null
 
messages.add(message)
val chatPartner = Person.Builder()
.setName(contact.name)
.setKey(contact.publicKey)
.setIcon(icon)
.setImportant(true)
.build()
 
val style = NotificationCompat.InboxStyle()
messages.forEach {
style.addLine(it)
}
val style =
notifier.activeNotifications.find { it.notification.group == contact.publicKey }?.notification?.let {
NotificationCompat.MessagingStyle.extractMessagingStyleFromNotification(it)
} ?: NotificationCompat.MessagingStyle(chatPartner)
 
style.messages.add(
NotificationCompat.MessagingStyle.Message(message, System.currentTimeMillis(), chatPartner)
)
 
notificationBuilder
.setStyle(style)