diff options
Diffstat (limited to 'main/src/cgeo/geocaching/VisitCacheActivity.java')
| -rw-r--r-- | main/src/cgeo/geocaching/VisitCacheActivity.java | 740 |
1 files changed, 314 insertions, 426 deletions
diff --git a/main/src/cgeo/geocaching/VisitCacheActivity.java b/main/src/cgeo/geocaching/VisitCacheActivity.java index 443ef3a..a29256c 100644 --- a/main/src/cgeo/geocaching/VisitCacheActivity.java +++ b/main/src/cgeo/geocaching/VisitCacheActivity.java @@ -7,7 +7,7 @@ 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; @@ -19,14 +19,19 @@ import cgeo.geocaching.utils.LogTemplateProvider.LogContext; import org.apache.commons.collections.CollectionUtils; import org.apache.commons.lang3.StringUtils; +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.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,14 +47,16 @@ 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 LayoutInflater inflater = null; private cgCache cache = null; @@ -57,119 +64,133 @@ public class VisitCacheActivity extends AbstractLoggingActivity implements DateD 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; - @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); } + }); - if (inventoryView.getChildCount() > 0) { - findViewById(R.id.inventory_box).setVisibility(View.VISIBLE); + final String tbCode = tb.trackCode; + inventoryItem.setClickable(true); + inventoryItem.findViewById(R.id.info).setOnClickListener(new View.OnClickListener() { + + @Override + public void onClick(View view) { + final Intent trackablesIntent = new Intent(VisitCacheActivity.this, TrackableActivity.class); + trackablesIntent.putExtra(EXTRAS_GEOCODE, tbCode); + startActivity(trackablesIntent); } - if (inventoryView.getChildCount() > 1) { - final LinearLayout inventoryChangeAllView = (LinearLayout) findViewById(R.id.inventory_changeall); + }); + + inventoryView.addView(inventoryItem); + } - final Button changeButton = (Button) inventoryChangeAllView.findViewById(R.id.changebutton); - registerForContextMenu(changeButton); - changeButton.setOnClickListener(new View.OnClickListener() { + 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 +205,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 +254,140 @@ 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)); + } 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(); + enablePostButton(false); + + 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); } - init(); + tweetCheck.setChecked(true); + + 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; + } + + private void clearLog() { + cgData.clearLogOffline(geocode); + + setDefaultValues(); + + setType(typeSelected); + setDate(date); + + final EditText logView = (EditText) findViewById(R.id.log); + logView.setText(StringUtils.EMPTY); + showToast(res.getString(R.string.info_log_cleared)); } @Override @@ -280,13 +397,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 +445,15 @@ 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()); } @Override @@ -554,102 +495,13 @@ 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); - - 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); + waitDialog = ProgressDialog.show(VisitCacheActivity.this, null, res.getString(R.string.log_saving), true); + waitDialog.setCancelable(true); - 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(); } } @@ -686,11 +538,11 @@ public class VisitCacheActivity extends AbstractLoggingActivity implements DateD cache.setFound(true); } - app.updateCache(cache); + cgData.saveChangedCache(cache); } if (status == StatusCode.NO_ERROR) { - app.clearLogOffline(geocode); + cgData.clearLogOffline(geocode); } if (status == StatusCode.NO_ERROR && typeSelected == LogType.FOUND_IT && Settings.isUseTwitter() @@ -705,7 +557,7 @@ public class VisitCacheActivity extends AbstractLoggingActivity implements DateD return status; } catch (Exception e) { - Log.e("cgeovisit.postLogFn: " + e.toString()); + Log.e("cgeovisit.postLogFn", e); } return StatusCode.LOG_POST_ERROR; @@ -717,7 +569,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 +579,76 @@ 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; - - 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; - } - - 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; + @Override + protected LogContext getLogContext() { + return new LogContext(cache); + } + + private void selectAllTrackablesAction() { + Builder alert = new AlertDialog.Builder(VisitCacheActivity.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; } - @Override - public Object onRetainNonConfigurationInstance() { - return new ActivityState(); + private void selectLogType() { + Builder alert = new AlertDialog.Builder(VisitCacheActivity.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 - protected LogContext getLogContext() { - return new LogContext(cache); + private void selectTrackableAction(View view) { + final int realViewId = view.getId(); + Builder alert = new AlertDialog.Builder(VisitCacheActivity.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(); } + } |
