diff options
| author | Marco Jacob <mjacob@union06.de> | 2013-06-15 16:23:55 +0200 |
|---|---|---|
| committer | Marco Jacob <mjacob@union06.de> | 2013-06-26 18:08:20 +0200 |
| commit | fbc75936daaa3ea5e2596c0aa71593cbe9f33614 (patch) | |
| tree | 682973d51b4c1e1578e02ae8e690c88dbc74aeb1 /main/src/cgeo/geocaching | |
| parent | 3d41a7c9b48fea09d6cc74cd96fa1a13b777eeb2 (diff) | |
| download | cgeo-fbc75936daaa3ea5e2596c0aa71593cbe9f33614.zip cgeo-fbc75936daaa3ea5e2596c0aa71593cbe9f33614.tar.gz cgeo-fbc75936daaa3ea5e2596c0aa71593cbe9f33614.tar.bz2 | |
make personalNote multiline again, upload button, merge on refresh
Diffstat (limited to 'main/src/cgeo/geocaching')
| -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 |
7 files changed, 238 insertions, 50 deletions
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; - } - - } |
