diff options
Diffstat (limited to 'main')
| -rw-r--r-- | main/res/layout/cachedetail_description_page.xml | 4 | ||||
| -rw-r--r-- | main/res/layout/fragment_edit_note.xml | 4 | ||||
| -rw-r--r-- | main/res/values-de/strings.xml | 4 | ||||
| -rw-r--r-- | main/res/values/strings.xml | 4 | ||||
| -rw-r--r-- | main/src/cgeo/geocaching/CacheDetailActivity.java | 69 | ||||
| -rw-r--r-- | main/src/cgeo/geocaching/Geocache.java | 8 | ||||
| -rw-r--r-- | main/src/cgeo/geocaching/PersonalNote.java | 112 | ||||
| -rw-r--r-- | main/src/cgeo/geocaching/connector/AbstractConnector.java | 24 | ||||
| -rw-r--r-- | main/src/cgeo/geocaching/connector/IConnector.java | 13 | ||||
| -rw-r--r-- | main/src/cgeo/geocaching/connector/gc/GCConnector.java | 5 | ||||
| -rw-r--r-- | main/src/cgeo/geocaching/ui/EditNoteDialog.java | 57 |
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 988fd33..1445663 100644 --- a/main/res/values-de/strings.xml +++ b/main/res/values-de/strings.xml @@ -532,6 +532,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 5fd0e1e..579e7d5 100644 --- a/main/res/values/strings.xml +++ b/main/res/values/strings.xml @@ -535,6 +535,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 f32bee1..6ec034d 100644 --- a/main/src/cgeo/geocaching/CacheDetailActivity.java +++ b/main/src/cgeo/geocaching/CacheDetailActivity.java @@ -1733,6 +1733,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); @@ -1803,6 +1815,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); @@ -2297,6 +2324,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 05423c3..9649f5f 100644 --- a/main/src/cgeo/geocaching/Geocache.java +++ b/main/src/cgeo/geocaching/Geocache.java @@ -281,8 +281,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 9e516e9..33bb1ce 100644 --- a/main/src/cgeo/geocaching/connector/gc/GCConnector.java +++ b/main/src/cgeo/geocaching/connector/gc/GCConnector.java @@ -79,6 +79,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; - } - - } |
