Guide d'intégration du canal EngageLab
Obtenir les informations de l'application
Créez une application dans la console. Après la création de l'application, une AppKey est automatiquement générée pour identifier l'application. Pour plus d'informations, consultez Paramètres de l'application.
Importation des bibliothèques
- Méthode manuelle
Importez le fichier mt-sdk-x.x.x.aar du dossier libs dans le répertoire libs.
Importez th-xxx-x.x.x.aar sous le package libs dans le répertoire libs.
Importez le fichier mt-sdk-x.x.x.aar du dossier libs dans le répertoire libs.
Importez th-xxx-x.x.x.aar sous le package libs dans le répertoire libs.
Afficher ce bloc de code dans la fenêtre flottante
- Méthode automatique
Groovy (build.gradle):
dependencies {
// Obligatoire : package principal
implementation 'com.engagelab:engagelab:5.3.0' // Ici, nous utilisons la version 5.3.0 à titre d'exemple.
// Optionnel : fournisseur Google
implementation 'com.engagelab.plugin:google:5.3.0' // Ici, nous utilisons la version 5.3.0 à titre d'exemple.
// Optionnel : fournisseur Honor
implementation 'com.engagelab.plugin:honor:5.3.0' // Ici, nous utilisons la version 5.3.0 à titre d'exemple.
implementation 'com.engagelab.plugin:honor_th_push:5.3.0' // Ici, nous utilisons la version 5.3.0 à titre d'exemple.
// Optionnel : fournisseur Huawei
implementation 'com.engagelab.plugin:huawei:5.3.0' // Ici, nous utilisons la version 5.3.0 à titre d'exemple.
// Optionnel : fournisseur Xiaomi, version chinoise
implementation 'com.engagelab.plugin:mi:5.3.0' // Ici, nous utilisons la version 5.3.0 à titre d'exemple.
// Optionnel : fournisseur Meizu
implementation 'com.engagelab.plugin:meizu:5.3.0' // Ici, nous utilisons la version 5.3.0 à titre d'exemple.
// Fournisseur Meizu : à partir du SDK 5.2.0, l'intégration de Meizu nécessite « com.engagelab.plugin:meizu_th_push » ; non requis avant 5.2.0.
implementation 'com.engagelab.plugin:meizu_th_push:5.3.0' // Ici, nous utilisons la version 5.3.0 à titre d'exemple.
// Optionnel : fournisseur Oppo
implementation 'com.engagelab.plugin:oppo:5.3.0' // Ici, nous utilisons la version 5.3.0 à titre d'exemple.
implementation 'com.engagelab.plugin:oppo_th_push:5.3.0' // Ici, nous utilisons la version 5.3.0 à titre d'exemple.
// Optionnel : fournisseur Vivo
implementation 'com.engagelab.plugin:vivo:5.3.0' // Ici, nous utilisons la version 5.3.0 à titre d'exemple.
// Optionnel : fonction de diffusion vocale
implementation 'com.engagelab.plugin:oth_sound:5.3.0' // Ici, nous utilisons la version 5.3.0 à titre d'exemple.
}
dependencies {
// Obligatoire : package principal
implementation 'com.engagelab:engagelab:5.3.0' // Ici, nous utilisons la version 5.3.0 à titre d'exemple.
// Optionnel : fournisseur Google
implementation 'com.engagelab.plugin:google:5.3.0' // Ici, nous utilisons la version 5.3.0 à titre d'exemple.
// Optionnel : fournisseur Honor
implementation 'com.engagelab.plugin:honor:5.3.0' // Ici, nous utilisons la version 5.3.0 à titre d'exemple.
implementation 'com.engagelab.plugin:honor_th_push:5.3.0' // Ici, nous utilisons la version 5.3.0 à titre d'exemple.
// Optionnel : fournisseur Huawei
implementation 'com.engagelab.plugin:huawei:5.3.0' // Ici, nous utilisons la version 5.3.0 à titre d'exemple.
// Optionnel : fournisseur Xiaomi, version chinoise
implementation 'com.engagelab.plugin:mi:5.3.0' // Ici, nous utilisons la version 5.3.0 à titre d'exemple.
// Optionnel : fournisseur Meizu
implementation 'com.engagelab.plugin:meizu:5.3.0' // Ici, nous utilisons la version 5.3.0 à titre d'exemple.
// Fournisseur Meizu : à partir du SDK 5.2.0, l'intégration de Meizu nécessite « com.engagelab.plugin:meizu_th_push » ; non requis avant 5.2.0.
implementation 'com.engagelab.plugin:meizu_th_push:5.3.0' // Ici, nous utilisons la version 5.3.0 à titre d'exemple.
// Optionnel : fournisseur Oppo
implementation 'com.engagelab.plugin:oppo:5.3.0' // Ici, nous utilisons la version 5.3.0 à titre d'exemple.
implementation 'com.engagelab.plugin:oppo_th_push:5.3.0' // Ici, nous utilisons la version 5.3.0 à titre d'exemple.
// Optionnel : fournisseur Vivo
implementation 'com.engagelab.plugin:vivo:5.3.0' // Ici, nous utilisons la version 5.3.0 à titre d'exemple.
// Optionnel : fonction de diffusion vocale
implementation 'com.engagelab.plugin:oth_sound:5.3.0' // Ici, nous utilisons la version 5.3.0 à titre d'exemple.
}
Afficher ce bloc de code dans la fenêtre flottante
Kotlin DSL (build.gradle.kts):
dependencies {
// Obligatoire : package principal
implementation("com.engagelab:engagelab:5.3.0") // Ici, nous utilisons la version 5.3.0 à titre d'exemple.
// Optionnel : fournisseur Google
implementation("com.engagelab.plugin:google:5.3.0") // Ici, nous utilisons la version 5.3.0 à titre d'exemple.
// Optionnel : fournisseur Honor
implementation("com.engagelab.plugin:honor:5.3.0") // Ici, nous utilisons la version 5.3.0 à titre d'exemple.
implementation("com.engagelab.plugin:honor_th_push:5.3.0") // Ici, nous utilisons la version 5.3.0 à titre d'exemple.
// Optionnel : fournisseur Huawei
implementation("com.engagelab.plugin:huawei:5.3.0") // Ici, nous utilisons la version 5.3.0 à titre d'exemple.
// Optionnel : fournisseur Xiaomi, version chinoise
implementation("com.engagelab.plugin:mi:5.3.0") // Ici, nous utilisons la version 5.3.0 à titre d'exemple.
// Optionnel : fournisseur Meizu
implementation("com.engagelab.plugin:meizu:5.3.0") // Ici, nous utilisons la version 5.3.0 à titre d'exemple.
// Fournisseur Meizu : à partir du SDK 5.2.0, l'intégration de Meizu nécessite « com.engagelab.plugin:meizu_th_push » ; non requis avant 5.2.0.
implementation("com.engagelab.plugin:meizu_th_push:5.3.0") // Ici, nous utilisons la version 5.3.0 à titre d'exemple.
// Optionnel : fournisseur Oppo
implementation("com.engagelab.plugin:oppo:5.3.0") // Ici, nous utilisons la version 5.3.0 à titre d'exemple.
implementation("com.engagelab.plugin:oppo_th_push:5.3.0") // Ici, nous utilisons la version 5.3.0 à titre d'exemple.
// Optionnel : fournisseur Vivo
implementation("com.engagelab.plugin:vivo:5.3.0") // Ici, nous utilisons la version 5.3.0 à titre d'exemple.
// Optionnel : fonction de diffusion vocale
implementation("com.engagelab.plugin:oth_sound:5.3.0") // Ici, nous utilisons la version 5.3.0 à titre d'exemple.
}
dependencies {
// Obligatoire : package principal
implementation("com.engagelab:engagelab:5.3.0") // Ici, nous utilisons la version 5.3.0 à titre d'exemple.
// Optionnel : fournisseur Google
implementation("com.engagelab.plugin:google:5.3.0") // Ici, nous utilisons la version 5.3.0 à titre d'exemple.
// Optionnel : fournisseur Honor
implementation("com.engagelab.plugin:honor:5.3.0") // Ici, nous utilisons la version 5.3.0 à titre d'exemple.
implementation("com.engagelab.plugin:honor_th_push:5.3.0") // Ici, nous utilisons la version 5.3.0 à titre d'exemple.
// Optionnel : fournisseur Huawei
implementation("com.engagelab.plugin:huawei:5.3.0") // Ici, nous utilisons la version 5.3.0 à titre d'exemple.
// Optionnel : fournisseur Xiaomi, version chinoise
implementation("com.engagelab.plugin:mi:5.3.0") // Ici, nous utilisons la version 5.3.0 à titre d'exemple.
// Optionnel : fournisseur Meizu
implementation("com.engagelab.plugin:meizu:5.3.0") // Ici, nous utilisons la version 5.3.0 à titre d'exemple.
// Fournisseur Meizu : à partir du SDK 5.2.0, l'intégration de Meizu nécessite « com.engagelab.plugin:meizu_th_push » ; non requis avant 5.2.0.
implementation("com.engagelab.plugin:meizu_th_push:5.3.0") // Ici, nous utilisons la version 5.3.0 à titre d'exemple.
// Optionnel : fournisseur Oppo
implementation("com.engagelab.plugin:oppo:5.3.0") // Ici, nous utilisons la version 5.3.0 à titre d'exemple.
implementation("com.engagelab.plugin:oppo_th_push:5.3.0") // Ici, nous utilisons la version 5.3.0 à titre d'exemple.
// Optionnel : fournisseur Vivo
implementation("com.engagelab.plugin:vivo:5.3.0") // Ici, nous utilisons la version 5.3.0 à titre d'exemple.
// Optionnel : fonction de diffusion vocale
implementation("com.engagelab.plugin:oth_sound:5.3.0") // Ici, nous utilisons la version 5.3.0 à titre d'exemple.
}
Afficher ce bloc de code dans la fenêtre flottante
2. Configurer build.gradle
Groovy (build.gradle):
plugins {
id 'com.android.application'
}
android {
...
defaultConfig {
// Nom du package de l'application, doit être identique à celui de la console
applicationId "com.engagelab.app"
...
manifestPlaceholders = [
// AppKey, doit être identique à celui de la console ; relation un-à-un avec packageName
ENGAGELAB_PRIVATES_APPKEY : "YourAppKey",
// appChannel EngageLab, utilisé pour les statistiques de canal
ENGAGELAB_PRIVATES_CHANNEL: "developer",
// Processus EngageLab, le processus où le SDK EngageLab fonctionne ; note : commence par
ENGAGELAB_PRIVATES_PROCESS: ":remote",
]
}
}
dependencies {
implementation fileTree(include: ['*.jar', '*.aar'], dir: 'libs')
}
plugins {
id 'com.android.application'
}
android {
...
defaultConfig {
// Nom du package de l'application, doit être identique à celui de la console
applicationId "com.engagelab.app"
...
manifestPlaceholders = [
// AppKey, doit être identique à celui de la console ; relation un-à-un avec packageName
ENGAGELAB_PRIVATES_APPKEY : "YourAppKey",
// appChannel EngageLab, utilisé pour les statistiques de canal
ENGAGELAB_PRIVATES_CHANNEL: "developer",
// Processus EngageLab, le processus où le SDK EngageLab fonctionne ; note : commence par
ENGAGELAB_PRIVATES_PROCESS: ":remote",
]
}
}
dependencies {
implementation fileTree(include: ['*.jar', '*.aar'], dir: 'libs')
}
Afficher ce bloc de code dans la fenêtre flottante
Kotlin DSL (build.gradle.kts):
plugins {
alias(libs.plugins.android.application)
}
android {
// ...
defaultConfig {
// Nom du package de l'application, doit être identique à celui de la console
applicationId = "com.engagelab.app"
// ...
manifestPlaceholders.putAll(mapOf(
// AppKey, doit être identique à celui de la console ; relation un-à-un avec packageName
"ENGAGELAB_PRIVATES_APPKEY" to "YourAppKey",
// appChannel EngageLab, utilisé pour les statistiques de canal
"ENGAGELAB_PRIVATES_CHANNEL" to "developer",
// Processus EngageLab, le processus où le SDK EngageLab fonctionne ; note : commence par :
"ENGAGELAB_PRIVATES_PROCESS" to ":remote"
))
}
}
dependencies {
implementation(fileTree(mapOf("include" to listOf("*.jar", "*.aar"), "dir" to "libs")))
}
plugins {
alias(libs.plugins.android.application)
}
android {
// ...
defaultConfig {
// Nom du package de l'application, doit être identique à celui de la console
applicationId = "com.engagelab.app"
// ...
manifestPlaceholders.putAll(mapOf(
// AppKey, doit être identique à celui de la console ; relation un-à-un avec packageName
"ENGAGELAB_PRIVATES_APPKEY" to "YourAppKey",
// appChannel EngageLab, utilisé pour les statistiques de canal
"ENGAGELAB_PRIVATES_CHANNEL" to "developer",
// Processus EngageLab, le processus où le SDK EngageLab fonctionne ; note : commence par :
"ENGAGELAB_PRIVATES_PROCESS" to ":remote"
))
}
}
dependencies {
implementation(fileTree(mapOf("include" to listOf("*.jar", "*.aar"), "dir" to "libs")))
}
Afficher ce bloc de code dans la fenêtre flottante
Créer les composants requis
Java:
package com.engagelab.app.component;
import com.engagelab.privates.common.component.MTCommonService;
/**
* Les développeurs peuvent étendre MTCommonService pour prolonger la longévité de la connexion longue.
*
* Une implémentation vide suffit.
*/
public class UserService extends MTCommonService {
}
package com.engagelab.app.component;
import com.engagelab.privates.common.component.MTCommonService;
/**
* Les développeurs peuvent étendre MTCommonService pour prolonger la longévité de la connexion longue.
*
* Une implémentation vide suffit.
*/
public class UserService extends MTCommonService {
}
Afficher ce bloc de code dans la fenêtre flottante
Kotlin:
package com.engagelab.app.component
import com.engagelab.privates.common.component.MTCommonService
class UserService : MTCommonService() {}
package com.engagelab.app.component
import com.engagelab.privates.common.component.MTCommonService
class UserService : MTCommonService() {}
Afficher ce bloc de code dans la fenêtre flottante
Java:
package com.engagelab.app.component;
import android.content.Context;
import android.widget.Toast;
import java.util.Arrays;
import com.engagelab.app.common.ExampleGlobal;
import com.engagelab.app.listener.StatusObserver;
import com.engagelab.app.log.ExampleLogger;
import com.engagelab.privates.common.component.MTCommonReceiver;
import com.engagelab.privates.core.api.MTCorePrivatesApi;
import com.engagelab.privates.core.api.WakeMessage;
import com.engagelab.privates.push.api.CustomMessage;
import com.engagelab.privates.push.api.MobileNumberMessage;
import com.engagelab.privates.push.api.NotificationMessage;
import com.engagelab.privates.push.api.PlatformTokenMessage;
/**
* Les développeurs peuvent étendre MTCommonReceiver pour recevoir les callbacks de méthodes du SDK.
*
* Tous les callbacks sont dans le thread principal.
*/
public class UserReceiver extends MTCommonReceiver {
private static final String TAG = "UserReceiver";
/**
* Callback pour l'état de l'interrupteur de notification de l'application.
*
* @param context Non nul
* @param enable État de l'interrupteur de notification, true pour activé, false pour désactivé
*/
@Override
public void onNotificationStatus(Context context, boolean enable) {
ExampleLogger.i(TAG, "onNotificationStatus:" + enable);
Toast.makeText(context.getApplicationContext(), "onNotificationStatus " + enable, Toast.LENGTH_SHORT).show();
ExampleGlobal.isNotificationEnable = enable;
if (StatusObserver.getInstance().getListener() != null) {
StatusObserver.getInstance().getListener().onNotificationStatus(enable);
}
}
/**
* Callback de l'état de la connexion longue.
*
* @param context Non nul
* @param enable Si la connexion est établie
*/
@Override
public void onConnectStatus(Context context, boolean enable) {
ExampleLogger.i(TAG, "onConnectState:" + enable);
Toast.makeText(context.getApplicationContext(), "onConnectStatus " + enable, Toast.LENGTH_SHORT).show();
ExampleGlobal.isConnectEnable = enable;
if (StatusObserver.getInstance().getListener() != null) {
StatusObserver.getInstance().getListener().onConnectStatus(enable);
}
// Obtenir le registrationId lorsque la connexion longue est établie
if (enable) {
String registrationId = MTCorePrivatesApi.getRegistrationId(context);
ExampleLogger.i(TAG, "registrationId:" + registrationId);
}
}
/**
* Callback lors de l'arrivée d'un message de notification.
*
* @param context Non nul
* @param notificationMessage Message de notification
*/
@Override
public void onNotificationArrived(Context context, NotificationMessage notificationMessage) {
ExampleLogger.i(TAG, "onNotificationArrived:" + notificationMessage.toString());
}
/**
* Callback pour les messages de notification non affichés au premier plan.
*
* @param context Non nul
* @param notificationMessage Message de notification
*/
@Override
public void onNotificationUnShow(Context context, NotificationMessage notificationMessage) {
ExampleLogger.i(TAG, "onNotificationUnShow:" + notificationMessage.toString());
}
/**
* Callback lors du clic sur un message de notification.
*
* @param context Non nul
* @param notificationMessage Message de notification
*/
@Override
public void onNotificationClicked(Context context, NotificationMessage notificationMessage) {
ExampleLogger.i(TAG, "onNotificationClicked:" + notificationMessage.toString());
}
/**
* Callback lors de la suppression d'un message de notification.
*
* @param context Non nul
* @param notificationMessage Message de notification
*/
@Override
public void onNotificationDeleted(Context context, NotificationMessage notificationMessage) {
ExampleLogger.i(TAG, "onNotificationDeleted:" + notificationMessage.toString());
}
/**
* Callback pour les messages personnalisés.
*
* @param context Non nul
* @param customMessage Message personnalisé
*/
@Override
public void onCustomMessage(Context context, CustomMessage customMessage) {
ExampleLogger.i(TAG, "onCustomMessage:" + customMessage.toString());
}
/**
* Callback pour le message de token du fournisseur.
*
* @param context Non nul
* @param platformTokenMessage Message de token du fournisseur
*/
@Override
public void onPlatformToken(Context context, PlatformTokenMessage platformTokenMessage) {
ExampleLogger.i(TAG, "onPlatformToken:" + platformTokenMessage.toString());
}
}
package com.engagelab.app.component;
import android.content.Context;
import android.widget.Toast;
import java.util.Arrays;
import com.engagelab.app.common.ExampleGlobal;
import com.engagelab.app.listener.StatusObserver;
import com.engagelab.app.log.ExampleLogger;
import com.engagelab.privates.common.component.MTCommonReceiver;
import com.engagelab.privates.core.api.MTCorePrivatesApi;
import com.engagelab.privates.core.api.WakeMessage;
import com.engagelab.privates.push.api.CustomMessage;
import com.engagelab.privates.push.api.MobileNumberMessage;
import com.engagelab.privates.push.api.NotificationMessage;
import com.engagelab.privates.push.api.PlatformTokenMessage;
/**
* Les développeurs peuvent étendre MTCommonReceiver pour recevoir les callbacks de méthodes du SDK.
*
* Tous les callbacks sont dans le thread principal.
*/
public class UserReceiver extends MTCommonReceiver {
private static final String TAG = "UserReceiver";
/**
* Callback pour l'état de l'interrupteur de notification de l'application.
*
* @param context Non nul
* @param enable État de l'interrupteur de notification, true pour activé, false pour désactivé
*/
@Override
public void onNotificationStatus(Context context, boolean enable) {
ExampleLogger.i(TAG, "onNotificationStatus:" + enable);
Toast.makeText(context.getApplicationContext(), "onNotificationStatus " + enable, Toast.LENGTH_SHORT).show();
ExampleGlobal.isNotificationEnable = enable;
if (StatusObserver.getInstance().getListener() != null) {
StatusObserver.getInstance().getListener().onNotificationStatus(enable);
}
}
/**
* Callback de l'état de la connexion longue.
*
* @param context Non nul
* @param enable Si la connexion est établie
*/
@Override
public void onConnectStatus(Context context, boolean enable) {
ExampleLogger.i(TAG, "onConnectState:" + enable);
Toast.makeText(context.getApplicationContext(), "onConnectStatus " + enable, Toast.LENGTH_SHORT).show();
ExampleGlobal.isConnectEnable = enable;
if (StatusObserver.getInstance().getListener() != null) {
StatusObserver.getInstance().getListener().onConnectStatus(enable);
}
// Obtenir le registrationId lorsque la connexion longue est établie
if (enable) {
String registrationId = MTCorePrivatesApi.getRegistrationId(context);
ExampleLogger.i(TAG, "registrationId:" + registrationId);
}
}
/**
* Callback lors de l'arrivée d'un message de notification.
*
* @param context Non nul
* @param notificationMessage Message de notification
*/
@Override
public void onNotificationArrived(Context context, NotificationMessage notificationMessage) {
ExampleLogger.i(TAG, "onNotificationArrived:" + notificationMessage.toString());
}
/**
* Callback pour les messages de notification non affichés au premier plan.
*
* @param context Non nul
* @param notificationMessage Message de notification
*/
@Override
public void onNotificationUnShow(Context context, NotificationMessage notificationMessage) {
ExampleLogger.i(TAG, "onNotificationUnShow:" + notificationMessage.toString());
}
/**
* Callback lors du clic sur un message de notification.
*
* @param context Non nul
* @param notificationMessage Message de notification
*/
@Override
public void onNotificationClicked(Context context, NotificationMessage notificationMessage) {
ExampleLogger.i(TAG, "onNotificationClicked:" + notificationMessage.toString());
}
/**
* Callback lors de la suppression d'un message de notification.
*
* @param context Non nul
* @param notificationMessage Message de notification
*/
@Override
public void onNotificationDeleted(Context context, NotificationMessage notificationMessage) {
ExampleLogger.i(TAG, "onNotificationDeleted:" + notificationMessage.toString());
}
/**
* Callback pour les messages personnalisés.
*
* @param context Non nul
* @param customMessage Message personnalisé
*/
@Override
public void onCustomMessage(Context context, CustomMessage customMessage) {
ExampleLogger.i(TAG, "onCustomMessage:" + customMessage.toString());
}
/**
* Callback pour le message de token du fournisseur.
*
* @param context Non nul
* @param platformTokenMessage Message de token du fournisseur
*/
@Override
public void onPlatformToken(Context context, PlatformTokenMessage platformTokenMessage) {
ExampleLogger.i(TAG, "onPlatformToken:" + platformTokenMessage.toString());
}
}
Afficher ce bloc de code dans la fenêtre flottante
Kotlin:
package com.engagelab.app.component
import android.content.Context
import android.widget.Toast
import com.engagelab.app.common.ExampleGlobal
import com.engagelab.app.listener.StatusObserver
import com.engagelab.app.log.ExampleLogger
import com.engagelab.privates.common.component.MTCommonReceiver
import com.engagelab.privates.core.api.MTCorePrivatesApi
import com.engagelab.privates.push.api.CustomMessage
import com.engagelab.privates.push.api.NotificationMessage
import com.engagelab.privates.push.api.PlatformTokenMessage
/**
* Les développeurs peuvent étendre MTCommonReceiver pour recevoir les callbacks de méthodes du SDK.
* Tous les callbacks sont dans le thread principal.
*/
class UserReceiver : MTCommonReceiver() {
companion object {
private const val TAG = "UserReceiver"
}
/**
* Callback pour l'état de l'interrupteur de notification de l'application.
*
* @param context Non nul
* @param enable État de l'interrupteur de notification, true pour activé, false pour désactivé
*/
override fun onNotificationStatus(context: Context, enable: Boolean) {
ExampleLogger.i(TAG, "onNotificationStatus:$enable")
Toast.makeText(context.applicationContext, "onNotificationStatus $enable", Toast.LENGTH_SHORT).show()
ExampleGlobal.isNotificationEnable = enable
StatusObserver.getInstance().listener?.onNotificationStatus(enable)
}
/**
* Callback de l'état de la connexion longue.
*
* @param context Non nul
* @param enable Si la connexion est établie
*/
override fun onConnectStatus(context: Context, enable: Boolean) {
ExampleLogger.i(TAG, "onConnectState:$enable")
Toast.makeText(context.applicationContext, "onConnectStatus $enable", Toast.LENGTH_SHORT).show()
ExampleGlobal.isConnectEnable = enable
StatusObserver.getInstance().listener?.onConnectStatus(enable)
// Obtenir le registrationId lorsque la connexion longue est établie
if (enable) {
val registrationId = MTCorePrivatesApi.getRegistrationId(context)
ExampleLogger.i(TAG, "registrationId:$registrationId")
}
}
/**
* Callback lors de l'arrivée d'un message de notification.
*
* @param context Non nul
* @param notificationMessage Message de notification
*/
override fun onNotificationArrived(context: Context, notificationMessage: NotificationMessage) {
ExampleLogger.i(TAG, "onNotificationArrived:${notificationMessage.toString()}")
}
/**
* Callback pour les messages de notification non affichés au premier plan.
*
* @param context Non nul
* @param notificationMessage Message de notification
*/
override fun onNotificationUnShow(context: Context, notificationMessage: NotificationMessage) {
ExampleLogger.i(TAG, "onNotificationUnShow:${notificationMessage.toString()}")
}
/**
* Callback lors du clic sur un message de notification.
*
* @param context Non nul
* @param notificationMessage Message de notification
*/
override fun onNotificationClicked(context: Context, notificationMessage: NotificationMessage) {
ExampleLogger.i(TAG, "onNotificationClicked:${notificationMessage.toString()}")
}
/**
* Callback lors de la suppression d'un message de notification.
*
* @param context Non nul
* @param notificationMessage Message de notification
*/
override fun onNotificationDeleted(context: Context, notificationMessage: NotificationMessage) {
ExampleLogger.i(TAG, "onNotificationDeleted:${notificationMessage.toString()}")
}
/**
* Callback pour les messages personnalisés.
*
* @param context Non nul
* @param customMessage Message personnalisé
*/
override fun onCustomMessage(context: Context, customMessage: CustomMessage) {
ExampleLogger.i(TAG, "onCustomMessage:${customMessage.toString()}")
}
/**
* Callback pour le message de token du fournisseur.
*
* @param context Non nul
* @param platformTokenMessage Message de token du fournisseur
*/
override fun onPlatformToken(context: Context, platformTokenMessage: PlatformTokenMessage) {
ExampleLogger.i(TAG, "onPlatformToken:${platformTokenMessage.toString()}")
}
}
package com.engagelab.app.component
import android.content.Context
import android.widget.Toast
import com.engagelab.app.common.ExampleGlobal
import com.engagelab.app.listener.StatusObserver
import com.engagelab.app.log.ExampleLogger
import com.engagelab.privates.common.component.MTCommonReceiver
import com.engagelab.privates.core.api.MTCorePrivatesApi
import com.engagelab.privates.push.api.CustomMessage
import com.engagelab.privates.push.api.NotificationMessage
import com.engagelab.privates.push.api.PlatformTokenMessage
/**
* Les développeurs peuvent étendre MTCommonReceiver pour recevoir les callbacks de méthodes du SDK.
* Tous les callbacks sont dans le thread principal.
*/
class UserReceiver : MTCommonReceiver() {
companion object {
private const val TAG = "UserReceiver"
}
/**
* Callback pour l'état de l'interrupteur de notification de l'application.
*
* @param context Non nul
* @param enable État de l'interrupteur de notification, true pour activé, false pour désactivé
*/
override fun onNotificationStatus(context: Context, enable: Boolean) {
ExampleLogger.i(TAG, "onNotificationStatus:$enable")
Toast.makeText(context.applicationContext, "onNotificationStatus $enable", Toast.LENGTH_SHORT).show()
ExampleGlobal.isNotificationEnable = enable
StatusObserver.getInstance().listener?.onNotificationStatus(enable)
}
/**
* Callback de l'état de la connexion longue.
*
* @param context Non nul
* @param enable Si la connexion est établie
*/
override fun onConnectStatus(context: Context, enable: Boolean) {
ExampleLogger.i(TAG, "onConnectState:$enable")
Toast.makeText(context.applicationContext, "onConnectStatus $enable", Toast.LENGTH_SHORT).show()
ExampleGlobal.isConnectEnable = enable
StatusObserver.getInstance().listener?.onConnectStatus(enable)
// Obtenir le registrationId lorsque la connexion longue est établie
if (enable) {
val registrationId = MTCorePrivatesApi.getRegistrationId(context)
ExampleLogger.i(TAG, "registrationId:$registrationId")
}
}
/**
* Callback lors de l'arrivée d'un message de notification.
*
* @param context Non nul
* @param notificationMessage Message de notification
*/
override fun onNotificationArrived(context: Context, notificationMessage: NotificationMessage) {
ExampleLogger.i(TAG, "onNotificationArrived:${notificationMessage.toString()}")
}
/**
* Callback pour les messages de notification non affichés au premier plan.
*
* @param context Non nul
* @param notificationMessage Message de notification
*/
override fun onNotificationUnShow(context: Context, notificationMessage: NotificationMessage) {
ExampleLogger.i(TAG, "onNotificationUnShow:${notificationMessage.toString()}")
}
/**
* Callback lors du clic sur un message de notification.
*
* @param context Non nul
* @param notificationMessage Message de notification
*/
override fun onNotificationClicked(context: Context, notificationMessage: NotificationMessage) {
ExampleLogger.i(TAG, "onNotificationClicked:${notificationMessage.toString()}")
}
/**
* Callback lors de la suppression d'un message de notification.
*
* @param context Non nul
* @param notificationMessage Message de notification
*/
override fun onNotificationDeleted(context: Context, notificationMessage: NotificationMessage) {
ExampleLogger.i(TAG, "onNotificationDeleted:${notificationMessage.toString()}")
}
/**
* Callback pour les messages personnalisés.
*
* @param context Non nul
* @param customMessage Message personnalisé
*/
override fun onCustomMessage(context: Context, customMessage: CustomMessage) {
ExampleLogger.i(TAG, "onCustomMessage:${customMessage.toString()}")
}
/**
* Callback pour le message de token du fournisseur.
*
* @param context Non nul
* @param platformTokenMessage Message de token du fournisseur
*/
override fun onPlatformToken(context: Context, platformTokenMessage: PlatformTokenMessage) {
ExampleLogger.i(TAG, "onPlatformToken:${platformTokenMessage.toString()}")
}
}
Afficher ce bloc de code dans la fenêtre flottante
4. Configurer AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
package="com.engagelab.app">
<!-- Obligatoire : permission Internet -->
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<!-- Optionnel : vibration pour les notifications -->
<uses-permission android:name="android.permission.VIBRATE" />
<application
android:name="com.engagelab.app.MainApplication"
android:allowBackup="false"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/Theme.MT"
android:usesCleartextTraffic="true"
tools:targetApi="m"> <!-- Si vous utilisez des requêtes HTTP, autorisez HTTP -->
.....................................................................................................
<!-- En raison de la fonctionnalité de connexion longue de cette classe, l'optimisation d'économie d'énergie du fabricant peut tuer directement le service avec un nom de package contenant "Engagelab". -->
<!-- Par conséquent, les développeurs doivent étendre com.engagelab.app.component.MTCommonService pour améliorer le taux de survie de la connexion longue et augmenter le taux d'arrivée des messages. -->
<service
android:name="com.engagelab.app.component.UserService"
android:exported="false"
android:process="${ENGAGELAB_PRIVATES_PROCESS}">
<intent-filter>
<action android:name="com.engagelab.privates.intent.USER_SERVICE" />
</intent-filter>
</service>
<!-- Utilisé pour recevoir les callbacks métier EngageLab, incluant état de la connexion longue/interrupteur de notification/arrivée de message de notification/clic sur message de notification/suppression de message de notification/message personnalisé/callback de token fournisseur -->
<!-- Pas besoin de configurer des sous-processus ; ce callback est dans le processus principal pour faciliter les opérations métier -->
<receiver
android:name="com.engagelab.app.component.UserReceiver"
android:exported="false">
<intent-filter>
<action android:name="com.engagelab.privates.intent.USER_RECEIVER" />
</intent-filter>
</receiver>
</application>
</manifest>
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
package="com.engagelab.app">
<!-- Obligatoire : permission Internet -->
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<!-- Optionnel : vibration pour les notifications -->
<uses-permission android:name="android.permission.VIBRATE" />
<application
android:name="com.engagelab.app.MainApplication"
android:allowBackup="false"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/Theme.MT"
android:usesCleartextTraffic="true"
tools:targetApi="m"> <!-- Si vous utilisez des requêtes HTTP, autorisez HTTP -->
.....................................................................................................
<!-- En raison de la fonctionnalité de connexion longue de cette classe, l'optimisation d'économie d'énergie du fabricant peut tuer directement le service avec un nom de package contenant "Engagelab". -->
<!-- Par conséquent, les développeurs doivent étendre com.engagelab.app.component.MTCommonService pour améliorer le taux de survie de la connexion longue et augmenter le taux d'arrivée des messages. -->
<service
android:name="com.engagelab.app.component.UserService"
android:exported="false"
android:process="${ENGAGELAB_PRIVATES_PROCESS}">
<intent-filter>
<action android:name="com.engagelab.privates.intent.USER_SERVICE" />
</intent-filter>
</service>
<!-- Utilisé pour recevoir les callbacks métier EngageLab, incluant état de la connexion longue/interrupteur de notification/arrivée de message de notification/clic sur message de notification/suppression de message de notification/message personnalisé/callback de token fournisseur -->
<!-- Pas besoin de configurer des sous-processus ; ce callback est dans le processus principal pour faciliter les opérations métier -->
<receiver
android:name="com.engagelab.app.component.UserReceiver"
android:exported="false">
<intent-filter>
<action android:name="com.engagelab.privates.intent.USER_RECEIVER" />
</intent-filter>
</receiver>
</application>
</manifest>
Afficher ce bloc de code dans la fenêtre flottante
5. Configuration de l'environnement
Java:
package com.engagelab.app;
import android.app.Application;
import com.engagelab.privates.core.api.Address;
import com.engagelab.privates.core.api.MTCorePrivatesApi;
import com.engagelab.privates.push.api.MTPushPrivatesApi;
/**
* Utilisé pour démontrer la configuration du SDK ENGAGELAB.
*/
public class MainApplication extends Application {
private static final String TAG = "MainApplication";
@Override
public void onCreate() {
super.onCreate();
// La configuration doit être effectuée dans application.onCreate, inutile de vérifier les processus, le SDK effectue une vérification interne.
MTCorePrivatesApi.configDebugMode(this, true);
// Initialiser le push
// MTPushPrivatesApi.init(this);
}
}
package com.engagelab.app;
import android.app.Application;
import com.engagelab.privates.core.api.Address;
import com.engagelab.privates.core.api.MTCorePrivatesApi;
import com.engagelab.privates.push.api.MTPushPrivatesApi;
/**
* Utilisé pour démontrer la configuration du SDK ENGAGELAB.
*/
public class MainApplication extends Application {
private static final String TAG = "MainApplication";
@Override
public void onCreate() {
super.onCreate();
// La configuration doit être effectuée dans application.onCreate, inutile de vérifier les processus, le SDK effectue une vérification interne.
MTCorePrivatesApi.configDebugMode(this, true);
// Initialiser le push
// MTPushPrivatesApi.init(this);
}
}
Afficher ce bloc de code dans la fenêtre flottante
Kotlin:
package com.engagelab.app
import android.app.Application
import com.engagelab.privates.core.api.MTCorePrivatesApi
import com.engagelab.privates.push.api.MTPushPrivatesApi
/**
* Utilisé pour démontrer la configuration du SDK ENGAGELAB.
*/
class MainApplication : Application() {
companion object {
private const val TAG = "MainApplication"
}
override fun onCreate() {
super.onCreate()
// Doit être configuré dans application.onCreate ; ne pas vérifier le processus, le SDK gère en interne
MTCorePrivatesApi.configDebugMode(this, true)
// Initialiser le push
MTPushPrivatesApi.init(this)
}
}
package com.engagelab.app
import android.app.Application
import com.engagelab.privates.core.api.MTCorePrivatesApi
import com.engagelab.privates.push.api.MTPushPrivatesApi
/**
* Utilisé pour démontrer la configuration du SDK ENGAGELAB.
*/
class MainApplication : Application() {
companion object {
private const val TAG = "MainApplication"
}
override fun onCreate() {
super.onCreate()
// Doit être configuré dans application.onCreate ; ne pas vérifier le processus, le SDK gère en interne
MTCorePrivatesApi.configDebugMode(this, true)
// Initialiser le push
MTPushPrivatesApi.init(this)
}
}
Afficher ce bloc de code dans la fenêtre flottante
6. Créer un composant de redirection sur clic de notification
Java:
package com.engagelab.app.component;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.widget.TextView;
import android.widget.Toast;
import com.engagelab.app.R;
import com.engagelab.app.log.ExampleLogger;
import com.engagelab.privates.push.api.MTPushPrivatesApi;
import com.engagelab.privates.push.api.NotificationMessage;
import com.engagelab.privates.push.constants.MTPushConstants;
/**
* Utilisé pour démontrer le clic sur une notification pour rediriger vers une activité.
*
* Inutile d'appeler MTPushPrivatesApi.reportNotificationOpened(Context, String, byte, String) ; le SDK le gère en interne.
*/
public class UserActivity400 extends Activity {
private static final String TAG = "UserActivity400";
private TextView tvMessage;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_intent);
tvMessage = findViewById(R.id.tv_message);
onIntent(getIntent());
}
@Override
protected void onNewIntent(Intent intent) {
super.onNewIntent(intent);
onIntent(intent);
}
private void onIntent(Intent intent) {
try {
Toast.makeText(this, TAG, Toast.LENGTH_SHORT).show();
if (intent == null) {
return;
}
// À partir de la version 3.4.0, les objets ne sont plus utilisés ; les données JSON sont utilisées à la place
String notificationMessage = intent.getStringExtra("message_json");
if (notificationMessage == null) {
return;
}
ExampleLogger.d(TAG, "notificationMessage:" + notificationMessage.toString());
tvMessage.setText(notificationMessage.toString());
} catch (Throwable throwable) {
throwable.printStackTrace();
}
}
}
package com.engagelab.app.component;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.widget.TextView;
import android.widget.Toast;
import com.engagelab.app.R;
import com.engagelab.app.log.ExampleLogger;
import com.engagelab.privates.push.api.MTPushPrivatesApi;
import com.engagelab.privates.push.api.NotificationMessage;
import com.engagelab.privates.push.constants.MTPushConstants;
/**
* Utilisé pour démontrer le clic sur une notification pour rediriger vers une activité.
*
* Inutile d'appeler MTPushPrivatesApi.reportNotificationOpened(Context, String, byte, String) ; le SDK le gère en interne.
*/
public class UserActivity400 extends Activity {
private static final String TAG = "UserActivity400";
private TextView tvMessage;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_intent);
tvMessage = findViewById(R.id.tv_message);
onIntent(getIntent());
}
@Override
protected void onNewIntent(Intent intent) {
super.onNewIntent(intent);
onIntent(intent);
}
private void onIntent(Intent intent) {
try {
Toast.makeText(this, TAG, Toast.LENGTH_SHORT).show();
if (intent == null) {
return;
}
// À partir de la version 3.4.0, les objets ne sont plus utilisés ; les données JSON sont utilisées à la place
String notificationMessage = intent.getStringExtra("message_json");
if (notificationMessage == null) {
return;
}
ExampleLogger.d(TAG, "notificationMessage:" + notificationMessage.toString());
tvMessage.setText(notificationMessage.toString());
} catch (Throwable throwable) {
throwable.printStackTrace();
}
}
}
Afficher ce bloc de code dans la fenêtre flottante
Kotlin:
package com.engagelab.app.component
import android.app.Activity
import android.content.Context
import android.content.Intent
import android.os.Bundle
import android.widget.TextView
import android.widget.Toast
import com.engagelab.app.R
import com.engagelab.app.log.ExampleLogger
import com.engagelab.privates.push.api.MTPushPrivatesApi
/**
* Utilisé pour démontrer la redirection vers une activité après clic sur une notification.
*
* Inutile d'appeler MTPushPrivatesApi.reportNotificationOpened(Context, String, Byte, String) ; le SDK le gère en interne.
*/
class UserActivity400 : Activity() {
companion object {
private const val TAG = "UserActivity400"
}
private lateinit var tvMessage: TextView
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_intent)
tvMessage = findViewById(R.id.tv_message)
onIntent(intent)
}
override fun onNewIntent(intent: Intent?) {
super.onNewIntent(intent)
onIntent(intent)
}
private fun onIntent(intent: Intent?) {
try {
Toast.makeText(this, TAG, Toast.LENGTH_SHORT).show()
if (intent == null) {
return
}
// À partir de la version 3.4.0, l'objet n'est plus utilisé ; les données JSON sont utilisées à la place
val notificationMessage = intent.getStringExtra("message_json")
if (notificationMessage == null) {
return
}
ExampleLogger.d(TAG, "notificationMessage:$notificationMessage")
tvMessage.text = notificationMessage
} catch (throwable: Throwable) {
throwable.printStackTrace()
}
}
}
package com.engagelab.app.component
import android.app.Activity
import android.content.Context
import android.content.Intent
import android.os.Bundle
import android.widget.TextView
import android.widget.Toast
import com.engagelab.app.R
import com.engagelab.app.log.ExampleLogger
import com.engagelab.privates.push.api.MTPushPrivatesApi
/**
* Utilisé pour démontrer la redirection vers une activité après clic sur une notification.
*
* Inutile d'appeler MTPushPrivatesApi.reportNotificationOpened(Context, String, Byte, String) ; le SDK le gère en interne.
*/
class UserActivity400 : Activity() {
companion object {
private const val TAG = "UserActivity400"
}
private lateinit var tvMessage: TextView
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_intent)
tvMessage = findViewById(R.id.tv_message)
onIntent(intent)
}
override fun onNewIntent(intent: Intent?) {
super.onNewIntent(intent)
onIntent(intent)
}
private fun onIntent(intent: Intent?) {
try {
Toast.makeText(this, TAG, Toast.LENGTH_SHORT).show()
if (intent == null) {
return
}
// À partir de la version 3.4.0, l'objet n'est plus utilisé ; les données JSON sont utilisées à la place
val notificationMessage = intent.getStringExtra("message_json")
if (notificationMessage == null) {
return
}
ExampleLogger.d(TAG, "notificationMessage:$notificationMessage")
tvMessage.text = notificationMessage
} catch (throwable: Throwable) {
throwable.printStackTrace()
}
}
}
Afficher ce bloc de code dans la fenêtre flottante
7. Configurer l'AndroidManifest.xml pour la redirection sur clic
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
package="com.engagelab.app">
<!-- Obligatoire : permission Internet -->
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<!-- Optionnel : vibration pour les notifications -->
<uses-permission android:name="android.permission.VIBRATE" />
<application
android:name="com.engagelab.app.MainApplication"
android:allowBackup="false"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/Theme.MT"
android:usesCleartextTraffic="true"
tools:targetApi="m"> <!-- Si vous utilisez des requêtes HTTP, autorisez HTTP -->
..............................................................
<!-- Utilisé pour démontrer la redirection sur clic de notification -->
<activity
android:name="com.engagelab.app.component.UserActivity400"
android:exported="false"
android:launchMode="singleTask" />
<!-- Utilisé pour démontrer la redirection sur clic de notification avec deep links -->
<!-- <activity-->
<!-- android:name="com.engagelab.app.component.UserActivity400"-->
<!-- android:exported="false" >-->
<!-- <intent-filter>-->
<!-- <data android:scheme="YourScheme"/>-->
<!-- <data android:host="YourHost"/>-->
<!-- <action android:name="android.intent.action.VIEW" />-->
<!-- <category android:name="android.intent.category.DEFAULT" />-->
<!-- <category android:name="android.intent.category.BROWSABLE" />-->
<!-- </intent-filter>-->
<!-- </activity>-->
<!-- Vérification de transfert local en liste blanche : À partir de MTPush 4.2.3, après configuration de ENGAGELAB_PRIVATES_TRANSFER, le SDK effectuera une vérification locale. Si la vérification locale est activée, veuillez configurer ici l'Activity cible à atteindre. S'il y a plusieurs Activities cibles, séparez-les par /. -->
<meta-data
android:name="ENGAGELAB_PRIVATES_TRANSFER"
android:value="com.engagelab.app.component.UserActivity400" />
<!-- Nécessaire pour le push Google : à retirer si le canal Google n'est pas nécessaire -->
<meta-data
android:name="com.google.firebase.messaging.default_notification_icon"
android:resource="@drawable/mtpush_notification_icon" />
<!-- Nécessaire pour le push Huawei : à retirer si le canal Huawei n'est pas nécessaire -->
<meta-data
android:name="com.huawei.messaging.default_notification_icon"
android:resource="@drawable/mtpush_notification_icon" />
</application>
</manifest>
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
package="com.engagelab.app">
<!-- Obligatoire : permission Internet -->
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<!-- Optionnel : vibration pour les notifications -->
<uses-permission android:name="android.permission.VIBRATE" />
<application
android:name="com.engagelab.app.MainApplication"
android:allowBackup="false"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/Theme.MT"
android:usesCleartextTraffic="true"
tools:targetApi="m"> <!-- Si vous utilisez des requêtes HTTP, autorisez HTTP -->
..............................................................
<!-- Utilisé pour démontrer la redirection sur clic de notification -->
<activity
android:name="com.engagelab.app.component.UserActivity400"
android:exported="false"
android:launchMode="singleTask" />
<!-- Utilisé pour démontrer la redirection sur clic de notification avec deep links -->
<!-- <activity-->
<!-- android:name="com.engagelab.app.component.UserActivity400"-->
<!-- android:exported="false" >-->
<!-- <intent-filter>-->
<!-- <data android:scheme="YourScheme"/>-->
<!-- <data android:host="YourHost"/>-->
<!-- <action android:name="android.intent.action.VIEW" />-->
<!-- <category android:name="android.intent.category.DEFAULT" />-->
<!-- <category android:name="android.intent.category.BROWSABLE" />-->
<!-- </intent-filter>-->
<!-- </activity>-->
<!-- Vérification de transfert local en liste blanche : À partir de MTPush 4.2.3, après configuration de ENGAGELAB_PRIVATES_TRANSFER, le SDK effectuera une vérification locale. Si la vérification locale est activée, veuillez configurer ici l'Activity cible à atteindre. S'il y a plusieurs Activities cibles, séparez-les par /. -->
<meta-data
android:name="ENGAGELAB_PRIVATES_TRANSFER"
android:value="com.engagelab.app.component.UserActivity400" />
<!-- Nécessaire pour le push Google : à retirer si le canal Google n'est pas nécessaire -->
<meta-data
android:name="com.google.firebase.messaging.default_notification_icon"
android:resource="@drawable/mtpush_notification_icon" />
<!-- Nécessaire pour le push Huawei : à retirer si le canal Huawei n'est pas nécessaire -->
<meta-data
android:name="com.huawei.messaging.default_notification_icon"
android:resource="@drawable/mtpush_notification_icon" />
</application>
</manifest>
Afficher ce bloc de code dans la fenêtre flottante
