# Guía de migración

### Migración del SDK de Android 5 al 6

1. Migre su proyecto a AndroidX de acuerdo con la [documentación oficial](https://developer.android.com/jetpack/androidx/migrate).
2. Añada un nuevo módulo en el archivo **build.gradle** de la aplicación si está utilizando **Firebase Cloud Messaging.**

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

Para aquellos que usan **Amazon** y no usan **Firebase**, no se necesitan cambios.

### Migración desde versiones anteriores del SDK de Android

La mayoría de las clases y métodos de Pushwoosh quedaron obsoletos desde la versión 5.0 y algunos de ellos se eliminaron. Las clases **PushManager**, **BasePushMessageReceiver**, **BaseRegistrationReceiver**, **SendPushTagsCallback**, **PushFragment** y **PushEventListener** todavía están disponibles como parte de la biblioteca `com.pushwoosh:pushwoosh-deprecated`, pero se recomienda migrar a la nueva API lo antes posible.

## PushManager

**PushManager** consistía en varios métodos para diferentes características. Estos métodos ahora están divididos entre diferentes clases y bibliotecas:\
`com.pushwoosh:pushwoosh`: **Pushwoosh**, **PushwooshNotificationSettings**, **PushwooshInApp**.\
`com.pushwoosh:pushwoosh-badge`: **PushwooshBadge**.\
`com.pushwoosh:pushwoosh-location`: **PushwooshLocation**.\
`com.pushwoosh:pushwoosh-beacon`: **PushwooshBeacon**.

## BaseRegistrationReceiver

**BaseRegistrationReceiver** se utilizaba para gestionar los eventos de registro y anulación de registro de push. Este receptor ahora se reemplaza por un mecanismo de devolución de llamada simple:

```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** se utilizaba para imitar el comportamiento de las notificaciones de iOS al recibir una notificación push en primer plano. Se lograba cancelando la notificación entrante e invocando la devolución de llamada **onMessageReceive**. Era engorroso y requería un registro manual cuando la aplicación se activaba y una anulación de registro cuando la aplicación pasaba a segundo plano.\
Este receptor fue reemplazado 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);
            });

            // 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
    }
}
```

Esta extensión también se utiliza para gestionar los eventos de llegada y aceptación de notificaciones, reemplazando así todo el código engorroso que se utilizaba en la integración manual de Activity.

## PushFragment

**PushFragment** era una alternativa ligera para la compleja integración que involucra el ciclo de vida de Activity. Pero, por otro lado, requería la herencia de **FragmentActivity** e implícitamente utilizaba el ciclo de vida más complejo de Fragment.\
**PushFragment** y **PushEventListener** ahora son reemplazados por **Pushwoosh#registerForPushNotifications(Callback)** y **NotificationServiceExtension**.

## Receptor de difusión de push personalizado (PW_NOTIFICATION_RECEIVER)

**PW_NOTIFICATION_RECEIVER** se utilizaba para personalizar el comportamiento cuando un usuario hace clic en una notificación. Esto permitía gestionar las notificaciones fuera del contexto de Activity y abrir diferentes Activities dependiendo del contenido de la notificación. Esta integración utilizaba la API interna del SDK de Pushwoosh que ya no existe.\
Este receptor ahora está completamente reemplazado por **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);
    }
}
```

## Fábrica de notificaciones

También hubo algunos cambios importantes que involucran a la fábrica de notificaciones:

**1.** **AbsNotificationFactory** fue reemplazado por **NotificationFactory**\
**2.** Los métodos **AbsNotificationFactory#onPushReceived(PushData)** y **AbsNotificationFactory#onPushHandle(Activity)** fueron reemplazados por la clase **NotificationServiceExtension** (**onMessageReceived**, **startActivityForPushMessage**).\
**3.** **DefaultNotificationFactory** fue reemplazado por **PushwooshNotificationFactory**.\
**4.** **PushData** fue reemplazado por **PushMessage**.

## Mensajes In-App

**1.** **InAppFacade** fue reemplazado por **PushwooshInApp**.\
**2.** Se introdujo el objeto `pushwoosh` para la interfaz nativa de JavaScript con la siguiente API:\
**getHwid(): string** - devuelve el hwid de pushwoosh para el dispositivo actual.\
**getVersion(): string** - devuelve la versión actual del SDK de pushwoosh.\
**postEvent(event: string, attributes?: object, successCallback?: function, errorCallback?: function)** - envía la solicitud postEvent.\
**sendTags(tags: object)** - envía etiquetas asociadas con el dispositivo actual.\
**getTags(successCallback: function, errorCallback?: function)** - devuelve las etiquetas asociadas con el dispositivo actual.\
**closeInApp()** - cierra la página html In-App.

## Comparta sus comentarios con nosotros

Sus comentarios nos ayudan a crear una mejor experiencia, por lo que nos encantaría saber de usted si tiene algún problema durante el proceso de integración del SDK. Si encuentra alguna dificultad, no dude en compartir sus opiniones con nosotros [a través de este formulario](https://docs.google.com/forms/d/e/1FAIpQLSd\_0b8jwn-V\_JmoPLIxIFYbHACCQhrzidOZV3ELywoQPXRSxw/viewform).