commit 5cce3e8bbdee09198ab50ea3ff9d5cc75145de9a
Author: Ashwin Shaharkar <ashwinsh@cybage.com>
Date:   Mon Jul 4 19:43:49 2016 +0530

    Setting for Google API key is missing

diff --git a/google_map_field.info.yml b/google_map_field.info.yml
index ed7b861..6aa8227 100644
--- a/google_map_field.info.yml
+++ b/google_map_field.info.yml
@@ -3,6 +3,7 @@ description: Defines a field type for Google Maps.
 package: Field types
 type: module
 # core: 8.x
+configure: gmap.field.settings
 dependencies:
   - field
 
diff --git a/google_map_field.module b/google_map_field.module
index 1c31bf8..29222eb 100644
--- a/google_map_field.module
+++ b/google_map_field.module
@@ -13,3 +13,83 @@ function google_map_field_theme($existing, $type, $theme, $path) {
     ),
   );
 }
+
+/**
+ * Implements hook_library_info_alter().
+ * Change the google map library url to add the custom Google API key.
+ */
+function google_map_field_library_info_alter(&$libraries, $extension) {
+  $config = \Drupal::config('google_map_field.settings');
+  $settings = $config->get();
+
+  if (isset($libraries['google-map-apis'])) {
+    $old_path = array_keys($libraries['google-map-apis']['js']);
+    $old_path = $old_path[0];
+    if (strpos($old_path, 'key') == FALSE) {
+      $js_url = parse_url($old_path);
+      parse_str($js_url['query'], $js_url_query);
+      // Modify the query parameters.
+      unset($js_url_query['sensor']);
+
+      switch ($settings['google_map_field_auth_method']) {
+        case 1:
+          $js_url_query['key'] = $settings['google_map_field_apikey'];
+          break;
+        case 2:
+          $js_url_query['client'] = $settings['google_map_field_map_client_id'];
+          break;
+      }
+
+      // Build the new js url with the modified params.
+      $js_url['query'] = http_build_query($js_url_query);
+
+      $new_js_url = '//' . $js_url['host'] . $js_url['path'] . '?' . $js_url['query'];
+
+      $new_js = array(
+        $new_js_url => [],
+      );
+      foreach ($libraries['google-map-apis']['js'][$old_path] as $key => $option) {
+        $new_js[$new_js_url][$key] = $option;
+      }
+      $libraries['google-map-apis']['js'] = $new_js;
+    }
+  }
+}
+
+/**
+ * Implementation of hook_requirements().
+ */
+function google_map_field_requirements($phase) {
+  $requirements = array();
+
+  // Whether or not an API key or client id is provided.
+  $key_provided = FALSE;
+
+  $config = \Drupal::config('google_map_field.settings');
+  $settings = $config->get();
+
+  switch ($settings['google_map_field_auth_method']) {
+    case 1:
+      if (!empty($settings['google_map_field_apikey'])) {
+        $key_provided = TRUE;
+      }
+      break;
+    case 2:
+      if (!empty($settings['google_map_field_map_client_id'])) {
+        $key_provided = TRUE;
+      }
+      break;
+  }
+  
+  if (!$key_provided) {
+    $requirements['google_map_field'] = array(
+      'title' => t('Google map field'),
+      'severity' => REQUIREMENT_WARNING,
+      'value' => t('Google Maps API key or Client ID was not found. As of 2016/06/22, keyless access is no longer supported and it may impact rendering of maps. For more information visit: <a href="@link">@link</a>', array(
+        '@link' => 'http://googlegeodevelopers.blogspot.ca/2016/06/building-for-scale-updates-to-google.html',
+      )),
+    );
+  }
+
+  return $requirements;
+}
diff --git a/google_map_field.routing.yml b/google_map_field.routing.yml
new file mode 100644
index 0000000..6c5a43a
--- /dev/null
+++ b/google_map_field.routing.yml
@@ -0,0 +1,7 @@
+gmap.field.settings:
+  path: '/admin/config/gmap_field_settings'
+  defaults:
+    _form: '\Drupal\google_map_field\Form\GmapFieldSettingsForm'
+    _title: 'google map api key configuration'
+  requirements:
+    _permission: 'administer site configuration'
diff --git a/src/Form/GmapFieldSettingsForm.php b/src/Form/GmapFieldSettingsForm.php
new file mode 100644
index 0000000..cf26d4b
--- /dev/null
+++ b/src/Form/GmapFieldSettingsForm.php
@@ -0,0 +1,112 @@
+<?php
+
+namespace Drupal\google_map_field\Form;
+
+/**
+ * @file
+ * Contains \Drupal\google_map_field\Form\GmapFieldSettingsForm.
+ */
+use Drupal\Core\Form\ConfigFormBase;
+use Drupal\Core\Form\FormStateInterface;
+
+// Enumerate options for type of API authentication.
+define('GOOGLE_MAP_FIELD_AUTH_KEY', 1);
+define('GOOGLE_MAP_FIELD_AUTH_WORK', 2);
+
+/**
+ * Administration settings form.
+ */
+class GmapFieldSettingsForm extends ConfigFormBase {
+
+  /**
+   * Implements \Drupal\Core\Form\FormInterface::getFormID().
+   */
+  public function getFormId() {
+    return 'google_map_field_settings';
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  protected function getEditableConfigNames() {
+    return [
+      'google_map_field.settings',
+    ];
+  }
+
+  /**
+   * Implements \Drupal\Core\Form\FormInterface::buildForm().
+   */
+  public function buildForm(array $form, FormStateInterface $form_state) {
+    $config = $this->config('google_map_field.settings');
+    $settings = $config->get();
+    $api_key = '';
+    $client_id = '';
+
+    if (isset($settings['google_map_field_apikey']) && trim($settings['google_map_field_apikey']) != '') {
+      $api_key = $settings['google_map_field_apikey'];
+    }
+
+    if (isset($settings['google_map_field_map_client_id']) && trim($settings['google_map_field_map_client_id']) != '') {
+      $client_id = $settings['google_map_field_map_client_id'];
+    }
+
+    $form['google_map_field_auth_method'] = array(
+      '#type' => 'select',
+      '#title' => t('Google API Authentication Method'),
+      '#description' => t(''),
+      '#default_value' => isset($settings['google_map_field_auth_method']) ? $settings['google_map_field_auth_method'] : GOOGLE_MAP_FIELD_AUTH_KEY,
+      '#options' => array(
+        GOOGLE_MAP_FIELD_AUTH_KEY => t('API Key'),
+        GOOGLE_MAP_FIELD_AUTH_WORK => t('Google Maps API for Work'),
+      ),
+    );
+
+    $form['google_map_field_apikey'] = array(
+      '#type' => 'textfield',
+      '#title' => t('Google Maps API Key'),
+      '#description' => t('Obtain a Google Maps Javascript API key at <a href="@link">@link</a>', array(
+        '@link' => 'https://developers.google.com/maps/documentation/javascript/get-api-key',
+      )),
+      '#default_value' => $api_key,
+      '#required' => FALSE,
+      '#size' => 80,
+      '#states' => array(
+        'visible' => array(
+          ':input[name="google_map_field_auth_method"]' => array('value' => GOOGLE_MAP_FIELD_AUTH_KEY),
+        ),
+      ),
+    );
+
+    $form['google_map_field_map_client_id'] = array(
+      '#type' => 'textfield',
+      '#title' => t('Google Maps API for Work: Client ID'),
+      '#description' => t('For more information, visit: <a href="@link">@link</a>', array(
+        '@link' => 'https://developers.google.com/maps/documentation/javascript/get-api-key#client-id',
+      )),
+      '#default_value' => $client_id,
+      '#required' => FALSE,
+      '#size' => 80,
+      '#states' => array(
+        'visible' => array(
+          ':input[name="google_map_field_auth_method"]' => array('value' => GOOGLE_MAP_FIELD_AUTH_WORK),
+        ),
+      ),
+    );
+
+    return parent::buildForm($form, $form_state);
+  }
+
+  /**
+   * Implements \Drupal\Core\Form\FormInterface:submitForm()
+   */
+  public function submitForm(array &$form, FormStateInterface $form_state) {
+    $config = \Drupal::service('config.factory')->getEditable('google_map_field.settings');
+    $config->set('google_map_field_auth_method', $form_state->getValue('google_map_field_auth_method'))
+        ->set('google_map_field_apikey', $form_state->getValue('google_map_field_apikey'))
+        ->set('google_map_field_map_client_id', $form_state->getValue('google_map_field_map_client_id'))
+        ->save();
+    parent::submitForm($form, $form_state);
+  }
+
+}
