aboutsummaryrefslogtreecommitdiffstats
path: root/main
diff options
context:
space:
mode:
authorMarco Jacob <mjacob@union06.de>2013-06-15 16:23:55 +0200
committerMarco Jacob <mjacob@union06.de>2013-06-26 18:08:20 +0200
commitfbc75936daaa3ea5e2596c0aa71593cbe9f33614 (patch)
tree682973d51b4c1e1578e02ae8e690c88dbc74aeb1 /main
parent3d41a7c9b48fea09d6cc74cd96fa1a13b777eeb2 (diff)
downloadcgeo-fbc75936daaa3ea5e2596c0aa71593cbe9f33614.zip
cgeo-fbc75936daaa3ea5e2596c0aa71593cbe9f33614.tar.gz
cgeo-fbc75936daaa3ea5e2596c0aa71593cbe9f33614.tar.bz2
make personalNote multiline again, upload button, merge on refresh
Diffstat (limited to 'main')
-rw-r--r--main/res/layout/cachedetail_description_page.xml4
-rw-r--r--main/res/layout/fragment_edit_note.xml4
-rw-r--r--main/res/values-de/strings.xml4
-rw-r--r--main/res/values/strings.xml4
-rw-r--r--main/src/cgeo/geocaching/CacheDetailActivity.java69
-rw-r--r--main/src/cgeo/geocaching/Geocache.java8
-rw-r--r--main/src/cgeo/geocaching/PersonalNote.java112
-rw-r--r--main/src/cgeo/geocaching/connector/AbstractConnector.java24
-rw-r--r--main/src/cgeo/geocaching/connector/IConnector.java13
-rw-r--r--main/src/cgeo/geocaching/connector/gc/GCConnector.java5
-rw-r--r--main/src/cgeo/geocaching/ui/EditNoteDialog.java57
11 files changed, 252 insertions, 52 deletions
diff --git a/main/res/layout/cachedetail_description_page.xml b/main/res/layout/cachedetail_description_page.xml
index 5c05c20..8325798 100644
--- a/main/res/layout/cachedetail_description_page.xml
+++ b/main/res/layout/cachedetail_description_page.xml
@@ -134,6 +134,10 @@
android:id="@+id/edit_personalnote"
style="@style/button_small"
android:text="@string/cache_personal_note_edit" />
+ <Button
+ android:id="@+id/upload_personalnote"
+ style="@style/button_small"
+ android:text="@string/cache_personal_note_upload" />
</LinearLayout>
</LinearLayout>
diff --git a/main/res/layout/fragment_edit_note.xml b/main/res/layout/fragment_edit_note.xml
index 1ed5e84..1e9fbf9 100644
--- a/main/res/layout/fragment_edit_note.xml
+++ b/main/res/layout/fragment_edit_note.xml
@@ -9,7 +9,7 @@
android:id="@+id/note"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
- android:imeOptions="actionDone"
- android:inputType="text" />
+ android:inputType="textMultiLine"
+ android:lines="8" />
</LinearLayout> \ No newline at end of file
diff --git a/main/res/values-de/strings.xml b/main/res/values-de/strings.xml
index 238b203..726e281 100644
--- a/main/res/values-de/strings.xml
+++ b/main/res/values-de/strings.xml
@@ -533,6 +533,10 @@
<string name="cache_log_image_default_title">Bild</string>
<string name="cache_personal_note">Persönliche Notiz</string>
<string name="cache_personal_note_edit">Bearbeiten</string>
+ <string name="cache_personal_note_upload">Hochladen</string>
+ <string name="cache_personal_note_uploading">Persönliche Notizen werden gesendet</string>
+ <string name="cache_personal_note_upload_done">Persönliche Notizen wurden hochgeladen</string>
+ <string name="cache_personal_note_upload_cancelled">Hochladen der Notizen abgebrochen</string>
<string name="cache_personal_note_unstored">Cache noch nicht gespeichert</string>
<string name="cache_personal_note_store">Der Cache wird zunächst gespeichert, damit persönliche Notizen möglich sind.</string>
<string name="cache_description">Beschreibung</string>
diff --git a/main/res/values/strings.xml b/main/res/values/strings.xml
index e82b44c..c80f250 100644
--- a/main/res/values/strings.xml
+++ b/main/res/values/strings.xml
@@ -534,6 +534,10 @@
<string name="cache_log_image_default_title">Photo</string>
<string name="cache_personal_note">Personal note</string>
<string name="cache_personal_note_edit">Edit</string>
+ <string name="cache_personal_note_upload">Upload</string>
+ <string name="cache_personal_note_uploading">Uploading personal note</string>
+ <string name="cache_personal_note_upload_done">Personal note uploaded</string>
+ <string name="cache_personal_note_upload_cancelled">Personal note upload cancelled</string>
<string name="cache_personal_note_unstored">Cache not stored</string>
<string name="cache_personal_note_store">The cache will be stored first to enable personal notes.</string>
<string name="cache_description">Description</string>
diff --git a/main/src/cgeo/geocaching/CacheDetailActivity.java b/main/src/cgeo/geocaching/CacheDetailActivity.java
index b4c7b33..7acb4ae 100644
--- a/main/src/cgeo/geocaching/CacheDetailActivity.java
+++ b/main/src/cgeo/geocaching/CacheDetailActivity.java
@@ -1815,6 +1815,18 @@ public class CacheDetailActivity extends AbstractViewPagerActivity<CacheDetailAc
}
}
});
+ final Button personalNoteUpload = (Button) view.findViewById(R.id.upload_personalnote);
+ if (cache.isOffline() && ConnectorFactory.getConnector(cache).supportsPersonalNote()) {
+ personalNoteUpload.setVisibility(View.VISIBLE);
+ personalNoteUpload.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ uploadPersonalNote();
+ }
+ });
+ } else {
+ personalNoteUpload.setVisibility(View.GONE);
+ }
// cache hint and spoiler images
final View hintBoxView = view.findViewById(R.id.hint_box);
@@ -1885,6 +1897,21 @@ public class CacheDetailActivity extends AbstractViewPagerActivity<CacheDetailAc
}
}
+ Thread currentThread;
+
+ private void uploadPersonalNote() {
+ final SimpleHandler myHandler = new SimpleHandler();
+
+ Message cancelMessage = myHandler.cancelMessage(res.getString(R.string.cache_personal_note_upload_cancelled));
+ progress.show(CacheDetailActivity.this, res.getString(R.string.cache_personal_note_uploading), res.getString(R.string.cache_personal_note_uploading), true, cancelMessage);
+
+ if (currentThread != null) {
+ currentThread.interrupt();
+ }
+ currentThread = new UploadPersonalNoteThread(cache, myHandler);
+ currentThread.start();
+ }
+
private void setPersonalNote() {
final String personalNote = cache.getPersonalNote();
personalNoteView.setText(personalNote, TextView.BufferType.SPANNABLE);
@@ -2564,6 +2591,48 @@ public class CacheDetailActivity extends AbstractViewPagerActivity<CacheDetailAc
}
}
+ public class SimpleHandler extends CancellableHandler {
+ public static final String SUCCESS_TEXT = "success_message";
+
+ @Override
+ public void handleRegularMessage(final Message msg) {
+ if (msg.getData() != null && msg.getData().getString(SUCCESS_TEXT) != null) {
+ showToast(msg.getData().getString(SUCCESS_TEXT));
+ }
+ progress.dismiss();
+ return;
+ }
+
+ @Override
+ public void handleCancel(final Object extra) {
+ showToast((String) extra);
+ progress.dismiss();
+ }
+ }
+
+ private class UploadPersonalNoteThread extends Thread {
+ private Geocache cache = null;
+ private CancellableHandler handler = null;
+
+ public UploadPersonalNoteThread(Geocache cache, CancellableHandler handler) {
+ this.cache = cache;
+ this.handler = handler;
+ }
+
+ @Override
+ public void run() {
+ IConnector con = ConnectorFactory.getConnector(cache);
+ if (con.supportsPersonalNote()) {
+ con.uploadPersonalNote(cache);
+ }
+ Message msg = Message.obtain();
+ Bundle bundle = new Bundle();
+ bundle.putString(SimpleHandler.SUCCESS_TEXT, res.getString(R.string.cache_personal_note_upload_done));
+ msg.setData(bundle);
+ handler.sendMessage(msg);
+ }
+ }
+
@Override
protected String getTitle(Page page) {
// show number of waypoints directly in waypoint title
diff --git a/main/src/cgeo/geocaching/Geocache.java b/main/src/cgeo/geocaching/Geocache.java
index 1972c7a..00f1a1f 100644
--- a/main/src/cgeo/geocaching/Geocache.java
+++ b/main/src/cgeo/geocaching/Geocache.java
@@ -280,8 +280,14 @@ public class Geocache implements ICache, IWaypoint {
if (elevation == null) {
elevation = other.elevation;
}
- if (personalNote == null) { // don't use StringUtils.isBlank here. Otherwise we cannot recognize a note which was deleted on GC
+ // don't use StringUtils.isBlank here. Otherwise we cannot recognize a note which was deleted on GC
+ if (personalNote == null) {
personalNote = other.personalNote;
+ } else if (other.personalNote != null && !personalNote.equals(other.personalNote)) {
+ final PersonalNote myNote = new PersonalNote(this);
+ final PersonalNote otherNote = new PersonalNote(other);
+ final PersonalNote mergedNote = myNote.mergeWith(otherNote);
+ personalNote = mergedNote.toString();
}
if (StringUtils.isBlank(getShortDescription())) {
shortdesc = other.getShortDescription();
diff --git a/main/src/cgeo/geocaching/PersonalNote.java b/main/src/cgeo/geocaching/PersonalNote.java
new file mode 100644
index 0000000..3a0f177
--- /dev/null
+++ b/main/src/cgeo/geocaching/PersonalNote.java
@@ -0,0 +1,112 @@
+package cgeo.geocaching;
+
+import org.apache.commons.lang3.StringUtils;
+
+
+public class PersonalNote {
+ private static final String MERGED_PREFIX = "merged:\n";
+ private static final String SEPARATOR = "--\n";
+ private String cgeoNote;
+ private String providerNote;
+ private boolean isOffline;
+
+ private PersonalNote() {
+ // Empty default constructor
+ }
+
+ public PersonalNote(final Geocache cache) {
+ final String personalNote = cache.getPersonalNote();
+ if (!StringUtils.startsWith(personalNote, MERGED_PREFIX)) {
+ this.providerNote = personalNote;
+ return;
+ }
+ final String[] notes = StringUtils.splitByWholeSeparator(personalNote, SEPARATOR);
+ if (notes.length > 0) {
+ notes[0] = StringUtils.removeStart(notes[0], MERGED_PREFIX);
+ notes[0] = StringUtils.removeEnd(notes[0], "\n");
+ }
+ if (notes.length > 1) {
+ this.cgeoNote = notes[0];
+ this.providerNote = notes[1];
+ } else {
+ this.providerNote = notes[0];
+ }
+ this.isOffline = cache.isOffline();
+ }
+
+ public PersonalNote mergeWith(final PersonalNote other) {
+ if (StringUtils.isEmpty(cgeoNote) && StringUtils.isEmpty(other.cgeoNote)) {
+ return mergeOnlyProviderNotes(other);
+ }
+ final PersonalNote result = new PersonalNote();
+ if (cgeoNote != null && other.cgeoNote != null) {
+ if (other.isOffline) {
+ result.cgeoNote = other.cgeoNote;
+ } else {
+ result.cgeoNote = cgeoNote;
+ }
+ }
+ if (other.cgeoNote != null) {
+ result.cgeoNote = other.cgeoNote;
+ } else {
+ result.cgeoNote = cgeoNote;
+ }
+ if (providerNote != null && other.providerNote != null) {
+ if (isOffline) {
+ result.providerNote = providerNote;
+ } else {
+ result.providerNote = other.providerNote;
+ }
+ }
+ if (providerNote != null) {
+ result.providerNote = providerNote;
+ } else {
+ result.providerNote = other.providerNote;
+ }
+ return result;
+ }
+
+ /**
+ * Merge different provider notes from c:geo and provider.
+ *
+ * @param other
+ * The note to merge
+ * @return PersonalNote The merged note
+ */
+ private PersonalNote mergeOnlyProviderNotes(final PersonalNote other) {
+ final PersonalNote result = new PersonalNote();
+ if (StringUtils.isNotEmpty(other.providerNote) && StringUtils.isNotEmpty(providerNote)) {
+ if (providerNote.equals(other.providerNote)) {
+ result.providerNote = providerNote;
+ return result;
+ }
+ if (other.isOffline) {
+ result.cgeoNote = other.providerNote;
+ result.providerNote = providerNote;
+ } else {
+ result.cgeoNote = providerNote;
+ result.providerNote = other.providerNote;
+ }
+ }
+ return result;
+ }
+
+ @Override
+ public String toString() {
+ final StringBuffer buffer = new StringBuffer();
+ if (cgeoNote != null) {
+ buffer.append(MERGED_PREFIX).append(cgeoNote).append("\n").append(SEPARATOR);
+ }
+ buffer.append(providerNote);
+ return buffer.toString();
+ }
+
+ public String getCgeoNote() {
+ return cgeoNote;
+ }
+
+ public String getProviderNote() {
+ return providerNote;
+ }
+
+}
diff --git a/main/src/cgeo/geocaching/connector/AbstractConnector.java b/main/src/cgeo/geocaching/connector/AbstractConnector.java
index 83c1b6f..c034f49 100644
--- a/main/src/cgeo/geocaching/connector/AbstractConnector.java
+++ b/main/src/cgeo/geocaching/connector/AbstractConnector.java
@@ -31,30 +31,22 @@ public abstract class AbstractConnector implements IConnector {
}
@Override
- public boolean supportsOwnCoordinates() {
+ public boolean supportsPersonalNote() {
return false;
}
- /**
- * Uploading modified coordinates to website
- *
- * @param cache
- * @param wpt
- * @return success
- */
@Override
- public boolean uploadModifiedCoordinates(Geocache cache, Geopoint wpt) {
+ public boolean uploadPersonalNote(Geocache cache) {
throw new UnsupportedOperationException();
}
- /**
- * Uploading personal note to website
- *
- * @param cache
- * @return success
- */
@Override
- public boolean uploadPersonalNote(Geocache cache) {
+ public boolean supportsOwnCoordinates() {
+ return false;
+ }
+
+ @Override
+ public boolean uploadModifiedCoordinates(Geocache cache, Geopoint wpt) {
throw new UnsupportedOperationException();
}
diff --git a/main/src/cgeo/geocaching/connector/IConnector.java b/main/src/cgeo/geocaching/connector/IConnector.java
index c44b946..f629a28 100644
--- a/main/src/cgeo/geocaching/connector/IConnector.java
+++ b/main/src/cgeo/geocaching/connector/IConnector.java
@@ -144,11 +144,11 @@ public interface IConnector {
public String getGeocodeFromUrl(final String url);
/**
- * enable/disable uploading modified coordinates to website
+ * enable/disable uploading personal note
*
* @return true, when uploading is possible
*/
- public boolean supportsOwnCoordinates();
+ public boolean supportsPersonalNote();
/**
* Uploading personal note to website
@@ -159,7 +159,14 @@ public interface IConnector {
public boolean uploadPersonalNote(Geocache cache);
/**
- * Reseting of modified coordinates on website to details
+ * enable/disable uploading modified coordinates to website
+ *
+ * @return true, when uploading is possible
+ */
+ public boolean supportsOwnCoordinates();
+
+ /**
+ * Resetting of modified coordinates on website to details
*
* @param cache
* @return success
diff --git a/main/src/cgeo/geocaching/connector/gc/GCConnector.java b/main/src/cgeo/geocaching/connector/gc/GCConnector.java
index d7fbbab..9b2a84a 100644
--- a/main/src/cgeo/geocaching/connector/gc/GCConnector.java
+++ b/main/src/cgeo/geocaching/connector/gc/GCConnector.java
@@ -69,6 +69,11 @@ public class GCConnector extends AbstractConnector implements ISearchByGeocode,
}
@Override
+ public boolean supportsPersonalNote() {
+ return true;
+ }
+
+ @Override
public boolean supportsOwnCoordinates() {
return true;
}
diff --git a/main/src/cgeo/geocaching/ui/EditNoteDialog.java b/main/src/cgeo/geocaching/ui/EditNoteDialog.java
index bbf0618..d121433 100644
--- a/main/src/cgeo/geocaching/ui/EditNoteDialog.java
+++ b/main/src/cgeo/geocaching/ui/EditNoteDialog.java
@@ -1,21 +1,17 @@
package cgeo.geocaching.ui;
import cgeo.geocaching.R;
-import cgeo.geocaching.R.string;
+import android.app.AlertDialog;
+import android.app.Dialog;
+import android.content.DialogInterface;
import android.os.Bundle;
import android.support.v4.app.DialogFragment;
-import android.view.KeyEvent;
import android.view.LayoutInflater;
import android.view.View;
-import android.view.ViewGroup;
-import android.view.WindowManager.LayoutParams;
-import android.view.inputmethod.EditorInfo;
import android.widget.EditText;
-import android.widget.TextView;
-import android.widget.TextView.OnEditorActionListener;
-public class EditNoteDialog extends DialogFragment implements OnEditorActionListener {
+public class EditNoteDialog extends DialogFragment {
public interface EditNoteDialogListener {
void onFinishEditNoteDialog(final String inputText);
@@ -37,34 +33,35 @@ public class EditNoteDialog extends DialogFragment implements OnEditorActionList
}
@Override
- public View onCreateView(final LayoutInflater inflater, final ViewGroup container,
- final Bundle savedInstanceState) {
- View view = inflater.inflate(R.layout.fragment_edit_note, container);
+ public Dialog onCreateDialog(Bundle savedInstanceState) {
+ LayoutInflater inflater = getActivity().getLayoutInflater();
+ View view = inflater.inflate(R.layout.fragment_edit_note, null);
mEditText = (EditText) view.findViewById(R.id.note);
initialNote = getArguments().getString(ARGUMENT_INITIAL_NOTE);
if (initialNote != null) {
mEditText.setText(initialNote);
initialNote = null;
}
- getDialog().setTitle(string.cache_personal_note);
- mEditText.requestFocus();
- getDialog().getWindow().setSoftInputMode(
- LayoutParams.SOFT_INPUT_STATE_VISIBLE);
- mEditText.setOnEditorActionListener(this);
- return view;
+ AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
+ builder.setTitle(R.string.cache_personal_note);
+ builder.setView(view);
+ builder.setPositiveButton(android.R.string.ok,
+ new DialogInterface.OnClickListener() {
+ @Override
+ public void onClick(DialogInterface dialog, int whichButton) {
+ final EditNoteDialogListener activity = (EditNoteDialogListener) getActivity();
+ activity.onFinishEditNoteDialog(mEditText.getText().toString());
+ dialog.dismiss();
+ }
+ });
+ builder.setNegativeButton(android.R.string.cancel,
+ new DialogInterface.OnClickListener() {
+ @Override
+ public void onClick(DialogInterface dialog, int whichButton) {
+ dialog.dismiss();
+ }
+ });
+ return builder.create();
}
-
- @Override
- public boolean onEditorAction(final TextView v, final int actionId, final KeyEvent event) {
- if (EditorInfo.IME_ACTION_DONE == actionId) {
- final EditNoteDialogListener activity = (EditNoteDialogListener) getActivity();
- activity.onFinishEditNoteDialog(mEditText.getText().toString());
- dismiss();
- return true;
- }
- return false;
- }
-
-
}