/**
  * Envia a notificação
  *
  * @param Notification $notification
  *        	Notificação a ser enviada
  * @return NotificationResult Resultado do envio da notificação
  */
 public function send($notification)
 {
     // verifica a notificação
     if (!$notification) {
         throw new \InvalidArgumentException("A notificação não foi informada ou é inválida.");
     }
     $iosDevices = new DeviceCollection();
     $androidDevices = new DeviceCollection();
     $data = $notification->getData();
     if ($data) {
         $message = new Message($notification->getMessage(), $notification->getData());
     } else {
         $message = new Message($notification->getMessage());
     }
     // separa os dispositivos por tipo
     foreach ($notification->getDevices() as $device) {
         switch ($device->getDeviceType()) {
             case Device::ANDROID:
                 $androidDevices->add(new PusherDevice($device->getToken()));
                 break;
             case Device::IOS:
                 $iosDevices->add(new PusherDevice($device->getToken()));
                 break;
         }
     }
     $notificationResult = new NotificationResponse();
     // envia as notificações
     AndroidPushController::send($androidDevices, $message, $notificationResult, $this->pushManager);
     IosPushController::send($iosDevices, $message, $notificationResult, $this->pushManager);
     return $notificationResult;
 }
 /**
  * Envia a notificação para dispositivos Android
  *
  * @param Device[] $devices
  *        	Dispositivos
  * @param Message $message
  *        	Notificação
  * @param NotificationResult $notificationResult
  *        	Resultado do envio da notificação
  * @param PushManager $pushManager
  *        	Gerenciador de push
  */
 public static function send($devices, $message, $notificationResult, $pushManager)
 {
     if (iterator_count($devices->getIterator()) > 0) {
         try {
             $gcmAdapter = new GcmAdapter(array('apiKey' => ANDROID_API_KEY));
             // envia as notificações
             $push = new Push($gcmAdapter, $devices, $message);
             $pushManager->add($push);
             $pushManager->push();
             // obtém a resposta do envio do envio
             $response = $gcmAdapter->getResponse();
             // dispositivo que não receberam as notificações e motivo
             $failureResults = $response->getResult(Response::RESULT_ERROR);
             $failureDevices = AndroidPushController::handleFailureResult($failureResults);
             // dispositivo que tiveram seus identificadores modificados
             $canonicalResults = $response->getResult(Response::RESULT_CANONICAL);
             AndroidPushController::handleCanonicalResult($canonicalResults);
             $notificationResult->addDevicesNotNotified($failureDevices);
         } catch (\Exception $e) {
             global $log;
             $log->Error($e);
             $notificationResult->setAndroidFailed(true);
             $notificationResult->setAndroidFailureReason($e->getMessage());
         }
     }
 }