# Guia de migração

### Migração do SDK Android 5 para 6

1. Migre seu projeto para o AndroidX de acordo com a [documentação oficial](https://developer.android.com/jetpack/androidx/migrate).
2. Adicione um novo módulo no arquivo **build.gradle** do aplicativo se você estiver usando o **Firebase Cloud Messaging.**

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

Para aqueles que usam **Amazon** e não usam **Firebase**, nenhuma alteração é necessária.

### Migração de versões anteriores do SDK Android

A maioria das classes e métodos do Pushwoosh tornaram-se obsoletos desde a versão 5.0 e alguns deles foram extintos. As classes **PushManager**, **BasePushMessageReceiver**, **BaseRegistrationReceiver**, **SendPushTagsCallback**, **PushFragment** e **PushEventListener** ainda estão disponíveis como parte da biblioteca `com.pushwoosh:pushwoosh-deprecated`, mas é recomendado migrar para a nova API o mais rápido possível.

## PushManager

O **PushManager** consistia em vários métodos para diferentes funcionalidades. Esses métodos agora estão divididos entre diferentes classes e bibliotecas:\
`com.pushwoosh:pushwoosh`: **Pushwoosh**, **PushwooshNotificationSettings**, **PushwooshInApp**.\
`com.pushwoosh:pushwoosh-badge`: **PushwooshBadge**.\
`com.pushwoosh:pushwoosh-location`: **PushwooshLocation**.\
`com.pushwoosh:pushwoosh-beacon`: **PushwooshBeacon**.

## BaseRegistrationReceiver

O **BaseRegistrationReceiver** era usado para lidar com eventos de registro e cancelamento de registro de push. Este receptor agora é substituído por um mecanismo de callback simples:

```java
Pushwoosh.getInstance().registerForPushNotifications(result -> {
    if (result.isSuccess()) {
        String token = result.getData();
        // lida com o registro bem-sucedido
    }
    else {
        PushwooshException exception = result.getException();
        // lida com o erro de registro
    }
});
```

## BasePushMessageReceiver

O **BasePushMessageReceiver** era usado para imitar o comportamento de notificação do iOS ao receber uma notificação push em primeiro plano. Isso era alcançado cancelando a notificação recebida e invocando o callback **onMessageReceive**. Era um processo desajeitado e exigia registro manual quando o aplicativo se tornava ativo e cancelamento de registro quando o aplicativo ia para segundo plano.\
Este receptor foi substituído por **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);
            });

            // isso indica que a notificação não deve ser exibida
            return true;
        }

        return false;
    }

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

    @MainThread
    private void handlePush(PushMessage message) {
        // TODO: lidar com a mensagem push
    }
}
```

Esta extensão também é usada para lidar com eventos de chegada e aceitação de notificações, substituindo assim todo o código desajeitado que era usado na integração manual de Activity.

## PushFragment

O **PushFragment** era uma alternativa leve para a integração complexa envolvendo o ciclo de vida da Activity. Mas, por outro lado, exigia a herança de **FragmentActivity** e usava implicitamente o ciclo de vida mais complexo do Fragment.\
**PushFragment** e **PushEventListener** agora são substituídos por **Pushwoosh#registerForPushNotifications(Callback)** e **NotificationServiceExtension**.

## Receptor de Broadcast de Push Personalizado (PW_NOTIFICATION_RECEIVER)

O **PW_NOTIFICATION_RECEIVER** era usado para personalizar o comportamento quando o usuário clica em uma notificação. Isso permitia lidar com notificações fora do contexto da Activity e abrir diferentes Activities dependendo do conteúdo da notificação. Essa integração usava a API interna do SDK do Pushwoosh, que não existe mais.\
Este receptor agora é completamente substituído por **NotificationServiceExtension**:

```java title="YourNotificationServiceExtension.java"
public class YourNotificationServiceExtension extends NotificationServiceExtension {
    @Override
    protected void startActivityForPushMessage(PushMessage message) {
    	// super.startActivityForPushMessage() inicia a activity de inicialização padrão 
    	// ou a activity marcada com a ação ${applicationId}.MESSAGE.
    	// Simplesmente não o chame para substituir este comportamento.
        // super.startActivityForPushMessage(message);

        // inicie sua activity em vez disso:
        Intent launchIntent  = new Intent(getApplicationContext(), YourActivity.class);             
        launchIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED);
 
        // (Opcional) passe os dados da notificação para a Activity
        launchIntent.putExtra(Pushwoosh.PUSH_RECEIVE_EVENT, message.toJson().toString());
 
        context.startActivity(launchIntent);
    }
}
```

## Fábrica de Notificações

Também houve algumas alterações importantes envolvendo a fábrica de notificações:

**1.** **AbsNotificationFactory** foi substituído por **NotificationFactory**\
**2.** Os métodos **AbsNotificationFactory#onPushReceived(PushData)** e **AbsNotificationFactory#onPushHandle(Activity)** foram substituídos pela classe **NotificationServiceExtension** (**onMessageReceived**, **startActivityForPushMessage**).\
**3.** **DefaultNotificationFactory** foi substituído por **PushwooshNotificationFactory**.\
**4.** **PushData** foi substituído por **PushMessage**.

## Mensagens In-App

**1.** **InAppFacade** foi substituído por **PushwooshInApp**.\
**2.** O objeto `pushwoosh` foi introduzido para a interface nativa JavaScript com a seguinte API:\
**getHwid(): string** - retorna o hwid do Pushwoosh para o dispositivo atual.\
**getVersion(): string** - retorna a versão atual do SDK do Pushwoosh.\
**postEvent(event: string, attributes?: object, successCallback?: function, errorCallback?: function)** - envia a solicitação postEvent.\
**sendTags(tags: object)** - envia tags associadas ao dispositivo atual.\
**getTags(successCallback: function, errorCallback?: function)** - retorna as tags associadas ao dispositivo atual.\
**closeInApp()** - fecha a página HTML In-App.

## Compartilhe seu feedback conosco

Seu feedback nos ajuda a criar uma experiência melhor, então adoraríamos ouvir de você se tiver algum problema durante o processo de integração do SDK. Se você enfrentar alguma dificuldade, não hesite em compartilhar suas opiniões conosco [através deste formulário](https://docs.google.com/forms/d/e/1FAIpQLSd_0b8jwn-V_JmoPLIxIFYbHACCQhrzidOZV3ELywoQPXRSxw/viewform).