# Настройка Android приложения

## **Настройка приложения для получения и отображения push-уведомлений**

Для получения и отображения push-уведомлений выполните следующие шаги:

1. Добавьте Firebase SDK в приложение, следуя инструкциям из статьи [Add Firebase to project](https://firebase.google.com/docs/android/setup).
2. Реализуйте класс-наследник `FirebaseMessagingService` и добавьте его в `AndroidManifest.xm`l:

```xml
<service
    android:name=".IDigitalFcmService"
    android:exported="false">
    <intent-filter>
        <action android:name="com.google.firebase.MESSAGING_EVENT" />
    </intent-filter>
</service>
```

### Пример реализации FirebaseMessagingService:

```kotlin
class IDigitalFcmService : FirebaseMessagingService() {
    override fun onNewToken(token: String) {
        sendTokenToBackend(token)
    }

    override fun onMessageReceived(remoteMessage: RemoteMessage) {
        if (remoteMessage.data.containsKey("messageId")) {
            showNotification(remoteMessage.data["text"] as String)
            // For long-running tasks (10 seconds or more) use WorkManager.
            sendReceivedStateCallback(remoteMessage.data["messageId"] as String)
        }
    }

    private fun showNotification(text: String) {
        val intent = Intent(this, ScrollingActivity::class.java)
            .addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP)
        val pendingIntentFlags = if (Build.VERSION.SDK_INT > Build.VERSION_CODES.M) {
            PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE
        } else {
            PendingIntent.FLAG_UPDATE_CURRENT
        }
        val pendingIntent = PendingIntent.getActivity(this, 0, intent, pendingIntentFlags)

        val notificationBuilder = NotificationCompat.Builder(this, CHANNEL_ID)
            .setContentTitle("Заголовок")
            .setContentText(text)
            .setSmallIcon(R.drawable.ic_notification_24)
            .setAutoCancel(true)
            .setContentIntent(pendingIntent)
            .setPriority(NotificationCompat.PRIORITY_HIGH)

        val notificationManager = getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            createNotificationChannel(notificationManager)
        }
        notificationManager.notify(Random.nextInt(), notificationBuilder.build())
    }

    @RequiresApi(Build.VERSION_CODES.O)
    private fun createNotificationChannel(notificationManager: NotificationManager) {
        val notificationChannel = NotificationChannel(
            CHANNEL_ID,
            "NotificationChannel",
            NotificationManager.IMPORTANCE_HIGH
        ).apply {
            description = "NotificationChannelDescription"
        }
        notificationManager.createNotificationChannel(notificationChannel)
    }

    companion object {
        private const val CHANNEL_ID = "default_channel"
    }
}
```

{% hint style="info" %}
* В методе **`onNewToken`** необходимо отправить полученный токен на мобильный бекенд.
* В методе **`onMessageReceived`** необходимо отобразить полученное data-сообщение и отправить на сервер i-Digital информацию о статусе уведомления для отслеживания статусов доставки.
* При отправке запроса со статусом уведомления необходимо использовать **`WorkManager`**, так как существуют ограничения на время выполнения метода **`onMessageReceived`** в фоне.
{% endhint %}

Подробнее о получении и отображении уведомлений вы можете найти в следующей Android и Firebase документации:

* [Set up a Firebase Cloud Messaging client app on Android](https://firebase.google.com/docs/cloud-messaging/android/client)
* [Receive messages in an Android app](https://firebase.google.com/docs/cloud-messaging/android/receive)
* [Create a Notification](https://developer.android.com/training/notify-user/build-notification)
* [Firebase Cloud Messaging Quickstart](https://github.com/firebase/quickstart-android/tree/master/messaging)

## **Отслеживание статусов доставки**

При получении уведомления вам необходимо передавать на наш сервер информацию об идентификаторе сообщения на нашей платформе и статусе уведомления. Для этого в методе **`onMessageReceived`** отправляйте следующий HTTP-запрос:

```json
POST <https://nativepush.i-dgtl.ru/notification-state>
Content-Type: application/json

{
	"messageId": "MESSAGE_ID",
	"state": "RECEIVED"
}
```

В ответ наш сервер должен вернуть _204 No Content_.

## Отправка уведомлений

При отправке уведомлений используется ключ сервисного аккаунта в формате`.json` для авторизации на сервере Firebase, который вам нужно передать в i-Digital. Ключ можно создать в консоли Google Cloud, предварительно создав роль с разрешением на отправку сообщений в Firebase Cloud Messaging.

### Как создать роль с разрешением на отправку сообщений в Firebase Cloud Messaging?

1. Перейдите в [**Google Cloud Console**](https://console.cloud.google.com/) и выберите нужный проект.&#x20;

<figure><img src="../../.gitbook/assets/image (104).png" alt=""><figcaption></figcaption></figure>

2. В навигационном меню слева наведите курсор на **IAM & Admin** и выберите вкладку **Roles**.&#x20;

<figure><img src="../../.gitbook/assets/image (105).png" alt=""><figcaption></figcaption></figure>

3. На открывшейся странице нажмите кнопку [CREATE ROLE](https://console.cloud.google.com/iam-admin/roles/create).

<figure><img src="../../.gitbook/assets/image (106).png" alt=""><figcaption></figcaption></figure>

4. Введите название и ID роли, в выпадающем списке **Role launch stage** выберите **General Availability** и нажмите кнопку **ADD PERMISSIONS**.

<figure><img src="../../.gitbook/assets/image (107).png" alt=""><figcaption></figcaption></figure>

5. Во всплывающем окне в поле **Enter property name or value** введите **cloudmessaging.messages.create,** отметьте найденное разрешение и нажмите кнопку **ADD.**

<figure><img src="../../.gitbook/assets/image (108).png" alt=""><figcaption></figcaption></figure>

6. Нажмите кнопку **CREATE.**

<figure><img src="../../.gitbook/assets/image (109).png" alt=""><figcaption></figcaption></figure>

### Как создать сервисный аккаунт и ключ?

1. В меню **IAM & Admin** слева выберите вкладку **Service accounts,** затем нажмите кнопку [**CREATE SERVICE ACCOUNT**](https://console.cloud.google.com/iam-admin/serviceaccounts/create).

<figure><img src="../../.gitbook/assets/image (219).png" alt=""><figcaption></figcaption></figure>

2. На открывшейся странице ведите имя аккаунта и нажмите кнопку **CREATE AND CONTINUE**.&#x20;

<figure><img src="../../.gitbook/assets/image (220).png" alt=""><figcaption></figcaption></figure>

3. В выпадающем списке выберите роль, созданную ранее и нажмите кнопку **CONTINUE,** затем кнопку **DONE.**

<figure><img src="../../.gitbook/assets/image (221).png" alt=""><figcaption></figcaption></figure>

4. Выберите созданный сервисный аккаунт, на странице аккаунта перейдите на вкладку **KEYS.**&#x20;

<figure><img src="../../.gitbook/assets/image (222).png" alt=""><figcaption></figcaption></figure>

5. Нажмите кнопку **ADD KEY** и выберите **Create new key**.&#x20;

<figure><img src="../../.gitbook/assets/image (223).png" alt=""><figcaption></figcaption></figure>

6. Во всплывающем окне выберите тип ключа **JSON** и нажмите кнопку **CREATE.**

<figure><img src="../../.gitbook/assets/image (224).png" alt=""><figcaption></figcaption></figure>

7. После этого у вас скачается ключ сервисного аккаунта в формате `.json` .

### Как передать созданный JSON ключ в i-Digital?

Отправьте письмо на support@i-dgtl.ru с темой "Подключение PUSH i-digital direct", указав в теле письма название вашей организации и прикрепив к письму скачанный json-файл ключа.

