# Migrationsleitfaden

### Migration von Android SDK 5 auf 6

1. Migrieren Sie Ihr Projekt zu AndroidX gemäß der [offiziellen Dokumentation](https://developer.android.com/jetpack/androidx/migrate).
2. Fügen Sie ein neues Modul in der **build.gradle**-Datei der App hinzu, wenn Sie **Firebase Cloud Messaging** verwenden.

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

Für diejenigen, die **Amazon** verwenden und **Firebase** nicht nutzen, sind keine Änderungen erforderlich.

### Migration von früheren Versionen des Android SDK

Die meisten Pushwoosh-Klassen und -Methoden sind seit der Version 5.0 veraltet und einige von ihnen wurden entfernt. Die Klassen **PushManager**, **BasePushMessageReceiver**, **BaseRegistrationReceiver**, **SendPushTagsCallback**, **PushFragment** und **PushEventListener** sind weiterhin als Teil der `com.pushwoosh:pushwoosh-deprecated`-Bibliothek verfügbar, es wird jedoch empfohlen, so schnell wie möglich auf die neue API zu migrieren.

## PushManager

**PushManager** bestand aus verschiedenen Methoden für unterschiedliche Funktionen. Diese Methoden sind nun auf verschiedene Klassen und Bibliotheken aufgeteilt:\
`com.pushwoosh:pushwoosh`: **Pushwoosh**, **PushwooshNotificationSettings**, **PushwooshInApp**.\
`com.pushwoosh:pushwoosh-badge`: **PushwooshBadge**.\
`com.pushwoosh:pushwoosh-location`: **PushwooshLocation**.\
`com.pushwoosh:pushwoosh-beacon`: **PushwooshBeacon**.

## BaseRegistrationReceiver

**BaseRegistrationReceiver** wurde verwendet, um Push-Registrierungs- und Abmeldeereignisse zu behandeln. Dieser Receiver wird nun durch einen einfachen Callback-Mechanismus ersetzt:

```java
Pushwoosh.getInstance().registerForPushNotifications(result -> {
    if (result.isSuccess()) {
        String token = result.getData();
        // erfolgreiche Registrierung behandeln
    }
    else {
        PushwooshException exception = result.getException();
        // Registrierungsfehler behandeln
    }
});
```

## BasePushMessageReceiver

**BasePushMessageReceiver** wurde verwendet, um das Benachrichtigungsverhalten von iOS beim Empfang einer Push-Benachrichtigung im Vordergrund zu imitieren. Dies wurde erreicht, indem die eingehende Benachrichtigung abgebrochen und der **onMessageReceive**-Callback aufgerufen wurde. Es war umständlich und erforderte eine manuelle Registrierung, wenn die Anwendung aktiv wurde, und eine Abmeldung, wenn die Anwendung in den Hintergrund ging.\
Dieser Receiver wurde durch **NotificationServiceExtension** ersetzt:

```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);
            });

            // dies zeigt an, dass die Benachrichtigung nicht angezeigt werden soll
            return true;
        }

        return false;
    }

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

    @MainThread
    private void handlePush(PushMessage message) {
        // TODO: Push-Nachricht behandeln
    }
}
```

Diese Erweiterung wird auch verwendet, um das Eintreffen und Akzeptieren von Benachrichtigungen zu behandeln und ersetzt somit den gesamten umständlichen Code, der bei der manuellen Activity-Integration verwendet wurde.

## PushFragment

**PushFragment** war eine leichtgewichtige Alternative für die komplexe Integration, die den Activity-Lebenszyklus involviert. Andererseits erforderte es die Vererbung von **FragmentActivity** und nutzte implizit den komplexeren Fragment-Lebenszyklus.\
**PushFragment** und **PushEventListener** werden nun durch **Pushwoosh#registerForPushNotifications(Callback)** und **NotificationServiceExtension** ersetzt.

## Benutzerdefinierter Push Broadcast Receiver (PW_NOTIFICATION_RECEIVER)

**PW_NOTIFICATION_RECEIVER** wurde verwendet, um das Verhalten anzupassen, wenn ein Benutzer auf eine Benachrichtigung klickt. Dies ermöglichte es, Benachrichtigungen außerhalb des Activity-Kontexts zu behandeln und je nach Benachrichtigungsinhalt verschiedene Activities zu öffnen. Diese Integration verwendete die interne Pushwoosh SDK API, die nicht mehr existiert.\
Dieser Receiver wird nun vollständig durch **NotificationServiceExtension** ersetzt:

```java title="YourNotificationServiceExtension.java"
public class YourNotificationServiceExtension extends NotificationServiceExtension {
    @Override
    protected void startActivityForPushMessage(PushMessage message) {
    	// super.startActivityForPushMessage() startet die Standard-Launcher-Activity 
    	// oder eine mit der Aktion ${applicationId}.MESSAGE markierte Activity.
    	// Rufen Sie es einfach nicht auf, um dieses Verhalten zu überschreiben.
        // super.startActivityForPushMessage(message);

        // starten Sie stattdessen Ihre Activity:
        Intent launchIntent  = new Intent(getApplicationContext(), YourActivity.class);             
        launchIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED);
 
        // (Optional) Benachrichtigungsdaten an die Activity übergeben
        launchIntent.putExtra(Pushwoosh.PUSH_RECEIVE_EVENT, message.toJson().toString());
 
        context.startActivity(launchIntent);
    }
}
```

## Notification Factory

Es gab auch einige Breaking Changes, die die Notification Factory betrafen:

**1.** **AbsNotificationFactory** wurde durch **NotificationFactory** ersetzt\
**2.** Die Methoden **AbsNotificationFactory#onPushReceived(PushData)** und **AbsNotificationFactory#onPushHandle(Activity)** wurden durch die Klasse **NotificationServiceExtension** (**onMessageReceived**, **startActivityForPushMessage**) ersetzt.\
**3.** **DefaultNotificationFactory** wurde durch **PushwooshNotificationFactory** ersetzt.\
**4.** **PushData** wurde durch **PushMessage** ersetzt.

## In-App-Nachrichten

**1.** **InAppFacade** wurde durch **PushwooshInApp** ersetzt.\
**2.** Das `pushwoosh`-Objekt wurde für die native JavaScript-Schnittstelle mit der folgenden API eingeführt:\
**getHwid(): string** - gibt die Pushwoosh-HWID für das aktuelle Gerät zurück.\
**getVersion(): string** - gibt die aktuelle Version des Pushwoosh SDK zurück.\
**postEvent(event: string, attributes?: object, successCallback?: function, errorCallback?: function)** - sendet eine postEvent-Anfrage.\
**sendTags(tags: object)** - sendet Tags, die mit dem aktuellen Gerät verknüpft sind.\
**getTags(successCallback: function, errorCallback?: function)** - gibt Tags zurück, die mit dem aktuellen Gerät verknüpft sind.\
**closeInApp()** - schließt die In-App-HTML-Seite.

## Teilen Sie uns Ihr Feedback mit

Ihr Feedback hilft uns, eine bessere Erfahrung zu schaffen. Daher würden wir uns freuen, von Ihnen zu hören, wenn Sie während des SDK-Integrationsprozesses auf Probleme stoßen. Sollten Sie Schwierigkeiten haben, zögern Sie bitte nicht, uns Ihre Gedanken [über dieses Formular](https://docs.google.com/forms/d/e/1FAIpQLSd_0b8jwn-V_JmoPLIxIFYbHACCQhrzidOZV3ELywoQPXRSxw/viewform) mitzuteilen.