aboutsummaryrefslogtreecommitdiffstats
path: root/main/src/cgeo/geocaching/utils/LogTemplateProvider.java
diff options
context:
space:
mode:
Diffstat (limited to 'main/src/cgeo/geocaching/utils/LogTemplateProvider.java')
-rw-r--r--main/src/cgeo/geocaching/utils/LogTemplateProvider.java156
1 files changed, 156 insertions, 0 deletions
diff --git a/main/src/cgeo/geocaching/utils/LogTemplateProvider.java b/main/src/cgeo/geocaching/utils/LogTemplateProvider.java
new file mode 100644
index 0000000..141e3d9
--- /dev/null
+++ b/main/src/cgeo/geocaching/utils/LogTemplateProvider.java
@@ -0,0 +1,156 @@
+package cgeo.geocaching.utils;
+
+import cgeo.geocaching.R;
+import cgeo.geocaching.Settings;
+import cgeo.geocaching.cgBase;
+
+import org.apache.commons.lang3.StringUtils;
+
+import android.util.Log;
+
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+/**
+ * provides all the available templates for logging
+ *
+ */
+public class LogTemplateProvider {
+ public static abstract class LogTemplate {
+ private final String template;
+ private final int resourceId;
+
+ protected LogTemplate(String template, int resourceId) {
+ this.template = template;
+ this.resourceId = resourceId;
+ }
+
+ abstract public String getValue(boolean offline);
+
+ public int getResourceId() {
+ return resourceId;
+ }
+
+ public int getItemId() {
+ return template.hashCode();
+ }
+
+ public String getTemplateString() {
+ return template;
+ }
+
+ protected String apply(String input, boolean offline) {
+ if (input.contains("[" + template + "]")) {
+ return StringUtils.replace(input, "[" + template + "]", getValue(offline));
+ }
+ return input;
+ }
+ }
+
+ private static LogTemplate[] templates;
+
+ public static LogTemplate[] getTemplates() {
+ if (templates == null) {
+ templates = new LogTemplate[] {
+ new LogTemplate("DATE", R.string.init_signature_template_date) {
+
+ @Override
+ public String getValue(final boolean offline) {
+ return cgBase.formatFullDate(System.currentTimeMillis());
+ }
+ },
+ new LogTemplate("TIME", R.string.init_signature_template_time) {
+
+ @Override
+ public String getValue(final boolean offline) {
+ return cgBase.formatTime(System.currentTimeMillis());
+ }
+ },
+ new LogTemplate("DATETIME", R.string.init_signature_template_datetime) {
+
+ @Override
+ public String getValue(final boolean offline) {
+ final long currentTime = System.currentTimeMillis();
+ return cgBase.formatFullDate(currentTime) + " " + cgBase.formatTime(currentTime);
+ }
+ },
+ new LogTemplate("USER", R.string.init_signature_template_user) {
+
+ @Override
+ public String getValue(final boolean offline) {
+ return Settings.getUsername();
+ }
+ },
+ new LogTemplate("NUMBER", R.string.init_signature_template_number) {
+
+ @Override
+ public String getValue(final boolean offline) {
+ if (offline) {
+ return "";
+ }
+ String findCount = "";
+ final String page = cgBase.getResponseData(cgBase.request("http://www.geocaching.com/email/", null, false, false, false));
+ int current = parseFindCount(page);
+
+ if (current >= 0) {
+ findCount = String.valueOf(current + 1);
+ }
+ return findCount;
+ }
+ }
+ };
+ }
+ return templates;
+ }
+
+ public static LogTemplate getTemplate(int itemId) {
+ for (LogTemplate template : getTemplates()) {
+ if (template.getItemId() == itemId) {
+ return template;
+ }
+ }
+ return null;
+ }
+
+ public static String applyTemplates(String signature, boolean offline) {
+ if (signature == null) {
+ return "";
+ }
+ String result = signature;
+ for (LogTemplate template : getTemplates()) {
+ result = template.apply(result, offline);
+ }
+ return result;
+ }
+
+ private static int parseFindCount(String page) {
+ if (StringUtils.isBlank(page)) {
+ return -1;
+ }
+
+ int findCount = -1;
+
+ try {
+ final Pattern findPattern = Pattern.compile("<strong><img.+?icon_smile.+?title=\"Caches Found\" /> ([,\\d]+)", Pattern.CASE_INSENSITIVE);
+ final Matcher findMatcher = findPattern.matcher(page);
+ if (findMatcher.find()) {
+ if (findMatcher.groupCount() > 0) {
+ String count = findMatcher.group(1);
+
+ if (count != null) {
+ if (count.length() == 0) {
+ findCount = 0;
+ } else {
+ findCount = Integer.parseInt(count.replaceAll("[.,]", ""));
+ }
+ }
+ }
+ }
+ } catch (Exception e) {
+ Log.w(Settings.tag, "cgBase.parseFindCount: " + e.toString());
+ }
+
+ return findCount;
+ }
+
+}