fbpx

Доработка методов для отображения уведомлений

Создайте класс NotificationHelper  в папке notification и создайте метод buildGroupNotification()

private fun buildGroupNotification(
     context: Context,
     reminderData: ReminderData
 ): NotificationCompat.Builder {
     val channelId = "${context.packageName}-${reminderData.type.name}"
     return NotificationCompat.Builder(context, channelId).apply {
         setSmallIcon(R.drawable.ic_fitnes)
         setContentTitle(reminderData.type.name)
         setContentText(
             context.getString(
                 R.string.group_notification_for,
                 reminderData.type.name
             )
         )
         setStyle(
             NotificationCompat.BigTextStyle().bigText(
                 context.getString(
                     R.string.group_notification_for,
                     reminderData.type.name
                 )
             )
         )
         setAutoCancel(true)
         setGroupSummary(true)
         setGroup(reminderData.type.name)
     }
 }

Групповые уведомления позволяют удобно организовать уведомления похожей группы вместе. Теперь создайте метод для создания уведомления для напоминания о тренировке. Cоздайте метод buildNotification() как показано ниже:

private fun buildNotification(
    context: Context,
    reminderData: ReminderData
): NotificationCompat.Builder {


    // 1
    val channelId = "${context.packageName}-${reminderData.type.name}"
    // 2
    return NotificationCompat.Builder(context, channelId).apply {
    // 3
        setSmallIcon(R.drawable.ic_fitnes)
    // 4
        setContentTitle(reminderData.name)
    // 5
        setAutoCancel(true)
    
    // 6 get a drawable reference for the LargeIcon
        val drawable = when (reminderData.type) {
            WorkoutType.Running -> R.drawable.ic_run
            WorkoutType.Cycling -> R.drawable.ic_velo
            else -> R.drawable.ic_swimming
        }
        setLargeIcon(BitmapFactory.decodeResource(context.resources, drawable))
    // 7
        setContentText("${reminderData.name}")
    // 8
        setGroup(reminderData.type.name)


    // 9 Launches the app to open the reminder edit screen when tapping the whole notification
        val intent = Intent(context, MainActivity::class.java).apply {
            flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK
            putExtra(KEY_ID, reminderData.id)
        }
    // 10
        val pendingIntent = PendingIntent.getActivity(context, 0, intent, 0)
        setContentIntent(pendingIntent)
    }
}

Здесь мы используем все те же методы, которые рассматривали в самом начале для создания тестового уведомления.

  1. Создаём уникальный  channelId для этого приложения, используя  имя package name и название из ReminderData.
  2. Для создания уведомления используем NotificationCompat.Builder
  3. Единственным обязательным параметром при создании уведомления является иконка. С помощью метода setSmallIcon задаём иконку для уведомления.
  4. Задаём заголовок для уведомления
  5. Устанавливаем уведомление как автоматически скрываемое после того, как пользователь нажмёт на уведомление.
  6. Получаем иконку по типу из  ReminderData
  7. Задаём описание
  8. Задаём группу
  9. Задаём интент, который должен выполниться.
  10. Указываем  отложенный интент

Теперь давайте создадим метод createNotificationForWorkout() который использует выше описанные методы для создания уведомление о тренировке.

fun createNotificationForWorkout(context: Context, reminderData: ReminderData) {
    
    // 1 create a group notification
    val groupBuilder = buildGroupNotification(context, reminderData)
    // 2
    val notificationBuilder = buildNotification(context, reminderData)
    // 3
    val notificationManager = NotificationManagerCompat.from(context)
    notificationManager.notify(reminderData.type.ordinal, groupBuilder.build())
    notificationManager.notify(reminderData.id.toInt(), notificationBuilder.build())
}

Давайте рассмотрим подробнее что здесь происходит:

  1. Создаём групповое уведомлений. Метод buildGroupNotification()  мы описали выше
  2. Создаём уведомление.
  3. Вызываем метод notify используя NotificationManager для обоих типов уведомлений