public function __construct()
 {
     self::$ALLOWED_TRIGGERS = array(array('text' => __('When a post is published.', 'web-push'), 'key' => 'new-post', 'enable_by_default' => true, 'hook' => 'transition_post_status', 'action' => 'on_transition_post_status'), array('text' => __('When a post is updated.', 'web-push'), 'key' => 'update-post', 'parentKey' => 'new-post', 'enable_by_default' => true, 'hook' => 'transition_post_status', 'action' => 'on_transition_post_status'), array('text' => __('Right after subscription (useful to show to users what notifications look like).', 'web-push'), 'key' => 'on-subscription', 'enable_by_default' => true));
     self::add_trigger_handlers();
     if (get_option('webpush_subscription_button')) {
         add_action('wp_footer', array($this, 'add_subscription_button'), 9999);
     }
     Mozilla\WP_SW_Manager::get_manager()->sw()->add_content(array($this, 'service_worker'));
     add_action('wp_enqueue_scripts', array($this, 'enqueue_frontend_scripts'));
     add_filter('query_vars', array($this, 'on_query_vars'), 10, 1);
     add_action('parse_request', array($this, 'on_parse_request'));
     add_action('wp_ajax_webpush_register', array($this, 'handle_register'));
     add_action('wp_ajax_nopriv_webpush_register', array($this, 'handle_register'));
     add_action('wp_ajax_webpush_unregister', array($this, 'handle_unregister'));
     add_action('wp_ajax_nopriv_webpush_unregister', array($this, 'handle_unregister'));
     add_action('wp_ajax_webpush_get_payload', array($this, 'handle_get_payload'));
     add_action('wp_ajax_nopriv_webpush_get_payload', array($this, 'handle_get_payload'));
     add_action('wp_ajax_webpush_prompt', array($this, 'handle_prompt'));
     add_action('wp_ajax_nopriv_webpush_prompt', array($this, 'handle_prompt'));
     $senderID = get_option('webpush_gcm_sender_id');
     if ($senderID && get_option('webpush_generate_manifest')) {
         $manifestGenerator = Mozilla\WebAppManifestGenerator::getInstance();
     }
     $wpServeFile = Mozilla\WP_Serve_File::getInstance();
     $wpServeFile->add_file('subscription_button.css', array($this, 'subscriptionButtonCSSGenerator'));
     $wpServeFile->add_file('bell.svg', array($this, 'bellSVGGenerator'));
 }
 function test_manifest_generation()
 {
     Mozilla\WebAppManifestGenerator::getInstance()->set_field('test', 'Marco');
     $result = Mozilla\WebAppManifestGenerator::getInstance()->manifestJSONGenerator();
     $this->assertEquals('{"start_url":"\\/","test":"Marco"}', $result['content']);
     $this->assertEquals('application/manifest+json', $result['contentType']);
 }
    public function options()
    {
        $allowed_triggers = WebPush_Main::$ALLOWED_TRIGGERS;
        $title_option = get_option('webpush_title');
        $icon_option = get_option('webpush_icon');
        $min_visits_option = intval(get_option('webpush_min_visits'));
        $subscription_button_option = get_option('webpush_subscription_button');
        $subscription_button_color_option = get_option('webpush_subscription_button_color');
        $prompt_interval_option = get_option('webpush_prompt_interval');
        $triggers_option = get_option('webpush_triggers');
        $gcm_key_option = get_option('webpush_gcm_key');
        $gcm_sender_id_option = get_option('webpush_gcm_sender_id');
        $generate_manifest_option = get_option('webpush_generate_manifest');
        if (USE_VAPID) {
            // Regenerate VAPID info if needed (for example, when the user installs the needed
            // dependencies).
            WebPush_DB::generate_vapid_options();
            $vapid_key_option = get_option('webpush_vapid_key');
            $vapid_subject_option = get_option('webpush_vapid_subject');
            $vapid_audience_option = get_option('webpush_vapid_audience');
        }
        if (isset($_POST['webpush_form']) && $_POST['webpush_form'] === 'submitted') {
            if ($_POST['webpush_title'] === 'blog_title') {
                $title_option = 'blog_title';
            } else {
                if ($_POST['webpush_title'] === 'custom') {
                    $title_option = $_POST['webpush_title_custom'];
                } else {
                    wp_die(__('Invalid value for the Notification Title', 'web-push'));
                }
            }
            if ($_POST['webpush_icon'] === '') {
                $icon_option = '';
            } else {
                if ($_POST['webpush_icon'] === 'blog_icon') {
                    $icon_option = 'blog_icon';
                } else {
                    if ($_POST['webpush_icon'] === 'post_icon') {
                        $icon_option = 'post_icon';
                    } else {
                        if ($_POST['webpush_icon'] === 'custom') {
                            $icon_option = $_POST['webpush_icon_custom'];
                        } else {
                            wp_die(__('Invalid value for the Notification Icon', 'web-push'));
                        }
                    }
                }
            }
            if ($_POST['webpush_min_visits'] === '0') {
                $min_visits_option = 0;
            } else {
                if ($_POST['webpush_min_visits'] === 'custom') {
                    $min_visits_option = intval($_POST['webpush_min_visits_custom']);
                } else {
                    if ($_POST['webpush_min_visits'] === '-1') {
                        $min_visits_option = -1;
                    } else {
                        wp_die(__('Invalid value for `Registration Behavior`', 'web-push'));
                    }
                }
            }
            $subscription_button_option = isset($_POST['webpush_subscription_button']) ? true : false;
            $subscription_button_color_option = $this->sanitize_hex_color($_POST['webpush_subscription_button_color']);
            if (!$subscription_button_color_option) {
                wp_die(__('Invalid color for the subscription button', 'web-push'));
            } else {
                if ($subscription_button_color_option !== get_option('webpush_subscription_button_color')) {
                    update_option('webpush_subscription_button_color', $subscription_button_color_option);
                    Mozilla\WP_Serve_File::getInstance()->invalidate_files(array('subscription_button.css', 'bell.svg'));
                }
            }
            $prompt_interval_option = intval($_POST['webpush_prompt_interval']);
            $triggers_option = isset($_POST['webpush_triggers']) ? $_POST['webpush_triggers'] : array();
            foreach ($triggers_option as $trigger_option) {
                if (!WebPush_Main::get_trigger_by_key_value('key', $trigger_option)) {
                    wp_die(sprintf(__('Invalid value in Push Triggers: %s'), $trigger_option), 'web-push');
                }
            }
            $gcm_key_option = $_POST['webpush_gcm_key'];
            $gcm_sender_id_option = $_POST['webpush_gcm_sender_id'];
            if ($gcm_sender_id_option != get_option('webpush_gcm_sender_id')) {
                $manifestGenerator = Mozilla\WebAppManifestGenerator::getInstance();
                $manifestGenerator->set_field('gcm_sender_id', $gcm_sender_id_option);
                $manifestGenerator->set_field('gcm_user_visible_only', true);
            }
            $generate_manifest_option = isset($_POST['webpush_generate_manifest']) ? true : false;
            if (USE_VAPID) {
                $vapid_key_option = $_POST['webpush_vapid_key'];
                $vapid_subject_option = $_POST['webpush_vapid_subject'];
                $vapid_audience_option = $_POST['webpush_vapid_audience'];
            }
            update_option('webpush_title', $title_option);
            update_option('webpush_icon', $icon_option);
            update_option('webpush_min_visits', $min_visits_option);
            update_option('webpush_subscription_button', $subscription_button_option);
            update_option('webpush_prompt_interval', $prompt_interval_option);
            update_option('webpush_triggers', $triggers_option);
            update_option('webpush_gcm_key', $gcm_key_option);
            update_option('webpush_gcm_sender_id', $gcm_sender_id_option);
            update_option('webpush_generate_manifest', $generate_manifest_option);
            if (USE_VAPID) {
                update_option('webpush_vapid_key', $vapid_key_option);
                update_option('webpush_vapid_audience', $vapid_audience_option);
                update_option('webpush_vapid_subject', $vapid_subject_option);
            }
            ?>
<div class="updated"><p><strong><?php 
            _e('Settings saved.');
            ?>
</strong></p></div>
<?php 
        }
        $icon_url = '';
        if ($icon_option !== 'blog_icon' && $icon_option !== '' && $icon_option !== 'post_icon') {
            $icon_url = $icon_option;
        }
        ?>

<div class="wrap">
<h2><?php 
        _e('Web Push Settings', 'web-push');
        ?>
</h2>

<form method="post" action="" enctype="multipart/form-data">
<h2 class="title"><?php 
        _e('Notification UI Options', 'web-push');
        ?>
</h2>
<p><?php 
        _e('In this section, you can customize the information that appears in the notifications that will be shown to users.<br> Here\'s a preview of the notification:', 'web-push');
        ?>
</p>

<div style="border: 1px solid darkgrey; overflow: auto; display: inline-block; background-color: lightgrey;">
<h3 id="notification-title" style="margin-left: 10px;"></h3>
<div style="float: left; margin-left: 10px; margin-bottom:10px;"><img id="notification-icon" style="display: block; max-width: 64px; max-height: 64px;"></div>
<div id="notification-text" style="margin-left: 90px; padding-right: 50px;"><p><?php 
        _e('The title of your post.', 'web-push');
        ?>
</p></div>
</div>

<input type="hidden" name="webpush_form" value="submitted" />

<table class="form-table">
<tr>
<th scope="row"><?php 
        _e('Title', 'web-push');
        ?>
</th>
<td>
<fieldset>
<label><input type="radio" name="webpush_title" value="blog_title" <?php 
        echo $title_option === 'blog_title' ? 'checked' : '';
        ?>
 /> <?php 
        _e('Use the Site Title', 'web-push');
        ?>
</label><br />
<label><input type="radio" name="webpush_title" value="custom" <?php 
        echo $title_option !== 'blog_title' ? 'checked' : '';
        ?>
 /> <?php 
        _e('Custom:');
        ?>
</label>
<input type="text" id="webpush_title_custom" name="webpush_title_custom" value="<?php 
        echo $title_option !== 'blog_title' ? $title_option : esc_attr__('Your custom title', 'web-push');
        ?>
" class="regular-text" />
</fieldset>
</td>
</tr>

<tr>
<th scope="row"><?php 
        _e('Icon', 'web-push');
        ?>
</th>
<td>
<fieldset>
<label><input type="radio" name="webpush_icon" value="" <?php 
        echo $icon_option === '' ? 'checked' : '';
        ?>
 /> <?php 
        _e('Don\'t use any icon', 'web-push');
        ?>
</label>
<br />
<label><input type="radio" name="webpush_icon" value="post_icon" <?php 
        echo $icon_option === 'post_icon' ? 'checked' : '';
        ?>
 /> <?php 
        _e('Use the Post Thumbnail', 'web-push');
        ?>
</label>
<br />
<?php 
        if (function_exists('get_site_icon_url')) {
            ?>
<label><input type="radio" name="webpush_icon" value="blog_icon" <?php 
            echo $icon_option === 'blog_icon' ? 'checked' : '';
            ?>
 /> <?php 
            _e('Use the Site Icon', 'web-push');
            ?>
</label>
<br />
<?php 
        }
        ?>
<label><input type="radio" name="webpush_icon" value="custom" <?php 
        echo $icon_option !== 'blog_icon' && $icon_option !== '' && $icon_option !== 'post_icon' ? 'checked' : '';
        ?>
 /> <?php 
        _e('Custom:');
        ?>
</label>
<input type="hidden" id="webpush_icon_custom" name="webpush_icon_custom" value="<?php 
        echo $icon_url;
        ?>
" />
<input type="button" class="button" id="webpush_icon_custom_button" value="<?php 
        esc_attr_e('Select');
        ?>
"></input>
</fieldset>
</td>
</tr>
</table>


<h2 class="title"><?php 
        _e('Subscription Behavior', 'web-push');
        ?>
</h2>
<p><?php 
        _e('In this section, you can customize the subscription behavior and tailor it to your site. We suggest limiting automatic prompting to avoid nagging users and always giving the option to subscribe/unsubscribe through the subscription button.', 'web-push');
        ?>
</p>

<table class="form-table">
<tr>
<th scope="row"></th>
<td>
<object id="webpush_subscription_button_svg" data="<?php 
        echo Mozilla\WP_Serve_File::get_relative_to_host_root_url('bell.svg');
        ?>
" type="image/svg+xml" style="max-width:64px;max-height:64px;"></object><br>
<input type="text" value="<?php 
        echo $subscription_button_color_option;
        ?>
" name="webpush_subscription_button_color" class="webpush_subscription_button_color" data-default-color="#005189" /><br>
<label><input type="checkbox" name="webpush_subscription_button" <?php 
        echo $subscription_button_option ? 'checked' : '';
        ?>
 /> <?php 
        _e('Show subscription icon', 'web-push');
        ?>
</label>
<p class="description"><?php 
        _e('A button in the bottom-right corner of the page that the user can use to subscribe/unsubscribe. We suggest enabling it to offer an easy way for users to manage their subscription.', 'web-push');
        ?>
</p>
</td>
</tr>

<tr>
<th scope="row"><?php 
        _e('Automatic prompting', 'web-push');
        ?>
</th>
<td>
<fieldset>
<label><input type="radio" name="webpush_min_visits" value="0" <?php 
        echo $min_visits_option === 0 ? 'checked' : '';
        ?>
 /> <?php 
        _e('Ask the user to register as soon as he visits the site', 'web-push');
        ?>
</label><br />
<label><input type="radio" name="webpush_min_visits" value="custom" <?php 
        echo $min_visits_option !== 0 && $min_visits_option !== -1 ? 'checked' : '';
        ?>
 /> <?php 
        _e('Ask the user to register after N visits:', 'web-push');
        ?>
</label>
<input type="number" name="webpush_min_visits_custom" value="<?php 
        echo $min_visits_option !== 0 && $min_visits_option !== -1 ? $min_visits_option : 3;
        ?>
" class="small-text" /><br />
<label><input type="radio" name="webpush_min_visits" value="-1" <?php 
        echo $min_visits_option === -1 ? 'checked' : '';
        ?>
 /> <?php 
        _e('Never automatically ask the user to register', 'web-push');
        ?>
</label>
</fieldset>
<p class="description"><?php 
        _e('Limiting automatic prompting is suggested to avoid nagging users (unless you know that your visitors are really interested).', 'web-push');
        ?>
</p>
</td>
</tr>

<tr>
<th scope="row"><label for="webpush_prompt_interval"><?php 
        _e('Interval between prompts', 'web-push');
        ?>
</label></th>
<td><input name="webpush_prompt_interval" type="number" value="<?php 
        echo $prompt_interval_option;
        ?>
" class="small-text" />
<p class="description"><?php 
        _e('If the user declines or dismisses the prompt, this is the time interval (in days) to wait before prompting again.', 'web-push');
        ?>
</p>
</td>
</tr>
</table>


<h2 class="title"><?php 
        _e('Push Triggers', 'web-push');
        ?>
</h2>
<p><?php 
        _e('Select which events should trigger sending a push notification to users.', 'web-push');
        ?>
</p>

<table class="form-table">
<tr>
<th scope="row"></th>
<td>
<fieldset>
  <?php 
        foreach ($allowed_triggers as $trigger) {
            ?>
  <label><input type="checkbox" name="webpush_triggers[]" id="webpush_trigger_<?php 
            echo $trigger['key'];
            ?>
" value="<?php 
            echo esc_attr($trigger['key']);
            ?>
" <?php 
            echo in_array($trigger['key'], $triggers_option) ? 'checked' : '';
            ?>
 <?php 
            if (array_key_exists('parentKey', $trigger)) {
                echo 'parent="' . esc_attr($trigger['parentKey']) . '"';
            }
            ?>
 /> <?php 
            echo $trigger['text'];
            ?>
</label><br />
  <?php 
        }
        ?>
</fieldset>
<p class="description"><?php 
        _e('N.B.: You can override these options for individual posts when you create/edit them.', 'web-push');
        ?>
</p>
</td>
</tr>
</table>


<h2 class="title"><?php 
        _e('Voluntary Application Server Identification (VAPID)', 'web-push');
        ?>
</h2>
<p><?php 
        _e('VAPID is useful to monitor your push messages. It allows your server to submit information about itself to the push service, which improves application stability, exception handling, and security. <b>It is automatically configured for you.</b>', 'web-push');
        ?>
</p>

<?php 
        if (USE_VAPID) {
            ?>
<input type="button" class="button" id="webpush_vapid_show_config" value="<?php 
            esc_attr_e('Show advanced options', 'web-push');
            ?>
"></input>
<br>
<table class="form-table" id="vapid_config" style="display:none;">
<tr>
<th scope="row"><label for="webpush_vapid_key"><?php 
            _e('Private Key', 'web-push');
            ?>
</label></th>
<td><textarea name="webpush_vapid_key" id="webpush_vapid_key" type="text" rows="5" cols="65" class="regular-text code"><?php 
            echo $vapid_key_option;
            ?>
</textarea>
<p class="description"><?php 
            _e('The private key used to sign your push notifications.', 'web-push');
            ?>
</p></td>
</tr>

<tr>
<th scope="row"><?php 
            _e('Public Key', 'web-push');
            ?>
</th>
<td><code><b><span id="webpush_vapid_public_key"><?php 
            echo $this->get_public_key($vapid_key_option);
            ?>
</span></b></code></td>
</tr>

<tr>
<th scope="row"><label for="webpush_vapid_audience"><?php 
            _e('Audience', 'web-push');
            ?>
</label></th>
<td><input name="webpush_vapid_audience" type="url" value="<?php 
            echo $vapid_audience_option;
            ?>
" class="regular-text code" />
<p class="description"><?php 
            _e('The origin URL of the sender.', 'web-push');
            ?>
</p></td>
</tr>

<tr>
<th scope="row"><label for="webpush_vapid_subject"><?php 
            _e('Subject', 'web-push');
            ?>
</label></th>
<td><input name="webpush_vapid_subject" type="url" value="<?php 
            echo $vapid_subject_option;
            ?>
" class="regular-text code" />
<p class="description"><?php 
            _e('The primary contact in case something goes wrong.', 'web-push');
            ?>
</p></td>
</tr>
<?php 
        } else {
            ?>
<p><?php 
            _e('Unfortunately, VAPID can\'t be enabled on your website, because one or more prerequisites are missing.', 'web-push');
            ?>
</p>
<table class="form-table">
<tr>
<th scope="row"><?php 
            _e('VAPID Prerequisites:', 'web-push');
            ?>
</th>
<td>
<ul style="list-style-type: circle;">
<li style="color:<?php 
            echo version_compare(phpversion(), '5.4') >= 0 ? 'green' : 'red';
            ?>
;">PHP 5.4+</li>
<li style="color:<?php 
            echo function_exists('mcrypt_encrypt') ? 'green' : 'red';
            ?>
;"><?php 
            _e('mcrypt extension', 'web-push');
            ?>
</li>
<li style="color:<?php 
            echo function_exists('gmp_mod') ? 'green' : 'red';
            ?>
;"><?php 
            _e('gmp extension', 'web-push');
            ?>
</li>
</ul>
</td>
</tr>
<?php 
        }
        ?>
</table>


<a href="#gcm" name="gcm" style="text-decoration:none;"><h2 class="title"><?php 
        _e('Google Chrome Support', 'web-push');
        ?>
</h2></a>
<p><?php 
        _e('To configure Google Chrome support, follow the steps in <a href="https://developers.google.com/web/fundamentals/getting-started/push-notifications/step-04" target="_blank">Make a project on the Google Developer Console</a> to configure Google Cloud Messaging (GCM), then copy the <i>GCM API Key</i> and <i>Project Number</i> into the fields below.', 'web-push');
        ?>
</p>

<table class="form-table">
<tr>
<th scope="row"><label for="webpush_gcm_key"><?php 
        _e('GCM API Key', 'web-push');
        ?>
</label></th>
<td><input name="webpush_gcm_key" type="text" value="<?php 
        echo $gcm_key_option;
        ?>
" class="regular-text code" /></td>
</tr>

<tr>
<th scope="row"><label for="webpush_gcm_sender_id"><?php 
        _e('GCM Project Number', 'web-push');
        ?>
</label></th>
<td><input name="webpush_gcm_sender_id" id="webpush_gcm_sender_id" type="text" value="<?php 
        echo $gcm_sender_id_option;
        ?>
" class="code" /></td>
</tr>
</table>

<p><?php 
        _e('The GCM project number should be added to your Web App Manifest. You can either let the plugin generate a manifest for you or add the info to your own manifest (if you already have one). The plugin is compatible with the <a href="https://wordpress.org/plugins/add-to-home-screen">Add to Home Screen plugin</a>. <b>You only need to disable the following option if you have created your own manifest manually</b>.', 'web-push');
        ?>
</p>
<label><input type="checkbox" name="webpush_generate_manifest" id="webpush_generate_manifest" <?php 
        echo $generate_manifest_option ? 'checked' : '';
        ?>
 /> <?php 
        _e('The plugin will automatically create a Web App Manifest for you and add it to your page.', 'web-push');
        ?>
</label>
<br><br>
<p id="webpush_generate_manifest_text" style="display:none;"><?php 
        printf(__('You need to add %s and %s to your manifest', 'web-push'), '<b>"gcm_sender_id": "<span id="webpush_generate_manifest_sender_id_field">%s"</b>', '<b>"gcm_user_visible_only": true</b>');
        ?>
</p>

<?php 
        submit_button(__('Save Changes'), 'primary');
        ?>

</form>

</div>

<?php 
    }