aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/cgeo/geocaching/LogTemplateProvider.java105
-rw-r--r--src/cgeo/geocaching/cgBase.java31
-rw-r--r--src/cgeo/geocaching/cgCache.java5
-rw-r--r--src/cgeo/geocaching/cgeoinit.java35
-rw-r--r--src/cgeo/geocaching/cgeovisit.java111
5 files changed, 179 insertions, 108 deletions
diff --git a/src/cgeo/geocaching/LogTemplateProvider.java b/src/cgeo/geocaching/LogTemplateProvider.java
new file mode 100644
index 0000000..09acd0d
--- /dev/null
+++ b/src/cgeo/geocaching/LogTemplateProvider.java
@@ -0,0 +1,105 @@
+package cgeo.geocaching;
+
+import java.util.HashMap;
+
+
+/**
+ * provides all the available templates for logging
+ *
+ */
+public class LogTemplateProvider {
+ public static abstract class LogTemplate {
+ private String template;
+ private int resourceId;
+
+ public LogTemplate(String template, int resourceId) {
+ this.template = template;
+ this.resourceId = resourceId;
+ }
+
+ abstract String getValue(cgBase base);
+
+ public int getResourceId() {
+ return resourceId;
+ }
+
+ public int getItemId() {
+ return template.hashCode();
+ }
+
+ public String getTemplateString() {
+ return template;
+ }
+
+ protected String apply(String input, cgBase base) {
+ return input.replaceAll("\\[" + template + "\\]", getValue(base));
+ }
+ }
+
+ private static LogTemplate[] templates;
+
+ public static LogTemplate[] getTemplates() {
+ if (templates == null) {
+ templates = new LogTemplate[] {
+ new LogTemplate("DATE", R.string.init_signature_template_date) {
+
+ @Override
+ String getValue(final cgBase base) {
+ return base.formatFullDate(System.currentTimeMillis());
+ }
+ },
+ new LogTemplate("TIME", R.string.init_signature_template_time) {
+
+ @Override
+ String getValue(final cgBase base) {
+ return base.formatTime(System.currentTimeMillis());
+ }
+ },
+ new LogTemplate("USER", R.string.init_signature_template_user) {
+
+ @Override
+ String getValue(final cgBase base) {
+ return base.getUserName();
+ }
+ },
+ new LogTemplate("NUMBER", R.string.init_signature_template_number) {
+
+ @Override
+ String getValue(final cgBase base) {
+ String findCount = "";
+ final HashMap<String, String> params = new HashMap<String, String>();
+ final String page = base.request(false, "www.geocaching.com", "/my/", "GET", params, false, false, false).getData();
+ int current = cgBase.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, cgBase base) {
+ if (signature == null) {
+ return "";
+ }
+ String result = signature;
+ for (LogTemplate template : getTemplates()) {
+ result = template.apply(result, base);
+ }
+ return result;
+ }
+
+}
diff --git a/src/cgeo/geocaching/cgBase.java b/src/cgeo/geocaching/cgBase.java
index 0450a56..bbf2427 100644
--- a/src/cgeo/geocaching/cgBase.java
+++ b/src/cgeo/geocaching/cgBase.java
@@ -65,6 +65,7 @@ import android.text.style.StrikethroughSpan;
import android.util.Log;
import android.view.Display;
import android.view.WindowManager;
+import android.widget.EditText;
import cgeo.geocaching.activity.ActivityMixin;
public class cgBase {
@@ -5560,4 +5561,34 @@ public class cgBase {
public String formatShortDate(long date) {
return DateUtils.formatDateTime(context, date, DateUtils.FORMAT_SHOW_DATE | DateUtils.FORMAT_NUMERIC_DATE);
}
+
+ /**
+ * TODO This method is only needed until the settings are a singleton
+ * @return
+ */
+ public String getUserName() {
+ return settings.getUsername();
+ }
+
+ /**
+ * insert text into the EditText at the current cursor position
+ * @param editText
+ * @param insertText
+ * @param addSpace add a space character, if there is no whitespace before the current cursor position
+ */
+ static void insertAtPosition(final EditText editText, String insertText, final boolean addSpace) {
+ int selectionStart = editText.getSelectionStart();
+ int selectionEnd = editText.getSelectionEnd();
+ int start = Math.min(selectionStart, selectionEnd);
+ int end = Math.max(selectionStart, selectionEnd);
+
+ String content = editText.getText().toString();
+ if (start > 0 && !Character.isWhitespace(content.charAt(start - 1))) {
+ insertText = " " + insertText;
+ }
+
+ editText.getText().replace(start, end, insertText);
+ int newCursor = start + insertText.length();
+ editText.setSelection(newCursor, newCursor);
+ }
}
diff --git a/src/cgeo/geocaching/cgCache.java b/src/cgeo/geocaching/cgCache.java
index 1fc7bff..06adbb1 100644
--- a/src/cgeo/geocaching/cgCache.java
+++ b/src/cgeo/geocaching/cgCache.java
@@ -267,10 +267,7 @@ public class cgCache {
}
public boolean isEventCache() {
- if (type.equalsIgnoreCase("event") || type.equalsIgnoreCase("mega") || type.equalsIgnoreCase("cito")) {
- return true;
- }
- return false;
+ return (type.equalsIgnoreCase("event") || type.equalsIgnoreCase("mega") || type.equalsIgnoreCase("cito"));
}
diff --git a/src/cgeo/geocaching/cgeoinit.java b/src/cgeo/geocaching/cgeoinit.java
index 53674cd..e58b9ae 100644
--- a/src/cgeo/geocaching/cgeoinit.java
+++ b/src/cgeo/geocaching/cgeoinit.java
@@ -24,16 +24,12 @@ import android.widget.CheckBox;
import android.widget.EditText;
import android.widget.Spinner;
import android.widget.TextView;
+import cgeo.geocaching.LogTemplateProvider.LogTemplate;
import cgeo.geocaching.cgSettings.mapSourceEnum;
import cgeo.geocaching.activity.AbstractActivity;
public class cgeoinit extends AbstractActivity {
- private static final int MENU_ITEM_DATE = 1;
- private static final int MENU_ITEM_TIME = 2;
- private static final int MENU_ITEM_USER = 3;
- private static final int MENU_ITEM_NUMBER = 4;
-
private final int SELECT_MAPFILE_REQUEST=1;
private ProgressDialog loginDialog = null;
@@ -184,36 +180,25 @@ public class cgeoinit extends AbstractActivity {
ContextMenuInfo menuInfo) {
if (enableTemplatesMenu) {
menu.setHeaderTitle(R.string.init_signature_template_button);
- menu.add(0, MENU_ITEM_DATE, 0, R.string.init_signature_template_date);
- menu.add(0, MENU_ITEM_TIME, 0, R.string.init_signature_template_time);
- menu.add(0, MENU_ITEM_USER, 0, R.string.init_signature_template_user);
- menu.add(0, MENU_ITEM_NUMBER, 0, R.string.init_signature_template_number);
+ for (LogTemplate template : LogTemplateProvider.getTemplates()) {
+ menu.add(0, template.getItemId(), 0, template.getResourceId());
+ }
}
}
@Override
public boolean onContextItemSelected(MenuItem item) {
- switch (item.getItemId()) {
- case MENU_ITEM_DATE:
- return insertSignatureTemplate("DATE");
- case MENU_ITEM_NUMBER:
- return insertSignatureTemplate("NUMBER");
- case MENU_ITEM_TIME:
- return insertSignatureTemplate("TIME");
- case MENU_ITEM_USER:
- return insertSignatureTemplate("USER");
- default:
- break;
+ LogTemplate template = LogTemplateProvider.getTemplate(item.getItemId());
+ if (template != null) {
+ return insertSignatureTemplate(template);
}
return super.onContextItemSelected(item);
}
- private boolean insertSignatureTemplate(final String template) {
+ private boolean insertSignatureTemplate(final LogTemplate template) {
EditText sig = (EditText) findViewById(R.id.signature);
- String insertText = "["+template+"]";
- int start = sig.getSelectionStart();
- int end = sig.getSelectionEnd();
- sig.getText().replace(Math.min(start, end), Math.max(start, end), insertText);
+ String insertText = "[" + template.getTemplateString() + "]";
+ cgBase.insertAtPosition(sig, insertText, true);
return true;
}
diff --git a/src/cgeo/geocaching/cgeovisit.java b/src/cgeo/geocaching/cgeovisit.java
index 118cc29..4f5a2d3 100644
--- a/src/cgeo/geocaching/cgeovisit.java
+++ b/src/cgeo/geocaching/cgeovisit.java
@@ -25,8 +25,12 @@ import android.widget.CheckBox;
import android.widget.EditText;
import android.widget.LinearLayout;
import android.widget.TextView;
+import cgeo.geocaching.LogTemplateProvider.LogTemplate;
public class cgeovisit extends cgLogForm {
+ private static final int MENU_SIGNATURE = 1;
+ private static final int SUBMENU_VOTE = 2;
+
private LayoutInflater inflater = null;
private cgCache cache = null;
private ArrayList<Integer> types = new ArrayList<Integer>();
@@ -50,12 +54,7 @@ public class cgeovisit extends cgLogForm {
private LinearLayout tweetBox = null;
private double rating = 0.0;
private boolean tbChanged = false;
- // constants
- private final static int LOG_SIGNATURE = 0x1;
- private final static int LOG_TIME = 0x2;
- private final static int LOG_DATE = 0x4;
- private final static int LOG_DATE_TIME = 0x6;
- private final static int LOG_SIGNATURE_DATE_TIME = 0x7;
+
// handlers
private Handler showProgressHandler = new Handler() {
@Override
@@ -277,13 +276,12 @@ public class cgeovisit extends cgLogForm {
SubMenu menuLog = null;
menuLog = menu.addSubMenu(0, 0, 0, res.getString(R.string.log_add)).setIcon(android.R.drawable.ic_menu_add);
- menuLog.add(0, LOG_DATE_TIME, 0, res.getString(R.string.log_date_time));
- menuLog.add(0, LOG_DATE, 0, res.getString(R.string.log_date));
- menuLog.add(0, LOG_TIME, 0, res.getString(R.string.log_time));
- menuLog.add(0, LOG_SIGNATURE, 0, res.getString(R.string.init_signature));
- menuLog.add(0, LOG_SIGNATURE_DATE_TIME, 0, res.getString(R.string.log_date_time) + " & " + res.getString(R.string.init_signature));
+ for (LogTemplate template : LogTemplateProvider.getTemplates()) {
+ menuLog.add(0, template.getItemId(), 0, template.getResourceId());
+ }
+ menuLog.add(0, MENU_SIGNATURE, 0, res.getString(R.string.init_signature));
- SubMenu menuStars = menu.addSubMenu(0, 9, 0, res.getString(R.string.log_rating)).setIcon(android.R.drawable.ic_menu_sort_by_size);
+ SubMenu menuStars = menu.addSubMenu(0, SUBMENU_VOTE, 0, res.getString(R.string.log_rating)).setIcon(android.R.drawable.ic_menu_sort_by_size);
menuStars.add(0, 10, 0, res.getString(R.string.log_no_rating));
menuStars.add(0, 19, 0, res.getString(R.string.log_stars_5));
menuStars.add(0, 18, 0, res.getString(R.string.log_stars_45));
@@ -301,11 +299,10 @@ public class cgeovisit extends cgLogForm {
@Override
public boolean onPrepareOptionsMenu(Menu menu) {
boolean signatureAvailable = settings.getSignature() != null;
- menu.findItem(LOG_SIGNATURE).setVisible(signatureAvailable);
- menu.findItem(LOG_SIGNATURE_DATE_TIME).setVisible(signatureAvailable);
+ menu.findItem(MENU_SIGNATURE).setVisible(signatureAvailable);
boolean voteAvailable = settings.isGCvoteLogin() && typeSelected == cgBase.LOG_FOUND_IT && cache.guid != null && cache.guid.length() > 0;
- menu.findItem(9).setVisible(voteAvailable);
+ menu.findItem(SUBMENU_VOTE).setVisible(voteAvailable);
return true;
}
@@ -314,9 +311,13 @@ public class cgeovisit extends cgLogForm {
public boolean onOptionsItemSelected(MenuItem item) {
int id = item.getItemId();
- if ((id >= LOG_SIGNATURE && id <= LOG_SIGNATURE_DATE_TIME)) {
- addSignature(id);
-
+ if (id == MENU_SIGNATURE) {
+ EditText log = (EditText) findViewById(R.id.log);
+ String content = log.getText().toString();
+ if (content.length() > 0) {
+ insertIntoLog("\n");
+ }
+ insertIntoLog(LogTemplateProvider.applyTemplates(settings.getSignature(), base));
return true;
} else if (id >= 10 && id <= 19) {
rating = (id - 9) / 2.0;
@@ -329,11 +330,22 @@ public class cgeovisit extends cgLogForm {
} else {
post.setText(res.getString(R.string.log_post_rate) + " " + ratingTextValue(rating) + "*");
}
+ return true;
+ }
+ LogTemplate template = LogTemplateProvider.getTemplate(id);
+ if (template != null) {
+ String newText = template.getValue(base);
+ insertIntoLog(newText);
+ return true;
}
-
return false;
}
+ private void insertIntoLog(String newText) {
+ EditText log = (EditText) findViewById(R.id.log);
+ cgBase.insertAtPosition(log, newText, true);
+ }
+
private static String ratingTextValue(final double rating) {
return String.format(Locale.getDefault(), "%.1f", rating);
}
@@ -363,65 +375,6 @@ public class cgeovisit extends cgLogForm {
return result.trim().equalsIgnoreCase("ok");
}
- public void addSignature(int id) {
- final long now = System.currentTimeMillis();
- final String dateString = base.formatFullDate(now);
- final String timeString = base.formatTime(now);
- EditText text = null;
- String textContent = null;
- StringBuilder addText = new StringBuilder();
-
- text = (EditText) findViewById(R.id.log);
- textContent = text.getText().toString();
-
-
- if ((id & LOG_DATE) == LOG_DATE) {
- addText.append(dateString);
- if ((id & LOG_TIME) == LOG_TIME) {
- addText.append(" | ");
- }
- }
-
- if ((id & LOG_TIME) == LOG_TIME) {
- addText.append(timeString);
- }
-
- if ((id & LOG_SIGNATURE) == LOG_SIGNATURE && settings.getSignature() != null) {
- String findCount = "";
- if (addText.length() > 0) {
- addText.append("\n");
- }
-
- if (settings.getSignature().contains("[NUMBER]")) {
- final HashMap<String, String> params = new HashMap<String, String>();
- final String page = base.request(false, "www.geocaching.com", "/my/", "GET", params, false, false, false).getData();
- int current = cgBase.parseFindCount(page);
-
- if (current >= 0) {
- findCount = "" + (current + 1);
- }
- }
-
- String signature = settings.getSignature()
- .replaceAll("\\[DATE\\]", dateString)
- .replaceAll("\\[TIME\\]", timeString)
- .replaceAll("\\[USER\\]", settings.getUsername())
- .replaceAll("\\[NUMBER\\]", findCount);
-
- addText.append(signature);
- }
-
- final String addTextDone;
- if (textContent.length() > 0 && addText.length() > 0 ) {
- addTextDone = textContent + "\n" + addText.toString();
- } else {
- addTextDone = textContent + addText.toString();
- }
-
- text.setText(addTextDone, TextView.BufferType.NORMAL);
- text.setSelection(text.getText().toString().length());
- }
-
@Override
public void onCreateContextMenu(ContextMenu menu, View view, ContextMenu.ContextMenuInfo info) {
super.onCreateContextMenu(menu, view, info);
@@ -580,7 +533,7 @@ public class cgeovisit extends cgLogForm {
&& settings.signatureAutoinsert
&& settings.getSignature().length() > 0
&& 0 == ((EditText) findViewById(R.id.log)).getText().length()) {
- addSignature(LOG_SIGNATURE);
+ insertIntoLog(LogTemplateProvider.applyTemplates(settings.getSignature(), base));
}
if (types.contains(typeSelected) == false) {