@NonNull
    public static List<LogTemplate> getTemplatesWithSignature() {
        final List<LogTemplate> templates = getTemplatesWithoutSignature();
        int index = 0;
        templates.add(index++, new LogTemplate("SIGNATURE", R.string.init_signature) {
            @Override
            public String getValue(final LogContext context) {
                final String nestedTemplate = Settings.getSignature();
                if (StringUtils.contains(nestedTemplate, "SIGNATURE")) {
                    return "invalid signature template";
                }
                return applyTemplates(nestedTemplate, context);
            }
        });
        for (Settings.PrefLogTemplate template : Settings.getLogTemplates()) {
            templates.add(index++, new LogTemplate("TEMPLATE" + template.getKey(), template.getTitle()) {
                @Override
                public String getValue(final LogContext context) {
                    if (StringUtils.contains(template.getText(), "TEMPLATE" + template.getKey())) {
                        return "invalid template";
                    }
                    return applyTemplates(template.getText(), context);
                }
            });
        }
        // Add the location log template to the bottom of the list instead of at a certain index
        templates.add(new LogTemplate("LOCATION", R.string.init_signature_template_location) {
            @Override
            public String getValue(final LogContext context) {
                final GeoData geo = LocationDataProvider.getInstance().currentGeo();
                return String.format(TEMPLATE_LOCATION_ACCURACY_FORMAT, geo.getCoords(), Units.getDistanceFromMeters(geo.getAccuracy()));
            }
        });
        return templates;
    }
@return all user-facing templates, including the signature template
main/src/main/java/cgeo/geocaching/log/LogTemplateProvider.java