# Guide d'intégration de base du SDK Android

Cette section contient des informations sur la manière d'intégrer le SDK Pushwoosh dans votre application Android.

## Prérequis

Pour intégrer le SDK Android Pushwoosh dans votre application, vous aurez besoin des éléments suivants :

<TranslatedFragment id="prerequisites-android" />

## Étapes d'intégration


### 1. Configurer Firebase Cloud Messaging

Tout d'abord, connectez votre projet Android à Firebase :

- Ouvrez votre projet dans Android Studio
- Naviguez vers **Tools > Firebase > Cloud Messaging** et cliquez sur « Set up Firebase Cloud Messaging »
- Suivez les instructions de l'assistant. Lors de la dernière étape, l'assistant ajoutera les dépendances nécessaires à vos fichiers `build.gradle`

### 2. Ajouter le SDK Pushwoosh

Ajoutez la dépendance de la bibliothèque pushwoosh au fichier build.gradle de votre application :

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

Remplacez « + » par la version actuelle du [SDK Android Pushwoosh](https://github.com/Pushwoosh/pushwoosh-android-sdk/releases/latest)

### 3. Ajouter les métadonnées Pushwoosh à AndroidManifest.xml

Ouvrez votre fichier AndroidManifest.xml et ajoutez les métadonnées suivantes à l'intérieur de la balise `<application>` :

```xml
<meta-data android:name="com.pushwoosh.appid" android:value="__YOUR_APP_CODE__" />
<meta-data android:name="com.pushwoosh.apitoken" android:value="__YOUR_DEVICE_API_TOKEN__" />
```

Où :
- `com.pushwoosh.appid` est votre code d'application Pushwoosh
- `com.pushwoosh.apitoken` est votre [jeton d'API de l'appareil Pushwoosh](/fr/developer/api-reference/api-access-token/#device-api-token)

> **Important :** Assurez-vous de donner au jeton l'accès à la bonne application dans votre panneau de contrôle Pushwoosh. [En savoir plus](/fr/developer/api-reference/api-access-token/#edit-token)

### 4. Code d'initialisation

Enregistrez-vous pour les notifications push en ajoutant ce code à votre logique d'initialisation :

```java
Pushwoosh.getInstance().registerForPushNotifications()
```

### 5. Exécuter le projet

1. Compilez et exécutez le projet.
2. Allez dans le panneau de contrôle Pushwoosh et [envoyez une notification push](/fr/product/messaging-channels/push-notifications/send-push-notifications/one-time-push).
3. Vous devriez voir la notification dans l'application.

## Intégration étendue

À ce stade, vous avez déjà intégré le SDK et pouvez envoyer et recevoir des notifications push. Explorons maintenant les fonctionnalités de base

### Notifications push

Dans le SDK Pushwoosh, il existe deux rappels conçus pour gérer les notifications push :
- `onMessageReceived` : Cette méthode est invoquée lorsqu'une notification push est reçue.
- `onMessageOpened` : Cette méthode est appelée lorsque l'utilisateur interagit avec la notification (l'ouvre)

Ces rappels permettent aux développeurs de gérer la réception et l'interaction de l'utilisateur avec les notifications push au sein de leurs applications :

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

<Tabs syncKey="code-example">
<TabItem label="Kotlin">
```kotlin
import android.util.Log
import com.pushwoosh.notification.NotificationServiceExtension
import com.pushwoosh.notification.PushMessage

class YourNotificationServiceExtension : NotificationServiceExtension() {
    
    override fun onMessageReceived(data: PushMessage): Boolean {
        Log.d("Pushwoosh", "onMessageReceived: ${data.toJson()}")
        return false
    }

    override fun onMessageOpened(message: PushMessage) {
        Log.d("Pushwoosh", "onMessageOpened: ${message.toJson()}")
    }

}
```
</TabItem>
<TabItem label="Java">
```java
import android.util.Log;
import com.pushwoosh.notification.NotificationServiceExtension;
import com.pushwoosh.notification.PushMessage;

public class YourNotificationServiceExtensionJava extends NotificationServiceExtension {

    @Override
    public boolean onMessageReceived(PushMessage data) {
        Log.d("Pushwoosh", "onMessageReceived: " + data.toJson());
        return false;
    }

    @Override
    public void onMessageOpened(PushMessage message) {
        Log.d("Pushwoosh", "onMessageOpened: " + message.toJson());
    }
}
```
</TabItem>
</Tabs>

### Configuration de l'utilisateur

En vous concentrant sur le comportement et les préférences de chaque utilisateur, vous pouvez fournir un contenu personnalisé, ce qui entraîne une satisfaction et une fidélité accrues de l'utilisateur

<Tabs syncKey="code-example">
<TabItem label="Kotlin">
```kotlin
import com.pushwoosh.Pushwoosh
import com.pushwoosh.tags.TagsBundle
import java.util.Date

class Registration {

    public void afterUserLogin(User user) {
        Pushwoosh pushwoosh = Pushwoosh.getInstance()

        // Set user ID
        if (user.getUserId() != null) {
            pushwoosh.setUserId(user.getUserId())
        }

        // Set user email
        if (user.getEmail() != null) {
            pushwoosh.setEmail(user.getEmail())
        }

        // Setting additional user information as tags for Pushwoosh
        if (user.getUserDetails() != null) {
            val details = user.getUserDetails()
            val tagsBuilder = TagsBundle.Builder()
            
            if (details.getAge() != null) {
                tagsBuilder.putInt("age", details.getAge())
            }
            
            if (details.getUserName() != null) {
                tagsBuilder.putString("name", details.getUserName())
            }
            
            if (details.lastLoginDate() != null) {
                tagsBuilder.putDate("last_login", details.getLastLoginDate())
            }
            
            // Build and send tags
            val tags = tagsBuilder.build()
            if (!tags.isEmpty()) {
                pushwoosh.setTags(tags)
            }
        }
    }
}
```
</TabItem>
<TabItem label="Java">
```java
import com.pushwoosh.Pushwoosh;
import com.pushwoosh.tags.TagsBundle;
import java.util.Date;

public class Registration {

    public void afterUserLogin(User user) {
        Pushwoosh pushwoosh = Pushwoosh.getInstance();

        // Set user ID
        if (user.getUserId() != null) {
            pushwoosh.setUserId(user.getUserId());
        }

        // Set user email
        if (user.getEmail() != null) {
            pushwoosh.setEmail(user.getEmail());
        }

        // Set user SMS number
        if (user.getSmsNumber() != null) {
            pushwoosh.registerSMSNumber(user.getSmsNumber());
        }

        // Set user WhatsApp number
        if (user.getWhatsAppNumber() != null) {
            pushwoosh.registerWhatsappNumber(user.getWhatsAppNumber());
        }

        // Setting additional user information as tags for Pushwoosh
        if (user.getUserDetails() != null) {
            UserDetails details = user.getUserDetails();
            TagsBundle.Builder tagsBuilder = new TagsBundle.Builder();

            if (details.getAge() != null) {
                tagsBuilder.putInt("age", details.getAge());
            }

            if (details.getUserName() != null) {
                tagsBuilder.putString("name", details.getUserName());
            }

            if (details.getLastLoginDate() != null) {
                tagsBuilder.putDate("last_login", details.getLastLoginDate());
            }

            // Build and send tags
            TagsBundle tags = tagsBuilder.build();
            if (!tags.isEmpty()) {
                pushwoosh.setTags(tags);
            }
        }
    }
}
```
</TabItem>
</Tabs>

### Tags

Les tags sont des paires clé-valeur attribuées aux utilisateurs ou aux appareils, permettant une segmentation basée sur des attributs tels que les préférences ou le comportement, ce qui permet un envoi de messages ciblé.

<Tabs syncKey="code-example">
<TabItem label="Kotlin">
```kotlin
import com.pushwoosh.Pushwoosh
import com.pushwoosh.tags.TagsBundle
import java.util.List

class UpdateUser {
    public void afterUserUpdateProfile(User user) {
        val pushwoosh = Pushwoosh.getInstance()
        val tagsBuilder = TagsBundle.Builder()

        // Set list of favorite categories
        if (user.favoriteCategories != null && user.favoriteCategories.isNotEmpty()) {
            tagsBuilder.putList("favorite_categories", user.getFavoriteCategories())
        }

        // Set payment information
        tagsBuilder.putBoolean("is_subscribed", user.isSubscribed())
        tagsBuilder.putString("payment_status", user.getPaymentStatus())
        tagsBuilder.putString("billing_address", user.getBillingAddress())

        // Build and send tags
        pushwoosh.setTags(tagsBuilder.build())
    }
}
```
</TabItem>
<TabItem label="Java">
```java
import com.pushwoosh.Pushwoosh;
import com.pushwoosh.tags.TagsBundle;
import java.util.List;

public class UpdateUser {
    public void afterUserUpdateProfile(User user) {
        Pushwoosh pushwoosh = Pushwoosh.getInstance();
        TagsBundle.Builder tagsBuilder = TagsBundle.Builder();

        // Set list of favorite categories
        if (user.getFavoriteCategories() != null && !user.getFavoriteCategories().isEmpty()) {
            tagsBuilder.putList("favorite_categories", user.getFavoriteCategories());
        }

        // Set payment information
        tagsBuilder.putBoolean("is_subscribed", user.isSubscribed());
        tagsBuilder.putString("payment_status", user.getPaymentStatus());
        tagsBuilder.putString("billing_address", user.getBillingAddress());

        // Build and send tags
        pushwoosh.setTags(tagsBuilder.build());
    }
}
```
</TabItem>
</Tabs>

### Événements

Les événements sont des actions ou des occurrences spécifiques de l'utilisateur au sein de l'application qui peuvent être suivies pour analyser le comportement et déclencher des messages ou des actions correspondants

<Tabs syncKey="code-example">
<TabItem label="Kotlin">
```kotlin
import com.pushwoosh.Pushwoosh
import com.pushwoosh.inapp.InAppManager
import com.pushwoosh.tags.TagsBundle
import java.util.Date

class Registration {

    public void afterUserLogin(User user) {
        if (user.getUserName() != null && user.getLastLoginDate() != null) {
            val attributes = TagsBundle.Builder()
                .putString("name", user.getUserName())
                .putDate("last_login", user.getLastLoginDate())
                .build()
            
            InAppManager.getInstance().postEvent("login", attributes)
        }
    }

    public void afterUserPurchase(User user, Product product) {
        Pushwoosh pushwoosh = Pushwoosh.getInstance()

        // Track purchase event
        val purchaseAttributes = TagsBundle.Builder()
            .putString("product_id", product.getId())
            .putString("product_name", product.getName())
            .putDouble("price", product.getPrice())
            .putInt("quantity", product.getQuantity())
            .build()
        
        InAppManager.getInstance().postEvent("purchase", purchaseAttributes)

        // Set user tags
        val tagsBuilder = TagsBundle.Builder()
        tagsBuilder.putDate("last_purchase_date", Date())
        val lifetimeSpend = getCurrentLifetimeSpend() + product.getPrice()
        tagsBuilder.putDouble("lifetime_spend", getCurrentLifetimeSpend())
        pushwoosh.setTags(tagsBuilder.build())
    }
}
```
</TabItem>
<TabItem label="Java">
```java
import com.pushwoosh.Pushwoosh;
import com.pushwoosh.tags.TagsBundle;
import java.util.Date;

public class Registration {

    public void afterUserLogin(User user) {
        if (user.getUserName() != null && user.getLastLoginDate() != null) {
            TagsBundle attributes = new TagsBundle.Builder()
                .putString("name", user.getUserName())
                .putDate("last_login", user.getLastLoginDate())
                .build();

            Pushwoosh.getInstance().postEvent("login", attributes);
        }
    }

    public void afterUserPurchase(User user, Product product) {
        Pushwoosh pushwoosh = Pushwoosh.getInstance();

        // Track purchase event
        TagsBundle purchaseAttributes = new TagsBundle.Builder()
            .putString("product_id", product.getId())
            .putString("product_name", product.getName())
            .putDouble("price", product.getPrice())
            .putInt("quantity", product.getQuantity())
            .build();

        Pushwoosh.getInstance().postEvent("purchase", purchaseAttributes);

        // Set user tags
        TagsBundle.Builder tagsBuilder = new TagsBundle.Builder();
        tagsBuilder.putDate("last_purchase_date", new Date());
        double lifetimeSpend = getCurrentLifetimeSpend() + product.getPrice();
        tagsBuilder.putDouble("lifetime_spend", getCurrentLifetimeSpend());
        pushwoosh.setTags(tagsBuilder.build());
    }
}
```
</TabItem>
</Tabs>

### Rich Media

Le Rich Media fait référence à du contenu interactif et multimédia, tel que des images, des vidéos ou du HTML, utilisé dans les notifications et les messages in-app pour améliorer l'engagement de l'utilisateur


Pour activer la fonctionnalité **Modal Rich Media**, vous devez la configurer dans le fichier `AndroidManifest.xml` de votre application en ajoutant l'entrée de métadonnées suivante :

```xml title="AndroidManifest.xml"
<meta-data
    android:name="com.pushwoosh.rich_media_type"
    android:value="Modal" />
```

<Tabs syncKey="code-example">
<TabItem label="Kotlin">
```kotlin
import android.util.Log
import com.pushwoosh.richmedia.RichMedia
import com.pushwoosh.richmedia.RichMediaManager
import com.pushwoosh.richmedia.RichMediaPresentingDelegate
import com.pushwoosh.inapp.view.config.ModalRichmediaConfig
import com.pushwoosh.inapp.view.config.enums.*

class MainActivity : AppCompatActivity(), RichMediaPresentingDelegate {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        RichMediaManager.setDelegate(this)

        // Configure the modal rich media
        val config = ModalRichmediaConfig()
            .setViewPosition(ModalRichMediaViewPosition.BOTTOM)
            .setPresentAnimationType(ModalRichMediaPresentAnimationType.SLIDE_UP)
            .setDismissAnimationType(ModalRichMediaDismissAnimationType.SLIDE_DOWN)
            
        // Apply the configuration
        RichMediaManager.setDefaultRichMediaConfig(config)
    }
    
    override fun shouldPresent(richMedia: RichMedia): Boolean {
        Log.d("Pushwoosh", "Rich media will be presented with: ${richMedia.content}")
        return true
    }

    override fun onPresent(richMedia: RichMedia) {
        Log.d("Pushwoosh", "Rich media has been presented: ${richMedia.content}")
    }

    override fun onClose(richMedia: RichMedia) {
        Log.d("Pushwoosh", "Rich media has been closed: ${richMedia.content}")
    }

    override fun onError(richMedia: RichMedia, pushwooshException: PushwooshException) {
        Log.e("Pushwoosh", "Failed to present rich media: ${richMedia.content}. Error: ${pushwooshException.message}")
    }
}
```
</TabItem>
<TabItem label="Java">
```java
import android.util.Log;
import com.pushwoosh.richmedia.RichMedia;
import com.pushwoosh.richmedia.RichMediaManager;
import com.pushwoosh.richmedia.RichMediaPresentingDelegate;
import com.pushwoosh.inapp.view.config.ModalRichmediaConfig;
import com.pushwoosh.inapp.view.config.enums.*;

public class MainActivity extends AppCompatActivity implements RichMediaPresentingDelegate {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        RichMediaManager.setDelegate(this);

        // Configure the modal rich media
        ModalRichmediaConfig config = new ModalRichmediaConfig()
            .setViewPosition(ModalRichMediaViewPosition.BOTTOM)
            .setPresentAnimationType(ModalRichMediaPresentAnimationType.SLIDE_UP)
            .setDismissAnimationType(ModalRichMediaDismissAnimationType.SLIDE_DOWN);

        // Apply the configuration
        RichMediaManager.setDefaultRichMediaConfig(config);
    }

    @Override
    public boolean shouldPresent(RichMedia richMedia) {
        Log.d("Pushwoosh", "Rich media will be presented with: " + richMedia.getContent());
        return true;
    }

    @Override
    public void onPresent(RichMedia richMedia) {
        Log.d("Pushwoosh", "Rich media has been presented: " + richMedia.getContent());
    }

    @Override
    public void onClose(RichMedia richMedia) {
        Log.d("Pushwoosh", "Rich media has been closed: " + richMedia.getContent());
    }

    @Override
    public void onError(RichMedia richMedia, PushwooshException pushwooshException) {
        Log.e("Pushwoosh", "Failed to present rich media: " + richMedia.getContent() + ". Error: " + pushwooshException.getMessage());
    }
}
```
</TabItem>
</Tabs>

## Dépannage

Si vous rencontrez des problèmes lors du processus d'intégration, veuillez vous référer à la section [support et communauté](/fr/developer/pushwoosh-sdk/support-and-community).