aboutsummaryrefslogtreecommitdiffstats
path: root/main/src/cgeo/geocaching/VisitCacheActivity.java
diff options
context:
space:
mode:
Diffstat (limited to 'main/src/cgeo/geocaching/VisitCacheActivity.java')
-rw-r--r--main/src/cgeo/geocaching/VisitCacheActivity.java824
1 files changed, 392 insertions, 432 deletions
diff --git a/main/src/cgeo/geocaching/VisitCacheActivity.java b/main/src/cgeo/geocaching/VisitCacheActivity.java
index 443ef3a..25d36df 100644
--- a/main/src/cgeo/geocaching/VisitCacheActivity.java
+++ b/main/src/cgeo/geocaching/VisitCacheActivity.java
@@ -7,26 +7,33 @@ import cgeo.geocaching.enumerations.LogType;
import cgeo.geocaching.enumerations.LogTypeTrackable;
import cgeo.geocaching.enumerations.StatusCode;
import cgeo.geocaching.gcvote.GCVote;
-import cgeo.geocaching.network.Network;
+import cgeo.geocaching.loaders.UrlLoader;
import cgeo.geocaching.network.Parameters;
import cgeo.geocaching.twitter.Twitter;
-import cgeo.geocaching.ui.DateDialog;
import cgeo.geocaching.ui.Formatter;
+import cgeo.geocaching.ui.dialog.DateDialog;
import cgeo.geocaching.utils.Log;
import cgeo.geocaching.utils.LogTemplateProvider;
import cgeo.geocaching.utils.LogTemplateProvider.LogContext;
import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
+import org.apache.commons.lang3.tuple.ImmutablePair;
+import android.app.AlertDialog;
+import android.app.AlertDialog.Builder;
import android.app.Dialog;
import android.app.ProgressDialog;
+import android.content.DialogInterface;
+import android.content.DialogInterface.OnClickListener;
import android.content.Intent;
-import android.content.res.Configuration;
+import android.net.Uri;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
-import android.view.ContextMenu;
+import android.support.v4.app.LoaderManager;
+import android.support.v4.content.Loader;
+import android.util.SparseArray;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
@@ -42,134 +49,158 @@ import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
+import java.util.Locale;
-public class VisitCacheActivity extends AbstractLoggingActivity implements DateDialog.DateDialogParent {
- static final String EXTRAS_FOUND = "found";
- static final String EXTRAS_TEXT = "text";
+public class VisitCacheActivity extends AbstractLoggingActivity implements DateDialog.DateDialogParent, LoaderManager.LoaderCallbacks<String> {
static final String EXTRAS_GEOCODE = "geocode";
static final String EXTRAS_ID = "id";
private static final int SUBMENU_VOTE = 3;
+ private static final String SAVED_STATE_RATING = "cgeo.geocaching.saved_state_rating";
+ private static final String SAVED_STATE_TYPE = "cgeo.geocaching.saved_state_type";
+ private static final String SAVED_STATE_DATE = "cgeo.geocaching.saved_state_date";
+ private static final String SAVED_STATE_IMAGE_CAPTION = "cgeo.geocaching.saved_state_image_caption";
+ private static final String SAVED_STATE_IMAGE_DESCRIPTION = "cgeo.geocaching.saved_state_image_description";
+ private static final String SAVED_STATE_IMAGE_URI = "cgeo.geocaching.saved_state_image_uri";
+
+ private static final int SELECT_IMAGE = 101;
private LayoutInflater inflater = null;
- private cgCache cache = null;
+ private Geocache cache = null;
private ProgressDialog waitDialog = null;
private String cacheid = null;
private String geocode = null;
private String text = null;
- private boolean alreadyFound = false;
private List<LogType> possibleLogTypes = new ArrayList<LogType>();
private String[] viewstates = null;
- private boolean gettingViewstate = true;
private List<TrackableLog> trackables = null;
- private Calendar date = Calendar.getInstance();
- private LogType typeSelected = LogType.UNKNOWN;
- private int attempts = 0;
private Button postButton = null;
- private Button clearButton = null;
private CheckBox tweetCheck = null;
private LinearLayout tweetBox = null;
- private double rating = 0.0;
private boolean tbChanged = false;
+ private SparseArray<TrackableLog> actionButtons;
- // handlers
- private final Handler loadDataHandler = new Handler() {
+ // Data to be saved while reconfiguring
+ private double rating;
+ private LogType typeSelected;
+ private Calendar date;
+ private String imageCaption;
+ private String imageDescription;
+ private Uri imageUri;
- @Override
- public void handleMessage(Message msg) {
- if (!possibleLogTypes.contains(typeSelected)) {
- typeSelected = possibleLogTypes.get(0);
- setType(typeSelected);
+ @Override
+ public Loader<String> onCreateLoader(final int id, final Bundle args) {
+ if (!Settings.isLogin()) { // allow offline logging
+ showToast(res.getString(R.string.err_login));
+ return null;
+ }
+ return new UrlLoader(getBaseContext(), "http://www.geocaching.com/seek/log.aspx", new Parameters("ID", cacheid));
+ }
- showToast(res.getString(R.string.info_log_type_changed));
- }
+ @Override
+ public void onLoaderReset(final Loader<String> loader) {
+ // Nothing to do
+ }
- if (Login.isEmpty(viewstates)) {
- if (attempts < 2) {
- new LoadDataThread().start();
- } else {
- showToast(res.getString(R.string.err_log_load_data));
- showProgress(false);
- }
- return;
+ @Override
+ public void onLoadFinished(final Loader<String> loader, final String page) {
+ if (page == null) {
+ showToast(res.getString(R.string.err_log_load_data));
+ showProgress(false);
+ return;
+ }
+
+ viewstates = Login.getViewstates(page);
+ trackables = GCParser.parseTrackableLog(page);
+ possibleLogTypes = GCParser.parseTypes(page);
+ possibleLogTypes.remove(LogType.UPDATE_COORDINATES);
+
+ if (!possibleLogTypes.contains(typeSelected)) {
+ typeSelected = possibleLogTypes.get(0);
+ setType(typeSelected);
+
+ showToast(res.getString(R.string.info_log_type_changed));
+ }
+
+ enablePostButton(true);
+
+ initializeTrackablesAction();
+ updateTrackablesList();
+
+ showProgress(false);
+ }
+
+ private void initializeTrackablesAction() {
+ if (Settings.isTrackableAutoVisit()) {
+ for (TrackableLog trackable : trackables) {
+ trackable.action = LogTypeTrackable.VISITED;
+ tbChanged = true;
}
+ }
+ }
- gettingViewstate = false; // we're done, user can post log
+ private void updateTrackablesList() {
+ if (CollectionUtils.isEmpty(trackables)) {
+ return;
+ }
+ if (inflater == null) {
+ inflater = getLayoutInflater();
+ }
+ actionButtons = new SparseArray<TrackableLog>();
- enablePostButton(true);
+ final LinearLayout inventoryView = (LinearLayout) findViewById(R.id.inventory);
+ inventoryView.removeAllViews();
- // add trackables
- if (CollectionUtils.isNotEmpty(trackables)) {
- if (inflater == null) {
- inflater = getLayoutInflater();
- }
+ for (TrackableLog tb : trackables) {
+ LinearLayout inventoryItem = (LinearLayout) inflater.inflate(R.layout.visit_trackable, null);
- final LinearLayout inventoryView = (LinearLayout) findViewById(R.id.inventory);
- inventoryView.removeAllViews();
+ ((TextView) inventoryItem.findViewById(R.id.trackcode)).setText(tb.trackCode);
+ ((TextView) inventoryItem.findViewById(R.id.name)).setText(tb.name);
+ final TextView actionButton = (TextView) inventoryItem.findViewById(R.id.action);
+ actionButton.setId(tb.id);
+ actionButtons.put(actionButton.getId(), tb);
+ actionButton.setText(res.getString(tb.action.resourceId) + " ▼");
+ actionButton.setOnClickListener(new View.OnClickListener() {
- for (TrackableLog tb : trackables) {
- LinearLayout inventoryItem = (LinearLayout) inflater.inflate(R.layout.visit_trackable, null);
-
- ((TextView) inventoryItem.findViewById(R.id.trackcode)).setText(tb.trackCode);
- ((TextView) inventoryItem.findViewById(R.id.name)).setText(tb.name);
- ((TextView) inventoryItem.findViewById(R.id.action))
- .setText(res.getString(Settings.isTrackableAutoVisit()
- ? LogTypeTrackable.VISITED.resourceId
- : LogTypeTrackable.DO_NOTHING.resourceId)
- + " ▼");
-
- inventoryItem.setId(tb.id);
- final String tbCode = tb.trackCode;
- inventoryItem.setClickable(true);
- registerForContextMenu(inventoryItem);
- inventoryItem.findViewById(R.id.info).setOnClickListener(new View.OnClickListener() {
-
- @Override
- public void onClick(View view) {
- final Intent trackablesIntent = new Intent(VisitCacheActivity.this, cgeotrackable.class);
- trackablesIntent.putExtra(EXTRAS_GEOCODE, tbCode);
- startActivity(trackablesIntent);
- }
- });
- inventoryItem.findViewById(R.id.action).setOnClickListener(new View.OnClickListener() {
-
- @Override
- public void onClick(View view) {
- openContextMenu(view);
- }
- });
-
- inventoryView.addView(inventoryItem);
-
- if (Settings.isTrackableAutoVisit()) {
- tb.action = LogTypeTrackable.VISITED;
- tbChanged = true;
- }
+ @Override
+ public void onClick(View view) {
+ selectTrackableAction(view);
}
+ });
+
+ final String tbCode = tb.trackCode;
+ inventoryItem.setClickable(true);
+ inventoryItem.findViewById(R.id.info).setOnClickListener(new View.OnClickListener() {
- if (inventoryView.getChildCount() > 0) {
- findViewById(R.id.inventory_box).setVisibility(View.VISIBLE);
+ @Override
+ public void onClick(View view) {
+ final Intent trackablesIntent = new Intent(VisitCacheActivity.this, TrackableActivity.class);
+ trackablesIntent.putExtra(Intents.EXTRA_GEOCODE, tbCode);
+ startActivity(trackablesIntent);
}
- if (inventoryView.getChildCount() > 1) {
- final LinearLayout inventoryChangeAllView = (LinearLayout) findViewById(R.id.inventory_changeall);
+ });
- final Button changeButton = (Button) inventoryChangeAllView.findViewById(R.id.changebutton);
- registerForContextMenu(changeButton);
- changeButton.setOnClickListener(new View.OnClickListener() {
+ inventoryView.addView(inventoryItem);
+ }
+
+ if (inventoryView.getChildCount() > 0) {
+ findViewById(R.id.inventory_box).setVisibility(View.VISIBLE);
+ }
+ if (inventoryView.getChildCount() > 1) {
+ final LinearLayout inventoryChangeAllView = (LinearLayout) findViewById(R.id.inventory_changeall);
- @Override
- public void onClick(View view) {
- openContextMenu(view);
- }
- });
+ final Button changeButton = (Button) inventoryChangeAllView.findViewById(R.id.changebutton);
+ changeButton.setOnClickListener(new View.OnClickListener() {
- inventoryChangeAllView.setVisibility(View.VISIBLE);
+ @Override
+ public void onClick(View view) {
+ selectAllTrackablesAction();
}
- }
+ });
- showProgress(false);
+ inventoryChangeAllView.setVisibility(View.VISIBLE);
}
- };
+ }
private void enablePostButton(boolean enabled) {
postButton.setEnabled(enabled);
@@ -184,20 +215,20 @@ public class VisitCacheActivity extends AbstractLoggingActivity implements DateD
}
private void updatePostButtonText() {
- if (postButton.isEnabled()) {
- if (typeSelected == LogType.FOUND_IT && Settings.isGCvoteLogin()) {
- if (rating == 0) {
- postButton.setText(res.getString(R.string.log_post_no_rate));
- } else {
- postButton.setText(res.getString(R.string.log_post_rate) + " " + ratingTextValue(rating) + "*");
- }
- } else {
- postButton.setText(res.getString(R.string.log_post));
- }
+ postButton.setText(getPostButtonText());
+ }
+
+ private String getPostButtonText() {
+ if (!postButton.isEnabled()) {
+ return res.getString(R.string.log_post_not_possible);
}
- else {
- postButton.setText(res.getString(R.string.log_post_not_possible));
+ if (typeSelected != LogType.FOUND_IT || !Settings.isGCvoteLogin()) {
+ return res.getString(R.string.log_post);
}
+ if (rating == 0) {
+ return res.getString(R.string.log_post_no_rate);
+ }
+ return res.getString(R.string.log_post_rate) + " " + ratingTextValue(rating) + "*";
}
private final Handler postLogHandler = new Handler() {
@@ -233,44 +264,158 @@ public class VisitCacheActivity extends AbstractLoggingActivity implements DateD
}
@Override
- public void onCreate(Bundle savedInstanceState) {
+ public void onCreate(final Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setTheme();
setContentView(R.layout.visit);
setTitle(res.getString(R.string.log_new_log));
- // get parameters
+ // Get parameters from intent and basic cache information from database
final Bundle extras = getIntent().getExtras();
if (extras != null) {
cacheid = extras.getString(EXTRAS_ID);
geocode = extras.getString(EXTRAS_GEOCODE);
- text = extras.getString(EXTRAS_TEXT);
- alreadyFound = extras.getBoolean(EXTRAS_FOUND);
}
if ((StringUtils.isBlank(cacheid)) && StringUtils.isNotBlank(geocode)) {
- cacheid = app.getCacheid(geocode);
+ cacheid = cgData.getCacheidForGeocode(geocode);
}
if (StringUtils.isBlank(geocode) && StringUtils.isNotBlank(cacheid)) {
- geocode = app.getGeocode(cacheid);
+ geocode = cgData.getGeocodeForGuid(cacheid);
}
- cache = cgeoapplication.getInstance().loadCache(geocode, LoadFlags.LOAD_CACHE_OR_DB);
+ cache = cgData.loadCache(geocode, LoadFlags.LOAD_CACHE_OR_DB);
+ possibleLogTypes = cache.getPossibleLogTypes();
if (StringUtils.isNotBlank(cache.getName())) {
setTitle(res.getString(R.string.log_new_log) + ": " + cache.getName());
} else {
- setTitle(res.getString(R.string.log_new_log) + ": " + cache.getGeocode().toUpperCase());
+ setTitle(res.getString(R.string.log_new_log) + ": " + cache.getGeocode());
+ }
+
+ // Get ids for later use
+ postButton = (Button) findViewById(R.id.post);
+ tweetBox = (LinearLayout) findViewById(R.id.tweet_box);
+ tweetCheck = (CheckBox) findViewById(R.id.tweet);
+
+ // initialize with default values
+ setDefaultValues();
+
+ // Restore previous state
+ if (savedInstanceState != null) {
+ rating = savedInstanceState.getDouble(SAVED_STATE_RATING);
+ typeSelected = LogType.getById(savedInstanceState.getInt(SAVED_STATE_TYPE));
+ date.setTimeInMillis(savedInstanceState.getLong(SAVED_STATE_DATE));
+ imageCaption = savedInstanceState.getString(SAVED_STATE_IMAGE_CAPTION);
+ imageDescription = savedInstanceState.getString(SAVED_STATE_IMAGE_DESCRIPTION);
+ imageUri = Uri.parse(savedInstanceState.getString(SAVED_STATE_IMAGE_URI));
+ } else {
+ // If log had been previously saved, load it now, otherwise initialize signature as needed
+ final LogEntry log = cgData.loadLogOffline(geocode);
+ if (log != null) {
+ typeSelected = log.type;
+ date.setTime(new Date(log.date));
+ text = log.log;
+ } else if (StringUtils.isNotBlank(Settings.getSignature())
+ && Settings.isAutoInsertSignature()
+ && StringUtils.isBlank(currentLogText())) {
+ insertIntoLog(LogTemplateProvider.applyTemplates(Settings.getSignature(), new LogContext(cache)), false);
+ }
}
+ updatePostButtonText();
+ setImageButtonText();
+ enablePostButton(false);
- init();
+ final Button typeButton = (Button) findViewById(R.id.type);
+ typeButton.setText(typeSelected.getL10n());
+ typeButton.setOnClickListener(new View.OnClickListener() {
+
+ @Override
+ public void onClick(View view) {
+ selectLogType();
+ }
+ });
+
+ final Button dateButton = (Button) findViewById(R.id.date);
+ setDate(date);
+ dateButton.setOnClickListener(new DateListener());
+
+ final EditText logView = (EditText) findViewById(R.id.log);
+ if (StringUtils.isBlank(currentLogText()) && StringUtils.isNotBlank(text)) {
+ logView.setText(text);
+ }
+
+ tweetCheck.setChecked(true);
+
+ final Button imageButton = (Button) findViewById(R.id.image_btn);
+ imageButton.setOnClickListener(new View.OnClickListener() {
+
+ @Override
+ public void onClick(View view) {
+ selectImage();
+ }
+ });
+
+ final Button saveButton = (Button) findViewById(R.id.save);
+ saveButton.setOnClickListener(new View.OnClickListener() {
+
+ @Override
+ public void onClick(View v) {
+ saveLog(true);
+ }
+ });
+
+ final Button clearButton = (Button) findViewById(R.id.clear);
+ clearButton.setOnClickListener(new View.OnClickListener() {
+
+ @Override
+ public void onClick(View v) {
+ clearLog();
+ }
+ });
+
+ getSupportLoaderManager().initLoader(0, null, this);
}
- @Override
- public void onResume() {
- super.onResume();
+ private void setDefaultValues() {
+ date = Calendar.getInstance();
+ rating = 0.0;
+ if (cache.isEventCache()) {
+ if (cache.hasOwnLog(LogType.WILL_ATTEND)) {
+ typeSelected = LogType.ATTENDED;
+ }
+ else {
+ typeSelected = LogType.WILL_ATTEND;
+ }
+ }
+ else {
+ if (cache.isFound()) {
+ typeSelected = LogType.NOTE;
+ } else {
+ typeSelected = LogType.FOUND_IT;
+ }
+ }
+ text = null;
+ imageCaption = "";
+ imageDescription = "";
+ imageUri = Uri.EMPTY;
+ }
+
+ private void clearLog() {
+ cgData.clearLogOffline(geocode);
+
+ setDefaultValues();
+
+ setType(typeSelected);
+ setDate(date);
+
+ final EditText logView = (EditText) findViewById(R.id.log);
+ logView.setText(StringUtils.EMPTY);
+
+ setImageButtonText();
+ showToast(res.getString(R.string.info_log_cleared));
}
@Override
@@ -280,13 +425,6 @@ public class VisitCacheActivity extends AbstractLoggingActivity implements DateD
}
@Override
- public void onConfigurationChanged(Configuration newConfig) {
- super.onConfigurationChanged(newConfig);
-
- init();
- }
-
- @Override
public boolean onCreateOptionsMenu(final Menu menu) {
super.onCreateOptionsMenu(menu);
@@ -335,184 +473,18 @@ public class VisitCacheActivity extends AbstractLoggingActivity implements DateD
}
private static String ratingTextValue(final double rating) {
- return String.format("%.1f", rating);
+ return String.format(Locale.getDefault(), "%.1f", rating);
}
@Override
- public void onCreateContextMenu(ContextMenu menu, View view, ContextMenu.ContextMenuInfo info) {
- super.onCreateContextMenu(menu, view, info);
- final int viewId = view.getId();
-
- if (viewId == R.id.type) {
- for (final LogType typeOne : possibleLogTypes) {
- menu.add(viewId, typeOne.id, 0, typeOne.getL10n());
- Log.w("Adding " + typeOne + " " + typeOne.getL10n());
- }
- } else if (viewId == R.id.changebutton) {
- final int textId = findViewById(viewId).getId();
-
- menu.setHeaderTitle(res.getString(R.string.log_tb_changeall));
- for (LogTypeTrackable logType : LogTypeTrackable.values()) {
- menu.add(textId, logType.id, 0, res.getString(logType.resourceId));
- }
- } else {
- final int realViewId = findViewById(viewId).getId();
-
- for (final TrackableLog tb : trackables) {
- if (tb.id == realViewId) {
- menu.setHeaderTitle(tb.name);
- }
- }
- for (LogTypeTrackable logType : LogTypeTrackable.values()) {
- menu.add(realViewId, logType.id, 0, res.getString(logType.resourceId));
- }
- }
- }
-
- @Override
- public boolean onContextItemSelected(MenuItem item) {
- final int group = item.getGroupId();
- final int id = item.getItemId();
-
- if (group == R.id.type) {
- setType(LogType.getById(id));
- return true;
- }
-
- if (group == R.id.changebutton) {
- try {
- final LogTypeTrackable logType = LogTypeTrackable.findById(id);
- if (logType != null) {
- final LinearLayout inventView = (LinearLayout) findViewById(R.id.inventory);
- for (int count = 0; count < inventView.getChildCount(); count++) {
- final LinearLayout tbView = (LinearLayout) inventView.getChildAt(count);
- if (tbView == null) {
- return false;
- }
-
- final TextView tbText = (TextView) tbView.findViewById(R.id.action);
- if (tbText == null) {
- return false;
- }
- tbText.setText(res.getString(logType.resourceId) + " ▼");
- }
- for (TrackableLog tb : trackables) {
- tb.action = logType;
- }
- tbChanged = true;
- return true;
- }
- } catch (Exception e) {
- Log.e("cgeovisit.onContextItemSelected: " + e.toString());
- }
- } else {
- try {
- final LogTypeTrackable logType = LogTypeTrackable.findById(id);
- if (logType != null) {
- final LinearLayout tbView = (LinearLayout) findViewById(group);
- if (tbView == null) {
- return false;
- }
-
- final TextView tbText = (TextView) tbView.findViewById(R.id.action);
- if (tbText == null) {
- return false;
- }
-
- for (TrackableLog tb : trackables) {
- if (tb.id == group) {
- tbChanged = true;
-
- tb.action = logType;
- tbText.setText(res.getString(logType.resourceId) + " ▼");
-
- Log.i("Trackable " + tb.trackCode + " (" + tb.name + ") has new action: #" + id);
- }
- }
-
- return true;
- }
- } catch (Exception e) {
- Log.e("cgeovisit.onContextItemSelected: " + e.toString());
- }
- }
-
- return false;
- }
-
- public void init() {
- postButton = (Button) findViewById(R.id.post);
- tweetBox = (LinearLayout) findViewById(R.id.tweet_box);
- tweetCheck = (CheckBox) findViewById(R.id.tweet);
- clearButton = (Button) findViewById(R.id.clear);
- final Button saveButton = (Button) findViewById(R.id.save);
-
- possibleLogTypes = cache.getPossibleLogTypes();
-
- final LogEntry log = app.loadLogOffline(geocode);
- if (log != null) {
- typeSelected = log.type;
- date.setTime(new Date(log.date));
- text = log.log;
- updatePostButtonText();
- } else if (StringUtils.isNotBlank(Settings.getSignature())
- && Settings.isAutoInsertSignature()
- && StringUtils.isBlank(((EditText) findViewById(R.id.log)).getText())) {
- insertIntoLog(LogTemplateProvider.applyTemplates(Settings.getSignature(), new LogContext(cache)), false);
- }
-
- if (!possibleLogTypes.contains(typeSelected)) {
- if (alreadyFound) {
- typeSelected = LogType.NOTE;
- } else {
- typeSelected = possibleLogTypes.get(0);
- }
- setType(typeSelected);
- }
-
- final Button typeButton = (Button) findViewById(R.id.type);
- registerForContextMenu(typeButton);
- typeButton.setText(typeSelected.getL10n());
- typeButton.setOnClickListener(new View.OnClickListener() {
-
- @Override
- public void onClick(View view) {
- openContextMenu(view);
- }
- });
-
- final Button dateButton = (Button) findViewById(R.id.date);
- setDate(date);
- dateButton.setOnClickListener(new DateListener());
-
- final EditText logView = (EditText) findViewById(R.id.log);
- if (StringUtils.isBlank(logView.getText()) && StringUtils.isNotBlank(text)) {
- logView.setText(text);
- }
-
- tweetCheck.setChecked(true);
-
- final ActivityState lastState = (ActivityState) getLastNonConfigurationInstance();
- if (lastState != null) {
- lastState.restore(this);
- }
-
- if (Login.isEmpty(viewstates)) {
- enablePostButton(false);
- new LoadDataThread().start();
- } else {
- enablePostButton(true);
- }
-
- saveButton.setOnClickListener(new View.OnClickListener() {
-
- @Override
- public void onClick(View v) {
- saveLog(true);
- }
- });
-
- clearButton.setOnClickListener(new ClearListener());
+ protected void onSaveInstanceState(final Bundle outState) {
+ super.onSaveInstanceState(outState);
+ outState.putDouble(SAVED_STATE_RATING, rating);
+ outState.putInt(SAVED_STATE_TYPE, typeSelected.id);
+ outState.putLong(SAVED_STATE_DATE, date.getTimeInMillis());
+ outState.putString(SAVED_STATE_IMAGE_URI, imageUri.getPath());
+ outState.putString(SAVED_STATE_IMAGE_CAPTION, imageCaption);
+ outState.putString(SAVED_STATE_IMAGE_DESCRIPTION, imageDescription);
}
@Override
@@ -554,102 +526,14 @@ public class VisitCacheActivity extends AbstractLoggingActivity implements DateD
}
private class PostListener implements View.OnClickListener {
-
@Override
public void onClick(View arg0) {
- if (!gettingViewstate) {
- waitDialog = ProgressDialog.show(VisitCacheActivity.this, null, res.getString(R.string.log_saving), true);
- waitDialog.setCancelable(true);
+ waitDialog = ProgressDialog.show(VisitCacheActivity.this, null,
+ res.getString(StringUtils.isBlank(imageUri.getPath()) ? R.string.log_saving : R.string.log_saving_and_uploading), true);
+ waitDialog.setCancelable(true);
- final String log = ((EditText) findViewById(R.id.log)).getText().toString();
- final Thread thread = new PostLogThread(postLogHandler, log);
- thread.start();
- } else {
- showToast(res.getString(R.string.err_log_load_data_still));
- }
- }
- }
-
- private class ClearListener implements View.OnClickListener {
-
- @Override
- public void onClick(View arg0) {
- //TODO: unify this method and the code in init()
- app.clearLogOffline(geocode);
-
- if (alreadyFound) {
- typeSelected = LogType.NOTE;
- } else {
- typeSelected = possibleLogTypes.get(0);
- }
- date.setTime(new Date());
- text = null;
-
- setType(typeSelected);
-
- final Button dateButton = (Button) findViewById(R.id.date);
- dateButton.setOnClickListener(new DateListener());
- setDate(date);
-
- final EditText logView = (EditText) findViewById(R.id.log);
- logView.setText("");
-
- clearButton.setOnClickListener(new ClearListener());
-
- showToast(res.getString(R.string.info_log_cleared));
- }
- }
-
- private class LoadDataThread extends Thread {
-
- public LoadDataThread() {
- super("Load data for logging");
- if (cacheid == null) {
- showToast(res.getString(R.string.err_detail_cache_forgot_visit));
-
- finish();
- return;
- }
- if (!Settings.isLogin()) { // allow offline logging
- showToast(res.getString(R.string.err_login));
- }
- }
-
- @Override
- public void run() {
- if (!Settings.isLogin()) {
- // enable only offline logging, don't get the current state of the cache
- return;
- }
- final Parameters params = new Parameters();
-
- gettingViewstate = true;
- attempts++;
-
- try {
- if (StringUtils.isNotBlank(cacheid)) {
- params.put("ID", cacheid);
- } else {
- loadDataHandler.sendEmptyMessage(0);
- return;
- }
-
- final String page = Network.getResponseData(Network.getRequest("http://www.geocaching.com/seek/log.aspx", params));
-
- viewstates = Login.getViewstates(page);
- trackables = GCParser.parseTrackableLog(page);
-
- final List<LogType> typesPre = GCParser.parseTypes(page);
- if (CollectionUtils.isNotEmpty(typesPre)) {
- possibleLogTypes.clear();
- possibleLogTypes.addAll(typesPre);
- possibleLogTypes.remove(LogType.UPDATE_COORDINATES);
- }
- } catch (Exception e) {
- Log.e("cgeovisit.loadData.run: " + e.toString());
- }
-
- loadDataHandler.sendEmptyMessage(0);
+ final Thread thread = new PostLogThread(postLogHandler, currentLogText());
+ thread.start();
}
}
@@ -672,40 +556,50 @@ public class VisitCacheActivity extends AbstractLoggingActivity implements DateD
}
public StatusCode postLogFn(String log) {
+
+ StatusCode result = StatusCode.LOG_POST_ERROR;
+
try {
- final StatusCode status = GCParser.postLog(geocode, cacheid, viewstates, typeSelected,
+
+ final ImmutablePair<StatusCode, String> logResult = GCParser.postLog(geocode, cacheid, viewstates, typeSelected,
date.get(Calendar.YEAR), (date.get(Calendar.MONTH) + 1), date.get(Calendar.DATE),
log, trackables);
- if (status == StatusCode.NO_ERROR) {
+ result = logResult.left;
+
+ if (logResult.left == StatusCode.NO_ERROR) {
final LogEntry logNow = new LogEntry(date, typeSelected, log);
- cache.getLogs().prepend(logNow);
+ cache.getLogs().add(0, logNow);
- if (typeSelected == LogType.FOUND_IT) {
+ if (typeSelected == LogType.FOUND_IT || typeSelected == LogType.ATTENDED) {
cache.setFound(true);
}
- app.updateCache(cache);
+ cgData.saveChangedCache(cache);
}
- if (status == StatusCode.NO_ERROR) {
- app.clearLogOffline(geocode);
+ if (logResult.left == StatusCode.NO_ERROR) {
+ cgData.clearLogOffline(geocode);
}
- if (status == StatusCode.NO_ERROR && typeSelected == LogType.FOUND_IT && Settings.isUseTwitter()
+ if (logResult.left == StatusCode.NO_ERROR && typeSelected == LogType.FOUND_IT && Settings.isUseTwitter()
&& Settings.isTwitterLoginValid()
&& tweetCheck.isChecked() && tweetBox.getVisibility() == View.VISIBLE) {
Twitter.postTweetCache(geocode);
}
- if (status == StatusCode.NO_ERROR && typeSelected == LogType.FOUND_IT && Settings.isGCvoteLogin()) {
+ if (logResult.left == StatusCode.NO_ERROR && typeSelected == LogType.FOUND_IT && Settings.isGCvoteLogin()) {
GCVote.setRating(cache, rating);
}
- return status;
+ if (logResult.left == StatusCode.NO_ERROR && StringUtils.isNotBlank(imageUri.getPath())) {
+ result = GCParser.uploadLogImage(logResult.right, imageCaption, imageDescription, imageUri);
+ }
+
+ return result;
} catch (Exception e) {
- Log.e("cgeovisit.postLogFn: " + e.toString());
+ Log.e("cgeovisit.postLogFn", e);
}
return StatusCode.LOG_POST_ERROR;
@@ -717,7 +611,7 @@ public class VisitCacheActivity extends AbstractLoggingActivity implements DateD
// Do not erase the saved log if the user has removed all the characters
// without using "Clear". This may be a manipulation mistake, and erasing
// again will be easy using "Clear" while retyping the text may not be.
- if (force || (log.length() > 0 && !StringUtils.equals(log, text))) {
+ if (force || (StringUtils.isNotEmpty(log) && !StringUtils.equals(log, text))) {
cache.logOffline(this, log, date, typeSelected);
}
text = log;
@@ -727,40 +621,106 @@ public class VisitCacheActivity extends AbstractLoggingActivity implements DateD
return ((EditText) findViewById(R.id.log)).getText().toString();
}
- private class ActivityState {
- private final String[] viewstates;
- private final List<TrackableLog> trackables;
- private final int attempts;
- private final List<LogType> possibleLogTypes;
- private final LogType typeSelected;
- private final double rating;
+ @Override
+ protected LogContext getLogContext() {
+ return new LogContext(cache);
+ }
- public ActivityState() {
- this.viewstates = VisitCacheActivity.this.viewstates;
- this.trackables = VisitCacheActivity.this.trackables;
- this.attempts = VisitCacheActivity.this.attempts;
- this.possibleLogTypes = VisitCacheActivity.this.possibleLogTypes;
- this.typeSelected = VisitCacheActivity.this.typeSelected;
- this.rating = VisitCacheActivity.this.rating;
+ private void selectAllTrackablesAction() {
+ Builder alert = new AlertDialog.Builder(this);
+ alert.setTitle(res.getString(R.string.log_tb_changeall));
+ String[] tbLogTypes = getTBLogTypes();
+ alert.setItems(tbLogTypes, new OnClickListener() {
+
+ @Override
+ public void onClick(DialogInterface dialog, int position) {
+ final LogTypeTrackable logType = LogTypeTrackable.values()[position];
+ for (TrackableLog tb : trackables) {
+ tb.action = logType;
+ }
+ tbChanged = true;
+ updateTrackablesList();
+ dialog.dismiss();
+ }
+ });
+ alert.create().show();
+ }
+
+ private String[] getTBLogTypes() {
+ final LogTypeTrackable[] logTypeValues = LogTypeTrackable.values();
+ String[] logTypes = new String[logTypeValues.length];
+ for (int i = 0; i < logTypes.length; i++) {
+ logTypes[i] = res.getString(logTypeValues[i].resourceId);
}
+ return logTypes;
+ }
- public void restore(final VisitCacheActivity activity) {
- activity.viewstates = this.viewstates;
- activity.trackables = this.trackables;
- activity.attempts = this.attempts;
- activity.possibleLogTypes = this.possibleLogTypes;
- activity.typeSelected = this.typeSelected;
- activity.rating = this.rating;
+ private void selectLogType() {
+ Builder alert = new AlertDialog.Builder(this);
+ String[] choices = new String[possibleLogTypes.size()];
+ for (int i = 0; i < choices.length; i++) {
+ choices[i] = possibleLogTypes.get(i).getL10n();
}
+ alert.setSingleChoiceItems(choices, possibleLogTypes.indexOf(typeSelected), new OnClickListener() {
+
+ @Override
+ public void onClick(DialogInterface dialog, int position) {
+ setType(possibleLogTypes.get(position));
+ dialog.dismiss();
+ }
+ });
+ alert.create().show();
}
- @Override
- public Object onRetainNonConfigurationInstance() {
- return new ActivityState();
+ private void selectTrackableAction(View view) {
+ final int realViewId = view.getId();
+ Builder alert = new AlertDialog.Builder(this);
+ final TrackableLog trackableLog = actionButtons.get(realViewId);
+ alert.setTitle(trackableLog.name);
+ String[] tbLogTypes = getTBLogTypes();
+ alert.setItems(tbLogTypes, new OnClickListener() {
+
+ @Override
+ public void onClick(DialogInterface dialog, int position) {
+ final LogTypeTrackable logType = LogTypeTrackable.values()[position];
+ tbChanged = true;
+ trackableLog.action = logType;
+ Log.i("Trackable " + trackableLog.trackCode + " (" + trackableLog.name + ") has new action: #" + logType);
+ updateTrackablesList();
+ dialog.dismiss();
+ }
+ });
+ alert.create().show();
+ }
+
+ private void selectImage() {
+ Intent selectImageIntent = new Intent(this, ImageSelectActivity.class);
+ selectImageIntent.putExtra(ImageSelectActivity.EXTRAS_CAPTION, imageCaption);
+ selectImageIntent.putExtra(ImageSelectActivity.EXTRAS_DESCRIPTION, imageDescription);
+ selectImageIntent.putExtra(ImageSelectActivity.EXTRAS_URI_AS_STRING, imageUri.toString());
+
+ startActivityForResult(selectImageIntent, SELECT_IMAGE);
}
@Override
- protected LogContext getLogContext() {
- return new LogContext(cache);
+ protected void onActivityResult(int requestCode, int resultCode, Intent data) {
+ if (requestCode == SELECT_IMAGE) {
+ if (resultCode == RESULT_OK) {
+ imageCaption = data.getStringExtra(ImageSelectActivity.EXTRAS_CAPTION);
+ imageDescription = data.getStringExtra(ImageSelectActivity.EXTRAS_DESCRIPTION);
+ imageUri = Uri.parse(data.getStringExtra(ImageSelectActivity.EXTRAS_URI_AS_STRING));
+ } else if (resultCode != RESULT_CANCELED) {
+ // Image capture failed, advise user
+ showToast(getResources().getString(R.string.err_select_logimage_failed));
+ }
+ setImageButtonText();
+
+ }
+ }
+
+ private void setImageButtonText() {
+ final Button imageButton = (Button) findViewById(R.id.image_btn);
+ imageButton.setText(StringUtils.isNotBlank(imageUri.getPath()) ?
+ res.getString(R.string.log_image_edit) : res.getString(R.string.log_image_attach));
}
}