diff options
| -rw-r--r-- | src/cgeo/geocaching/LogTemplateProvider.java | 105 | ||||
| -rw-r--r-- | src/cgeo/geocaching/cgBase.java | 31 | ||||
| -rw-r--r-- | src/cgeo/geocaching/cgCache.java | 5 | ||||
| -rw-r--r-- | src/cgeo/geocaching/cgeoinit.java | 35 | ||||
| -rw-r--r-- | src/cgeo/geocaching/cgeovisit.java | 111 |
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) { |
