content: /*
   * Copyright (C) 2015 Actor LLC. <https://actor.im>
   */
  
  package im.actor.core.js.providers.notification;
  
  import com.google.gwt.core.client.JavaScriptObject;
  
  public class JsChromePush extends JavaScriptObject {
  
      public static native boolean isSupported()/*-{
          if (!('ServiceWorkerRegistration' in $wnd)) {
              console.warn('ServiceWorkers aren\'t supported.');
              return false;
          }
  
          if (!('showNotification' in $wnd.ServiceWorkerRegistration.prototype)) {
              console.warn('Notifications aren\'t supported.');
              return false;
          }
  
          if (Notification.permission === 'denied') {
              console.warn('The user has blocked notifications.');
              return false;
          }
  
          if (!('PushManager' in $wnd)) {
              console.warn('Push messaging isn\'t supported.');
              return false;
          }
  
          return true;
      }-*/;
  
      public static native void subscribe(PushSubscribeResult callback)/*-{
  
          function endpointWorkaround(pushSubscription) {
              // Make sure we only mess with GCM
              if (pushSubscription.endpoint.indexOf('https://android.googleapis.com/gcm/send') !== 0) {
                  return pushSubscription.endpoint;
              }
  
              var mergedEndpoint = pushSubscription.endpoint;
              // Chrome 42 + 43 will not have the subscriptionId attached
              // to the endpoint.
              if (pushSubscription.subscriptionId &&
                  pushSubscription.endpoint.indexOf(pushSubscription.subscriptionId) === -1) {
                  // Handle version 42 where you have separate subId and Endpoint
                  mergedEndpoint = pushSubscription.endpoint + '/' + pushSubscription.subscriptionId;
              }
  
              return mergedEndpoint;
          }
  
           $wnd.navigator.serviceWorker.register('push-worker.js').then(function() {
              $wnd.navigator.serviceWorker.ready.then(function(serviceWorkerRegistration) {
  
                  var controller = serviceWorkerRegistration.active;
                  $wnd.setInterval(function() {
                      controller.postMessage("tabOpenNotify");
                  }, 1000);
  
                  serviceWorkerRegistration.pushManager.subscribe({userVisibleOnly: false})
                      .then(function(subscription) {
                          var mergedEndpoint = endpointWorkaround(subscription);
  
                          if (mergedEndpoint.indexOf('https://android.googleapis.com/gcm/send') !== 0) {
                              console.warn('Unsupported endpoint: ' + mergedEndpoint);
                              return;
                          }
  
                          var endpointSections = mergedEndpoint.split('/');
                          var subscriptionId = endpointSections[endpointSections.length - 1];
  
                          callback.@im.actor.core.js.providers.notification.PushSubscribeResult::onSubscribedChrome(*)(subscriptionId);
                          return;
                      });
               });
           });
      }-*/;
  
      public static native JsChromePush create()/*-{
          return {}
      }-*/;
  
      protected JsChromePush() {
  
      }
  }
  