setSmallIcon (icon: Icon) y NotificationCompat

actualmente tengo este código WET causado por el hecho de que NotificationCompat no admite setSmallIcon para un ícono y no un id de recurso:

val notification = if (Build.VERSION.SDK_INT < 23) { NotificationCompat.Builder(this) .setLargeIcon(bitmap) .setSmallIcon(R.drawable.ic_launcher) .setContentText(intentDescriber!!.userFacingIntentDescription) .setContentTitle(label) .setContentIntent(contentIntent) .setAutoCancel(true) .build() } else { Notification.Builder(this) .setSmallIcon(Icon.createWithBitmap(bitmap)) .setLargeIcon(bitmap) .setContentText(intentDescriber!!.userFacingIntentDescription) .setContentTitle(label) .setContentIntent(contentIntent) .setAutoCancel(true) .build() } 

¿Hay alguna manera de hacer que esto sea más agradable (SECO?): El problema es que ambas classs de constructores son diferentes.

Si se siente cómodo utilizando la reflexión, entonces, en lugar de configurar el icono pequeño en el generador, configúrelo en la propia notificación creada. Puede verificar allí para SDK 23 y llamar a setSmallIcon usando reflection (es un método público, pero está oculto. Dudo que cambie), de lo contrario, establezca el campo de icono en la notificación.

A falta de reflexión, sugiero crear su propia interfaz de generador con dos implementaciones: una para NotificationCompat.Builder y otra para Notification.Builder . Es posible que esté repitiendo "android", pero no se repetirá. p.ej:

 interface NotificationFacadeBuilder<out T> { /* facade builder method declarations go here */ fun build(): T } class SupportAppNotificationCompatFacadeBuilder(context: Context) : NotificationFacadeBuilder<NotificationCompat> { val builder = NotificationCompat.Builder(context) /* facade builder method implementations go here and delegate to `builder` */ override fun build(): NotificationCompat = TODO() } class AppNotificationFacadeBuilder(context: Context) : NotificationFacadeBuilder<Notification> { val builder = Notification.Builder(context) /* facade builder method implementations go here and delegate to `builder` */ override fun build(): Notification = TODO() } 

NotificationFacadeBuilder (o como quiera que decida llamarlo) tendrá que declarar cada método de compilation común que necesita y, luego, cada class de implementación simplemente los delegará en sus respectivas implementaciones de comstackdor reales.