anchor.diff:          '';
         };
   
  +      enableNmea = mkOption {
  +        type = types.bool;
  +        default = true;
  +        description = ''
  +          Whether to fetch location from NMEA sources on local network.
  +        '';
  +      };
  +
  +      enable3G = mkOption {
  +        type = types.bool;
  +        default = true;
  +        description = ''
  +          Whether to enable 3G source.
  +        '';
  +      };
  +
  +      enableCDMA = mkOption {
  +        type = types.bool;
  +        default = true;
  +        description = ''
  +          Whether to enable CDMA source.
  +        '';
  +      };
  +
  +      enableModemGPS = mkOption {
  +        type = types.bool;
  +        default = true;
  +        description = ''
  +          Whether to enable Modem-GPS source.
  +        '';
  +      };
  +
  +      enableWifi = mkOption {
  +        type = types.bool;
  +        default = true;
  +        description = ''
  +          Whether to enable WiFi source.
  +        '';
  +      };
  +
  +      geoProviderUrl = mkOption {
  +        type = types.str;
  +        default = "https://location.services.mozilla.com/v1/geolocate?key=geoclue";
  +        example = "https://www.googleapis.com/geolocation/v1/geolocate?key=YOUR_KEY";
  +        description = ''
  +          The url to the wifi GeoLocation Service.
  +        '';
  +      };
  +
  +      submitData = mkOption {
  +        type = types.bool;
  +        default = false;
  +        description = ''
  +          Whether to submit data to a GeoLocation Service.
  +        '';
  +      };
  +
  +      submissionUrl = mkOption {
  +        type = types.str;
  +        default = "https://location.services.mozilla.com/v1/submit?key=geoclue";
  +        description = ''
  +          The url to submit data to a GeoLocation Service.
  +        '';
  +      };
  +
  +      submissionNick = mkOption {
  +        type = types.str;
  +        default = "geoclue";
  +        description = ''
  +          A nickname to submit network data with.
  +          Must be 2-32 characters long.
  +        '';
  +      };
  +
  +      appConfig = mkOption {
  +        type = types.loaOf appConfigModule;
  +        default = {};
  +        example = literalExample ''
  +          "com.github.app" = {
  +            isAllowed = true;
  +            isSystem = true;
  +            users = [ "300" ];
  +          };
  +        '';
  +        description = ''
  +          Specify extra settings per application.
  +        '';
  +      };
  +
       };
   
     };
   
   
     ###### implementation
  -  config = mkIf config.services.geoclue2.enable {
  +  config = mkIf cfg.enable {
   
       environment.systemPackages = [ package ];
   
       services.dbus.packages = [ package ];
   
       systemd.packages = [ package ];
  -  
  +
  +    # restart geoclue service when the configuration changes
  +    systemd.services."geoclue".restartTriggers = [
  +      config.environment.etc."geoclue/geoclue.conf".source
  +    ];
  +
       # this needs to run as a user service, since it's associated with the
       # user who is making the requests
  -    systemd.user.services = mkIf config.services.geoclue2.enableDemoAgent { 
  +    systemd.user.services = mkIf cfg.enableDemoAgent {
         "geoclue-agent" = {
           description = "Geoclue agent";
           script = "${package}/libexec/geoclue-2.0/demos/agent";
  
positive.code: let
    # the demo agent isn't built by default, but we need it here
    package = pkgs.geoclue2.override { withDemoAgent = config.services.geoclue2.enableDemoAgent; };
  in
  {
  
  
negative.code:       };
      };
  
      services.geoclue2.appConfig."epiphany" = {
        isAllowed = true;
        isSystem = false;
      };
  
      services.geoclue2.appConfig."firefox" = {
        isAllowed = true;
        isSystem = false;
      };
  
      environment.etc."geoclue/geoclue.conf".text =
        generators.toINI {} ({
          agent = {
            whitelist = concatStringsSep ";"
              (optional cfg.enableDemoAgent "geoclue-demo-agent" ++ defaultWhitelist);
          };
          network-nmea = {
            enable = cfg.enableNmea;
          };
          "3g" = {
            enable = cfg.enable3G;
          };
          cdma = {
            enable = cfg.enableCDMA;
          };
          modem-gps = {
            enable = cfg.enableModemGPS;
          };
          wifi = {
            enable = cfg.enableWifi;
            url = cfg.geoProviderUrl;
            submit-data = boolToString cfg.submitData;
            submission-url = cfg.submissionUrl;
            submission-nick = cfg.submissionNick;
          };
        } // mapAttrs' appConfigToINICompatible cfg.appConfig);
    };
  }
  