PWAHelper.java

package org.silverpeas.mobile.client.common;

import com.google.gwt.core.client.JavaScriptObject;
import com.google.gwt.user.client.Command;
import com.google.gwt.user.client.Window;
import org.silverpeas.mobile.client.resources.ApplicationMessages;

public class PWAHelper {
  public static native JavaScriptObject addStateListener(Command listener) /*-{
    if (!$wnd.spMobilePwa) return null;
    return $wnd.spMobilePwa.subscribe($entry(function () {
      listener.@com.google.gwt.user.client.Command::execute()();
    }));
  }-*/;

  public static native void removeStateListener(JavaScriptObject unsubscribe) /*-{
    if (unsubscribe) unsubscribe();
  }-*/;

  public static native boolean isInstalledApp() /*-{
    return !!($wnd.spMobilePwa && $wnd.spMobilePwa.isInstalled());
  }-*/;

  public static native boolean canInstall() /*-{
    return !!($wnd.spMobilePwa && $wnd.spMobilePwa.canInstall());
  }-*/;

  public static void installApp(ApplicationMessages messages) {
    requestInstallation(() -> showInstructions(messages));
  }

  private static native void requestInstallation(Command fallback) /*-{
    var unavailable = $entry(function () {
      fallback.@com.google.gwt.user.client.Command::execute()();
    });
    if ($wnd.spMobilePwa) $wnd.spMobilePwa.prompt(unavailable);
    else unavailable();
  }-*/;

  private static void showInstructions(ApplicationMessages messages) {
    if (!isSecureContext()) {
      Window.alert(messages.installationRequiresHttps());
    } else if (isIos()) {
      Window.alert(isSafari() ? messages.installationIos() : messages.installationOpenSafari());
    } else {
      Window.alert(messages.installationBrowserMenu());
    }
  }

  private static native boolean isSecureContext() /*-{
    return $wnd.spMobilePwa ? $wnd.spMobilePwa.isSecureContext() : $wnd.isSecureContext === true;
  }-*/;

  private static native boolean isIos() /*-{
    return !!($wnd.spMobilePwa && $wnd.spMobilePwa.isIos());
  }-*/;

  private static native boolean isSafari() /*-{
    return !!($wnd.spMobilePwa && $wnd.spMobilePwa.isSafari());
  }-*/;
}