docs: @Override
      public void sendPushMessage(Variant variant, Collection<String> tokens, UnifiedPushMessage pushMessage, String pushMessageInformationId, NotificationSenderCallback callback) {
  
          // no need to send empty list
          if (tokens.isEmpty()) {
              return;
          }
  
          final List<String> pushTargets = new ArrayList<>(tokens);
          final AndroidVariant androidVariant = (AndroidVariant) variant;
  
          // payload builder:
          Builder fcmBuilder = new Message.Builder();
  
          org.jboss.aerogear.unifiedpush.message.Message message = pushMessage.getMessage();
          // add the "recognized" keys...
          fcmBuilder.addData("alert", message.getAlert());
          fcmBuilder.addData("sound", message.getSound());
          fcmBuilder.addData("badge", String.valueOf(message.getBadge()));
  
          /*
          The Message defaults to a Normal priority.  High priority is used
          by FCM to wake up devices in Doze mode as well as apps in AppStandby
          mode.  This has no effect on devices older than Android 6.0
          */
          fcmBuilder.priority(
                  message.getPriority() ==  Priority.HIGH ?
                                            Message.Priority.HIGH :
                                            Message.Priority.NORMAL
                             );
  
          // if present, apply the time-to-live metadata:
          int ttl = pushMessage.getConfig().getTimeToLive();
          if (ttl != -1) {
              fcmBuilder.timeToLive(ttl);
          }
  
          // iterate over the missing keys:
          message.getUserData().keySet()
                  .forEach(key -> fcmBuilder.addData(key, String.valueOf(message.getUserData().get(key))));
  
          //add the aerogear-push-id
          fcmBuilder.addData(InternalUnifiedPushMessage.PUSH_MESSAGE_ID, pushMessageInformationId);
  
          Message fcmMessage = fcmBuilder.build();
  
          // send it out.....
          try {
              logger.debug("Sending transformed FCM payload: {}", fcmMessage);
  
              final ConfigurableFCMSender sender = new ConfigurableFCMSender(androidVariant.getGoogleKey());
  
              // we are about to send HTTP requests for all tokens of topics of this batch
              promPrushRequestsAndroid.inc();
  
              // send out a message to a batch of devices...
              processFCM(androidVariant, pushTargets, fcmMessage , sender);
  
              logger.debug("Message batch to FCM has been submitted");
              callback.onSuccess();
  
          } catch (Exception e) {
              // FCM exceptions:
              callback.onError(String.format("Error sending payload to FCM server: %s", e.getMessage()));
          }
      }