# Руководство по миграции

### Миграция с Android SDK 5 на 6

1.  Перенесите свой проект на AndroidX в соответствии с [официальной документацией](https://developer.android.com/jetpack/androidx/migrate).
2.  Добавьте новый модуль в файл **build.gradle** вашего приложения, если вы используете **Firebase Cloud Messaging.**

```groovy title="build.gradle"
implementation 'com.pushwoosh:pushwoosh-firebase:+'
```

Для тех, кто использует **Amazon** и не использует **Firebase**, изменения не требуются.

### Миграция с предыдущих версий Android SDK

Большинство классов и методов Pushwoosh стали устаревшими с момента выпуска версии 5.0, а некоторые из них были удалены. Классы **PushManager**, **BasePushMessageReceiver**, **BaseRegistrationReceiver**, **SendPushTagsCallback**, **PushFragment** и **PushEventListener** по-прежнему доступны как часть библиотеки `com.pushwoosh:pushwoosh-deprecated`, но рекомендуется как можно скорее перейти на новый API.

## PushManager

**PushManager** состоял из различных методов для разных функций. Эти методы теперь разделены между различными классами и библиотеками:
`com.pushwoosh:pushwoosh`: **Pushwoosh**, **PushwooshNotificationSettings**, **PushwooshInApp**.
`com.pushwoosh:pushwoosh-badge`: **PushwooshBadge**.
`com.pushwoosh:pushwoosh-location`: **PushwooshLocation**.
`com.pushwoosh:pushwoosh-beacon`: **PushwooshBeacon**.

## BaseRegistrationReceiver

**BaseRegistrationReceiver** использовался для обработки событий регистрации и отмены регистрации Push-уведомлений. Этот ресивер теперь заменен простым механизмом обратного вызова:

```java
Pushwoosh.getInstance().registerForPushNotifications(result -> {
    if (result.isSuccess()) {
        String token = result.getData();
        // handle successful registration
    }
    else {
        PushwooshException exception = result.getException();
        // handle registration error
    }
});
```

## BasePushMessageReceiver

**BasePushMessageReceiver** использовался для имитации поведения уведомлений iOS при получении Push-уведомления на переднем плане. Это достигалось путем отмены входящего уведомления и вызова колбэка **onMessageReceive**. Это было громоздко и требовало ручной регистрации при активации приложения и отмены регистрации при переходе приложения в фоновый режим.
Этот ресивер был заменен на **NotificationServiceExtension**:

```txt title="AndroidManifest.xml"
<meta-data
    android:name="com.pushwoosh.notification_service_extension"
    android:value="com.your.package.name.YourNotificationServiceExtension"/>
```

```java title="YourNotificationServiceExtension.java"
public class YourNotificationServiceExtension extends NotificationServiceExtension {
    @Override
    public boolean onMessageReceived(final PushMessage message) {
        if (isAppOnForeground()) {
            Handler mainHandler = new Handler(getApplicationContext().getMainLooper());
            mainHandler.post(() -> {
                handlePush(message);
            });

            // this indicates that notification should not be displayed
            return true;
        }

        return false;
    }

    @Override
    protected void startActivityForPushMessage(PushMessage message) {
        super.startActivityForPushMessage(message);
        handlePush(message);
    }

    @MainThread
    private void handlePush(PushMessage message) {
        // TODO: handle push message
    }
}
```

Это расширение также используется для обработки событий прибытия и принятия уведомлений, тем самым заменяя весь громоздкий код, который использовался при ручной интеграции Activity.

## PushFragment

**PushFragment** был легковесной альтернативой сложной интеграции, включающей жизненный цикл Activity. Но с другой стороны, он требовал наследования **FragmentActivity** и неявно использовал более сложный жизненный цикл Fragment.
**PushFragment** и **PushEventListener** теперь заменены на **Pushwoosh#registerForPushNotifications(Callback)** и **NotificationServiceExtension**.

## Custom Push Broadcast Receiver (PW\_NOTIFICATION\_RECEIVER)

**PW\_NOTIFICATION\_RECEIVER** использовался для настройки поведения при нажатии пользователем на уведомление. Это позволяло обрабатывать уведомления вне контекста Activity и открывать различные Activity в зависимости от содержимого уведомления. Эта интеграция использовала внутренний API Pushwoosh SDK, который больше не существует.
Этот ресивер теперь полностью заменен на **NotificationServiceExtension**:

```java title="YourNotificationServiceExtension.java"
public class YourNotificationServiceExtension extends NotificationServiceExtension {
    @Override
    protected void startActivityForPushMessage(PushMessage message) {
    	// super.startActivityForPushMessage() starts default launcher activity 
    	// or activity marked with ${applicationId}.MESSAGE action.
    	// Simply do not call it to override this behaviour.
        // super.startActivityForPushMessage(message);

        // start your activity instead:
        Intent launchIntent  = new Intent(getApplicationContext(), YourActivity.class);             
        launchIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED);
 
        // (Optional) pass notification data to Activity
        launchIntent.putExtra(Pushwoosh.PUSH_RECEIVE_EVENT, message.toJson().toString());
 
        context.startActivity(launchIntent);
    }
}
```

## Notification Factory

Также были некоторые критические изменения, касающиеся фабрики уведомлений:

**1.** **AbsNotificationFactory** был заменен на **NotificationFactory**
**2.** Методы **AbsNotificationFactory#onPushReceived(PushData)** и **AbsNotificationFactory#onPushHandle(Activity)** заменены классом **NotificationServiceExtension** (**onMessageReceived**, **startActivityForPushMessage**).
**3.** **DefaultNotificationFactory** был заменен на **PushwooshNotificationFactory**.
**4.** **PushData** был заменен на **PushMessage**.

## In-App Messages

**1.** **InAppFacade** был заменен на **PushwooshInApp**.
**2.** Был представлен объект `pushwoosh` для нативного интерфейса JavaScript со следующим API:
**getHwid(): string** - возвращает hwid Pushwoosh для текущего устройства.
**getVersion(): string** - возвращает текущую версию Pushwoosh SDK.
**postEvent(event: string, attributes?: object, successCallback?: function, errorCallback?: function)** - отправляет запрос postEvent.
**sendTags(tags: object)** - отправляет теги, связанные с текущим устройством.
**getTags(successCallback: function, errorCallback?: function)** - возвращает теги, связанные с текущим устройством.
**closeInApp()** - закрывает HTML-страницу In-App.

## Поделитесь своим отзывом с нами

Ваш отзыв помогает нам создавать лучший опыт, поэтому мы будем рады услышать от вас, если у вас возникнут какие-либо проблемы в процессе интеграции SDK. Если вы столкнетесь с трудностями, пожалуйста, не стесняйтесь поделиться своими мыслями с нами [через эту форму](https://docs.google.com/forms/d/e/1FAIpQLSd\_0b8jwn-V\_JmoPLIxIFYbHACCQhrzidOZV3ELywoQPXRSxw/viewform).