# Guide de migration

### Migration du SDK Android 5 vers 6

1.  Migrez votre projet vers AndroidX conformément à la [documentation officielle](https://developer.android.com/jetpack/androidx/migrate).
2.  Ajoutez un nouveau module dans le fichier **build.gradle** de l'application si vous utilisez **Firebase Cloud Messaging.**

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

Pour ceux qui utilisent **Amazon** et n'utilisent pas **Firebase**, aucun changement n'est nécessaire.

### Migration depuis les versions précédentes du SDK Android

La plupart des classes et méthodes de Pushwoosh sont devenues obsolètes depuis la version 5.0 et certaines ont été supprimées. Les classes **PushManager**, **BasePushMessageReceiver**, **BaseRegistrationReceiver**, **SendPushTagsCallback**, **PushFragment** et **PushEventListener** sont toujours disponibles dans la bibliothèque `com.pushwoosh:pushwoosh-deprecated`, mais il est recommandé de migrer vers la nouvelle API dès que possible.

## PushManager

**PushManager** comprenait diverses méthodes pour différentes fonctionnalités. Ces méthodes sont maintenant réparties entre différentes classes et bibliothèques :
`com.pushwoosh:pushwoosh` : **Pushwoosh**, **PushwooshNotificationSettings**, **PushwooshInApp**.
`com.pushwoosh:pushwoosh-badge` : **PushwooshBadge**.
`com.pushwoosh:pushwoosh-location` : **PushwooshLocation**.
`com.pushwoosh:pushwoosh-beacon` : **PushwooshBeacon**.

## BaseRegistrationReceiver

**BaseRegistrationReceiver** était utilisé pour gérer les événements d'enregistrement et de désenregistrement des notifications push. Ce récepteur est maintenant remplacé par un mécanisme de rappel simple :

```java
Pushwoosh.getInstance().registerForPushNotifications(result -> {
    if (result.isSuccess()) {
        String token = result.getData();
        // gérer l'enregistrement réussi
    }
    else {
        PushwooshException exception = result.getException();
        // gérer l'erreur d'enregistrement
    }
});
```

## BasePushMessageReceiver

**BasePushMessageReceiver** était utilisé pour imiter le comportement des notifications iOS lors de la réception d'une notification push au premier plan. Cela était réalisé en annulant la notification entrante et en invoquant le rappel **onMessageReceive**. C'était peu pratique et nécessitait un enregistrement manuel lorsque l'application devenait active et un désenregistrement lorsqu'elle passait en arrière-plan.
Ce récepteur a été remplacé par **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);
            });

            // ceci indique que la notification ne doit pas être affichée
            return true;
        }

        return false;
    }

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

    @MainThread
    private void handlePush(PushMessage message) {
        // TODO : gérer le message push
    }
}
```

Cette extension est également utilisée pour gérer les événements d'arrivée et d'acceptation des notifications, remplaçant ainsi tout le code peu pratique qui était utilisé dans l'intégration manuelle de l'Activité.

## PushFragment

**PushFragment** était une alternative légère à l'intégration complexe impliquant le cycle de vie de l'Activité. Mais d'un autre côté, il nécessitait l'héritage de **FragmentActivity** et utilisait implicitement le cycle de vie plus complexe du Fragment.
**PushFragment** et **PushEventListener** sont maintenant remplacés par **Pushwoosh#registerForPushNotifications(Callback)** et **NotificationServiceExtension**.

## Récepteur de diffusion push personnalisé (PW_NOTIFICATION_RECEIVER)

**PW_NOTIFICATION_RECEIVER** était utilisé pour personnaliser le comportement lorsque l'utilisateur clique sur une notification. Cela permettait de gérer les notifications en dehors du contexte de l'Activité et d'ouvrir différentes Activités en fonction du contenu de la notification. Cette intégration utilisait l'API interne du SDK Pushwoosh qui n'existe plus.
Ce récepteur est maintenant complètement remplacé par **NotificationServiceExtension** :

```java title="YourNotificationServiceExtension.java"
public class YourNotificationServiceExtension extends NotificationServiceExtension {
    @Override
    protected void startActivityForPushMessage(PushMessage message) {
    	// super.startActivityForPushMessage() démarre l'activité de lancement par défaut 
    	// ou l'activité marquée avec l'action ${applicationId}.MESSAGE.
    	// Ne l'appelez tout simplement pas pour surcharger ce comportement.
        // super.startActivityForPushMessage(message);

        // démarrez votre activité à la place :
        Intent launchIntent  = new Intent(getApplicationContext(), YourActivity.class);             
        launchIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED);
 
        // (Optionnel) passer les données de notification à l'Activité
        launchIntent.putExtra(Pushwoosh.PUSH_RECEIVE_EVENT, message.toJson().toString());
 
        context.startActivity(launchIntent);
    }
}
```

## Fabrique de notifications

Il y a également eu quelques changements majeurs concernant la fabrique de notifications :

**1.** **AbsNotificationFactory** a été remplacé par **NotificationFactory**
**2.** Les méthodes **AbsNotificationFactory#onPushReceived(PushData)** et **AbsNotificationFactory#onPushHandle(Activity)** ont été remplacées par la classe **NotificationServiceExtension** (**onMessageReceived**, **startActivityForPushMessage**).
**3.** **DefaultNotificationFactory** a été remplacé par **PushwooshNotificationFactory**.
**4.** **PushData** a été remplacé par **PushMessage**.

## Messages In-App

**1.** **InAppFacade** a été remplacé par **PushwooshInApp**.
**2.** L'objet `pushwoosh` a été introduit pour l'interface native JavaScript avec l'API suivante :
**getHwid(): string** - renvoie le hwid de Pushwoosh pour l'appareil actuel.
**getVersion(): string** - renvoie la version actuelle du SDK Pushwoosh.
**postEvent(event: string, attributes?: object, successCallback?: function, errorCallback?: function)** - envoie une requête postEvent.
**sendTags(tags: object)** - envoie les tags associés à l'appareil actuel.
**getTags(successCallback: function, errorCallback?: function)** - renvoie les tags associés à l'appareil actuel.
**closeInApp()** - ferme la page HTML In-App.

## Partagez vos commentaires avec nous

Vos commentaires nous aident à créer une meilleure expérience, nous serions donc ravis de vous entendre si vous rencontrez des problèmes lors du processus d'intégration du SDK. Si vous rencontrez des difficultés, n'hésitez pas à nous faire part de vos réflexions [via ce formulaire](https://docs.google.com/forms/d/e/1FAIpQLSd\_0b8jwn-V\_JmoPLIxIFYbHACCQhrzidOZV3ELywoQPXRSxw/viewform).