# Настройка 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="/files/AGnUCDkzRhGRIdRQLXJA" alt=""><figcaption></figcaption></figure>

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

<figure><img src="/files/GxsLGEj0eJuxC4hE2FGu" alt=""><figcaption></figcaption></figure>

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

<figure><img src="/files/GnkZgAOGzANYmcb2OicQ" alt=""><figcaption></figcaption></figure>

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

<figure><img src="/files/hzt2LBuAvXR3Z28MX07z" alt=""><figcaption></figcaption></figure>

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

<figure><img src="/files/wksHVKWTKfEMpRdeLe0n" alt=""><figcaption></figcaption></figure>

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

<figure><img src="/files/wAiupzKJtq1Wr2l20QyN" alt=""><figcaption></figcaption></figure>

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

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

<figure><img src="/files/OxMNEpD2asjQRTRdRwQa" alt=""><figcaption></figcaption></figure>

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

<figure><img src="/files/8YPMiLcJ59MOJwAGkwWz" alt=""><figcaption></figcaption></figure>

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

<figure><img src="/files/VxCa7eE7Mxg3fVC3wtB6" alt=""><figcaption></figcaption></figure>

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

<figure><img src="/files/WuCm3r4TKXuX8ZM6s945" alt=""><figcaption></figcaption></figure>

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

<figure><img src="/files/lwUiqkQayLNP2cmvmQte" alt=""><figcaption></figcaption></figure>

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

<figure><img src="/files/30T25MbuhirBauEGrZ14" alt=""><figcaption></figcaption></figure>

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

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

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


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://faq.docs.direct.i-dgtl.ru/kanaly-otpravki/push-rassylki/nastroika-android-prilozheniya.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
