aboutsummaryrefslogtreecommitdiffstats
path: root/main/src/cgeo/geocaching/CacheDetailActivity.java
diff options
context:
space:
mode:
Diffstat (limited to 'main/src/cgeo/geocaching/CacheDetailActivity.java')
-rw-r--r--main/src/cgeo/geocaching/CacheDetailActivity.java732
1 files changed, 270 insertions, 462 deletions
diff --git a/main/src/cgeo/geocaching/CacheDetailActivity.java b/main/src/cgeo/geocaching/CacheDetailActivity.java
index f473bb4..ac9b156 100644
--- a/main/src/cgeo/geocaching/CacheDetailActivity.java
+++ b/main/src/cgeo/geocaching/CacheDetailActivity.java
@@ -4,6 +4,7 @@ import butterknife.InjectView;
import butterknife.Views;
import cgeo.calendar.ICalendar;
+import cgeo.geocaching.activity.AbstractActivity;
import cgeo.geocaching.activity.AbstractViewPagerActivity;
import cgeo.geocaching.activity.Progress;
import cgeo.geocaching.apps.cache.navi.NavigationAppFactory;
@@ -14,13 +15,13 @@ import cgeo.geocaching.connector.gc.GCConnector;
import cgeo.geocaching.enumerations.CacheAttribute;
import cgeo.geocaching.enumerations.LoadFlags;
import cgeo.geocaching.enumerations.LoadFlags.SaveFlag;
-import cgeo.geocaching.enumerations.LogType;
import cgeo.geocaching.enumerations.WaypointType;
import cgeo.geocaching.geopoint.GeopointFormatter;
import cgeo.geocaching.geopoint.Units;
import cgeo.geocaching.network.HtmlImage;
import cgeo.geocaching.network.Network;
import cgeo.geocaching.network.Parameters;
+import cgeo.geocaching.settings.Settings;
import cgeo.geocaching.ui.AbstractCachingPageViewCreator;
import cgeo.geocaching.ui.AnchorAwareLinkMovementMethod;
import cgeo.geocaching.ui.CacheDetailsCreator;
@@ -29,10 +30,13 @@ import cgeo.geocaching.ui.DecryptTextClickListener;
import cgeo.geocaching.ui.EditNoteDialog;
import cgeo.geocaching.ui.EditNoteDialog.EditNoteDialogListener;
import cgeo.geocaching.ui.Formatter;
+import cgeo.geocaching.ui.HtmlImageCounter;
import cgeo.geocaching.ui.ImagesList;
+import cgeo.geocaching.ui.IndexOutOfBoundsAvoidingTextView;
import cgeo.geocaching.ui.LoggingUI;
+import cgeo.geocaching.ui.OwnerActionsClickListener;
import cgeo.geocaching.ui.WeakReferenceHandler;
-import cgeo.geocaching.utils.TextUtils;
+import cgeo.geocaching.ui.logs.CacheLogsViewCreator;
import cgeo.geocaching.utils.CancellableHandler;
import cgeo.geocaching.utils.ClipboardUtils;
import cgeo.geocaching.utils.CryptUtils;
@@ -42,6 +46,9 @@ import cgeo.geocaching.utils.ImageUtils;
import cgeo.geocaching.utils.Log;
import cgeo.geocaching.utils.MatcherWrapper;
import cgeo.geocaching.utils.RunnableWithArgument;
+import cgeo.geocaching.utils.SimpleCancellableHandler;
+import cgeo.geocaching.utils.SimpleHandler;
+import cgeo.geocaching.utils.TextUtils;
import cgeo.geocaching.utils.TranslationUtils;
import cgeo.geocaching.utils.UnknownTagsHandler;
@@ -101,14 +108,12 @@ import android.widget.ScrollView;
import android.widget.TextView;
import android.widget.TextView.BufferType;
+import java.lang.ref.WeakReference;
import java.util.ArrayList;
import java.util.Collections;
-import java.util.Comparator;
import java.util.EnumSet;
import java.util.List;
import java.util.Locale;
-import java.util.Map;
-import java.util.Map.Entry;
import java.util.regex.Pattern;
/**
@@ -148,6 +153,7 @@ public class CacheDetailActivity extends AbstractViewPagerActivity<CacheDetailAc
private Geocache cache;
private final Progress progress = new Progress();
+
private SearchResult search;
private EditNoteDialogListener editNoteDialogListener;
@@ -159,24 +165,9 @@ public class CacheDetailActivity extends AbstractViewPagerActivity<CacheDetailAc
return;
}
- try {
- final StringBuilder dist = new StringBuilder();
-
- if (geo.getCoords() != null && cache != null && cache.getCoords() != null) {
- dist.append(Units.getDistanceFromKilometers(geo.getCoords().distanceTo(cache.getCoords())));
- }
-
- if (cache != null && cache.getElevation() != null) {
- if (geo.getAltitude() != 0.0) {
- final float diff = (float) (cache.getElevation() - geo.getAltitude());
- dist.append(' ').append(Units.getElevation(diff));
- }
- }
-
- cacheDistanceView.setText(dist.toString());
+ if (geo.getCoords() != null && cache != null && cache.getCoords() != null) {
+ cacheDistanceView.setText(Units.getDistanceFromKilometers(geo.getCoords().distanceTo(cache.getCoords())));
cacheDistanceView.bringToFront();
- } catch (Exception e) {
- Log.w("Failed to update location.");
}
}
};
@@ -192,12 +183,6 @@ public class CacheDetailActivity extends AbstractViewPagerActivity<CacheDetailAc
// some views that must be available from everywhere // TODO: Reference can block GC?
private TextView cacheDistanceView;
- private Handler cacheChangeNotificationHandler = new Handler() {
- @Override
- public void handleMessage(Message msg) {
- notifyDataSetChanged();
- }
- };
protected ImagesList imagesList;
@Override
@@ -232,9 +217,9 @@ public class CacheDetailActivity extends AbstractViewPagerActivity<CacheDetailAc
// try to get data from URI
if (geocode == null && guid == null && uri != null) {
- String uriHost = uri.getHost().toLowerCase(Locale.US);
- String uriPath = uri.getPath().toLowerCase(Locale.US);
- String uriQuery = uri.getQuery();
+ final String uriHost = uri.getHost().toLowerCase(Locale.US);
+ final String uriPath = uri.getPath().toLowerCase(Locale.US);
+ final String uriQuery = uri.getQuery();
if (uriQuery != null) {
Log.i("Opening URI: " + uriHost + uriPath + "?" + uriQuery);
@@ -292,7 +277,7 @@ public class CacheDetailActivity extends AbstractViewPagerActivity<CacheDetailAc
return;
}
- final LoadCacheHandler loadCacheHandler = new LoadCacheHandler();
+ final LoadCacheHandler loadCacheHandler = new LoadCacheHandler(this, progress);
try {
String title = res.getString(R.string.cache);
@@ -302,11 +287,11 @@ public class CacheDetailActivity extends AbstractViewPagerActivity<CacheDetailAc
title = geocode;
}
progress.show(this, title, res.getString(R.string.cache_dialog_loading_details), true, loadCacheHandler.cancelMessage());
- } catch (Exception e) {
+ } catch (final Exception e) {
// nothing, we lost the window
}
- ImageView defaultNavigationImageView = (ImageView) findViewById(R.id.defaultNavigation);
+ final ImageView defaultNavigationImageView = (ImageView) findViewById(R.id.defaultNavigation);
defaultNavigationImageView.setOnLongClickListener(new OnLongClickListener() {
@Override
public boolean onLongClick(View v) {
@@ -375,7 +360,7 @@ public class CacheDetailActivity extends AbstractViewPagerActivity<CacheDetailAc
switch (viewId) {
case R.id.value: // coordinates, gc-code, name
clickedItemText = ((TextView) view).getText();
- String itemTitle = (String) ((TextView) ((View) view.getParent()).findViewById(R.id.name)).getText();
+ final String itemTitle = (String) ((TextView) ((View) view.getParent()).findViewById(R.id.name)).getText();
buildOptionsContextmenu(menu, viewId, itemTitle, true);
break;
case R.id.shortdesc:
@@ -384,7 +369,7 @@ public class CacheDetailActivity extends AbstractViewPagerActivity<CacheDetailAc
break;
case R.id.longdesc:
// combine short and long description
- String shortDesc = cache.getShortDescription();
+ final String shortDesc = cache.getShortDescription();
if (StringUtils.isBlank(shortDesc)) {
clickedItemText = ((TextView) view).getText();
} else {
@@ -433,7 +418,7 @@ public class CacheDetailActivity extends AbstractViewPagerActivity<CacheDetailAc
break;
}
}
- } catch (Exception e) {
+ } catch (final Exception e) {
}
}
break;
@@ -579,8 +564,8 @@ public class CacheDetailActivity extends AbstractViewPagerActivity<CacheDetailAc
menu.findItem(MENU_CALENDAR).setVisible(cache.canBeAddedToCalendar());
menu.findItem(MENU_CACHES_AROUND).setVisible(null != cache.getCoords() && cache.supportsCachesAround());
menu.findItem(MENU_BROWSER).setVisible(cache.canOpenInBrowser());
+ LoggingUI.onPrepareOptionsMenu(menu, cache);
}
- LoggingUI.onPrepareOptionsMenu(menu, cache);
return super.onPrepareOptionsMenu(menu);
}
@@ -623,44 +608,56 @@ public class CacheDetailActivity extends AbstractViewPagerActivity<CacheDetailAc
return true;
}
- private class LoadCacheHandler extends CancellableHandler {
+ private final static class LoadCacheHandler extends SimpleCancellableHandler {
+
+ public LoadCacheHandler(CacheDetailActivity activity, Progress progress) {
+ super(activity, progress);
+ }
+
@Override
public void handleRegularMessage(final Message msg) {
if (UPDATE_LOAD_PROGRESS_DETAIL == msg.what && msg.obj instanceof String) {
updateStatusMsg((String) msg.obj);
} else {
+ CacheDetailActivity activity = ((CacheDetailActivity) activityRef.get());
+ if (activity == null) {
+ return;
+ }
+ SearchResult search = activity.getSearch();
if (search == null) {
- showToast(res.getString(R.string.err_dwld_details_failed));
-
- progress.dismiss();
- finish();
+ showToast(R.string.err_dwld_details_failed);
+ dismissProgress();
+ finishActivity();
return;
}
if (search.getError() != null) {
- showToast(res.getString(R.string.err_dwld_details_failed) + " " + search.getError().getErrorString(res) + ".");
-
- progress.dismiss();
- finish();
+ activity.showToast(activity.getResources().getString(R.string.err_dwld_details_failed) + " " + search.getError().getErrorString(activity.getResources()) + ".");
+ dismissProgress();
+ finishActivity();
return;
}
- updateStatusMsg(res.getString(R.string.cache_dialog_loading_details_status_render));
+ updateStatusMsg(activity.getResources().getString(R.string.cache_dialog_loading_details_status_render));
// Data loaded, we're ready to show it!
- notifyDataSetChanged();
+ activity.notifyDataSetChanged();
}
}
private void updateStatusMsg(final String msg) {
- progress.setMessage(res.getString(R.string.cache_dialog_loading_details)
+ CacheDetailActivity activity = ((CacheDetailActivity) activityRef.get());
+ if (activity == null) {
+ return;
+ }
+ setProgressMessage(activity.getResources().getString(R.string.cache_dialog_loading_details)
+ "\n\n"
+ msg);
}
@Override
public void handleCancel(final Object extra) {
- finish();
+ finishActivity();
}
}
@@ -680,7 +677,7 @@ public class CacheDetailActivity extends AbstractViewPagerActivity<CacheDetailAc
}
// allow cache to notify CacheDetailActivity when it changes so it can be reloaded
- cache.setChangeNotificationHandler(cacheChangeNotificationHandler);
+ cache.setChangeNotificationHandler(new ChangeNotificationHandler(this, progress));
// action bar: title and icon
if (StringUtils.isNotBlank(cache.getName())) {
@@ -788,7 +785,7 @@ public class CacheDetailActivity extends AbstractViewPagerActivity<CacheDetailAc
.setPositiveButton(getString(android.R.string.yes), new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int id) {
- Intent intent = new Intent(Intent.ACTION_VIEW);
+ final Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setData(Uri.parse(ICalendar.CALENDAR_ADDON_URI));
startActivity(intent);
}
@@ -832,95 +829,15 @@ public class CacheDetailActivity extends AbstractViewPagerActivity<CacheDetailAc
NavigationAppFactory.showNavigationMenu(this, cache, null, null, true, true);
}
- /**
- * Listener for clicks on username
- */
- private class UserActionsClickListener implements View.OnClickListener {
-
- @Override
- public void onClick(View view) {
- if (view == null) {
- return;
- }
- if (!cache.supportsUserActions()) {
- return;
- }
-
- clickedItemText = ((TextView) view).getText().toString();
- showUserActionsDialog(clickedItemText);
- }
- }
-
- /**
- * Listener for clicks on owner name
- */
- private class OwnerActionsClickListener implements View.OnClickListener {
-
- @Override
- public void onClick(View view) {
- if (view == null) {
- return;
- }
- if (!cache.supportsUserActions()) {
- return;
- }
-
- // Use real owner name vice the one owner chose to display
- if (StringUtils.isNotBlank(cache.getOwnerUserId())) {
- clickedItemText = cache.getOwnerUserId();
- } else {
- clickedItemText = ((TextView) view).getText().toString();
- }
- showUserActionsDialog(clickedItemText);
- }
- }
-
- /**
- * Opens a dialog to do actions on an username
- */
- private void showUserActionsDialog(final CharSequence name) {
- final CharSequence[] items = { res.getString(R.string.user_menu_view_hidden),
- res.getString(R.string.user_menu_view_found),
- res.getString(R.string.user_menu_open_browser),
- res.getString(R.string.user_menu_send_message)
- };
-
- AlertDialog.Builder builder = new AlertDialog.Builder(this);
- builder.setTitle(res.getString(R.string.user_menu_title) + " " + name);
- builder.setItems(items, new DialogInterface.OnClickListener() {
- @Override
- public void onClick(DialogInterface dialog, int item) {
- switch (item) {
- case 0:
- cgeocaches.startActivityOwner(CacheDetailActivity.this, name.toString());
- return;
- case 1:
- cgeocaches.startActivityUserName(CacheDetailActivity.this, name.toString());
- return;
- case 2:
- startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse("http://www.geocaching.com/profile/?u=" + Network.encode(name.toString()))));
- return;
- case 3:
- startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse("http://www.geocaching.com/email/?u=" + Network.encode(name.toString()))));
- return;
- default:
- break;
- }
- }
- });
- AlertDialog alert = builder.create();
- alert.show();
- }
-
private void loadCacheImages() {
if (imagesList != null) {
return;
}
- PageViewCreator creator = getViewCreator(Page.IMAGES);
+ final PageViewCreator creator = getViewCreator(Page.IMAGES);
if (creator == null) {
return;
}
- View imageView = creator.getView();
+ final View imageView = creator.getView();
if (imageView == null) {
return;
}
@@ -1062,12 +979,12 @@ public class CacheDetailActivity extends AbstractViewPagerActivity<CacheDetailAc
noAttributeIconsFound = true;
- for (String attributeName : cache.getAttributes()) {
+ for (final String attributeName : cache.getAttributes()) {
// check if another attribute icon fits in this row
attributeRow.measure(0, 0);
- int rowWidth = attributeRow.getMeasuredWidth();
- FrameLayout fl = (FrameLayout) getLayoutInflater().inflate(R.layout.attribute_image, null);
- ImageView iv = (ImageView) fl.getChildAt(0);
+ final int rowWidth = attributeRow.getMeasuredWidth();
+ final FrameLayout fl = (FrameLayout) getLayoutInflater().inflate(R.layout.attribute_image, null);
+ final ImageView iv = (ImageView) fl.getChildAt(0);
if ((parentWidth - rowWidth) < iv.getLayoutParams().width) {
// make a new row
attributeRow = newAttributeIconsRow();
@@ -1083,14 +1000,14 @@ public class CacheDetailActivity extends AbstractViewPagerActivity<CacheDetailAc
// strike through?
if (strikethru) {
// generate strikethru image with same properties as attribute image
- ImageView strikethruImage = new ImageView(CacheDetailActivity.this);
+ final ImageView strikethruImage = new ImageView(CacheDetailActivity.this);
strikethruImage.setLayoutParams(iv.getLayoutParams());
d = res.getDrawable(R.drawable.attribute__strikethru);
strikethruImage.setImageDrawable(d);
fl.addView(strikethruImage);
}
} else {
- Drawable d = res.getDrawable(R.drawable.attribute_unknown);
+ final Drawable d = res.getDrawable(R.drawable.attribute_unknown);
iv.setImageDrawable(d);
}
@@ -1101,7 +1018,7 @@ public class CacheDetailActivity extends AbstractViewPagerActivity<CacheDetailAc
}
private LinearLayout newAttributeIconsRow() {
- LinearLayout rowLayout = new LinearLayout(CacheDetailActivity.this);
+ final LinearLayout rowLayout = new LinearLayout(CacheDetailActivity.this);
rowLayout.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT,
LayoutParams.WRAP_CONTENT));
rowLayout.setOrientation(LinearLayout.HORIZONTAL);
@@ -1166,7 +1083,7 @@ public class CacheDetailActivity extends AbstractViewPagerActivity<CacheDetailAc
final CacheDetailsCreator details = new CacheDetailsCreator(CacheDetailActivity.this, detailsList);
// cache name (full name)
- Spannable span = (new Spannable.Factory()).newSpannable(Html.fromHtml(cache.getName()).toString());
+ final Spannable span = (new Spannable.Factory()).newSpannable(Html.fromHtml(cache.getName()).toString());
if (cache.isDisabled() || cache.isArchived()) { // strike
span.setSpan(new StrikethroughSpan(), 0, span.toString().length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
}
@@ -1199,18 +1116,18 @@ public class CacheDetailActivity extends AbstractViewPagerActivity<CacheDetailAc
// cache author
if (StringUtils.isNotBlank(cache.getOwnerDisplayName()) || StringUtils.isNotBlank(cache.getOwnerUserId())) {
- TextView ownerView = details.add(R.string.cache_owner, "");
+ final TextView ownerView = details.add(R.string.cache_owner, "");
if (StringUtils.isNotBlank(cache.getOwnerDisplayName())) {
ownerView.setText(cache.getOwnerDisplayName(), TextView.BufferType.SPANNABLE);
} else { // OwnerReal guaranteed to be not blank based on above
ownerView.setText(cache.getOwnerUserId(), TextView.BufferType.SPANNABLE);
}
- ownerView.setOnClickListener(new OwnerActionsClickListener());
+ ownerView.setOnClickListener(new OwnerActionsClickListener(cache));
}
// cache hidden
if (cache.getHiddenDate() != null) {
- long time = cache.getHiddenDate().getTime();
+ final long time = cache.getHiddenDate().getTime();
if (time > 0) {
String dateString = Formatter.formatFullDate(time);
if (cache.isEventCache()) {
@@ -1227,7 +1144,7 @@ public class CacheDetailActivity extends AbstractViewPagerActivity<CacheDetailAc
// cache coordinates
if (cache.getCoords() != null) {
- TextView valueView = details.add(R.string.cache_coordinates, cache.getCoords().toString());
+ final TextView valueView = details.add(R.string.cache_coordinates, cache.getCoords().toString());
valueView.setOnClickListener(new CoordinatesFormatSwitcher(cache.getCoords()));
registerForContextMenu(valueView);
}
@@ -1241,31 +1158,31 @@ public class CacheDetailActivity extends AbstractViewPagerActivity<CacheDetailAc
updateOfflineBox(view, cache, res, new RefreshCacheClickListener(), new DropCacheClickListener(), new StoreCacheClickListener());
// watchlist
- Button buttonWatchlistAdd = (Button) view.findViewById(R.id.add_to_watchlist);
- Button buttonWatchlistRemove = (Button) view.findViewById(R.id.remove_from_watchlist);
+ final Button buttonWatchlistAdd = (Button) view.findViewById(R.id.add_to_watchlist);
+ final Button buttonWatchlistRemove = (Button) view.findViewById(R.id.remove_from_watchlist);
buttonWatchlistAdd.setOnClickListener(new AddToWatchlistClickListener());
buttonWatchlistRemove.setOnClickListener(new RemoveFromWatchlistClickListener());
updateWatchlistBox();
// favorite points
- Button buttonFavPointAdd = (Button) view.findViewById(R.id.add_to_favpoint);
- Button buttonFavPointRemove = (Button) view.findViewById(R.id.remove_from_favpoint);
+ final Button buttonFavPointAdd = (Button) view.findViewById(R.id.add_to_favpoint);
+ final Button buttonFavPointRemove = (Button) view.findViewById(R.id.remove_from_favpoint);
buttonFavPointAdd.setOnClickListener(new FavoriteAddClickListener());
buttonFavPointRemove.setOnClickListener(new FavoriteRemoveClickListener());
updateFavPointBox();
// list
- Button buttonChangeList = (Button) view.findViewById(R.id.change_list);
+ final Button buttonChangeList = (Button) view.findViewById(R.id.change_list);
buttonChangeList.setOnClickListener(new ChangeListClickListener());
updateListBox();
// data license
- IConnector connector = ConnectorFactory.getConnector(cache);
+ final IConnector connector = ConnectorFactory.getConnector(cache);
if (connector != null) {
- String license = connector.getLicenseText(cache);
+ final String license = connector.getLicenseText(cache);
if (StringUtils.isNotBlank(license)) {
view.findViewById(R.id.license_box).setVisibility(View.VISIBLE);
- TextView licenseView = ((TextView) view.findViewById(R.id.license));
+ final TextView licenseView = ((TextView) view.findViewById(R.id.license));
licenseView.setText(Html.fromHtml(license), BufferType.SPANNABLE);
licenseView.setClickable(true);
licenseView.setMovementMethod(AnchorAwareLinkMovementMethod.getInstance());
@@ -1277,49 +1194,6 @@ public class CacheDetailActivity extends AbstractViewPagerActivity<CacheDetailAc
return view;
}
- private class StoreCacheHandler extends CancellableHandler {
- @Override
- public void handleRegularMessage(Message msg) {
- if (UPDATE_LOAD_PROGRESS_DETAIL == msg.what && msg.obj instanceof String) {
- updateStatusMsg((String) msg.obj);
- } else {
- storeThread = null;
- CacheDetailActivity.this.notifyDataSetChanged(); // reload cache details
- }
- }
-
- private void updateStatusMsg(final String msg) {
- progress.setMessage(res.getString(R.string.cache_dialog_offline_save_message)
- + "\n\n"
- + msg);
- }
- }
-
- private class RefreshCacheHandler extends CancellableHandler {
- @Override
- public void handleRegularMessage(Message msg) {
- if (UPDATE_LOAD_PROGRESS_DETAIL == msg.what && msg.obj instanceof String) {
- updateStatusMsg((String) msg.obj);
- } else {
- refreshThread = null;
- CacheDetailActivity.this.notifyDataSetChanged(); // reload cache details
- }
- }
-
- private void updateStatusMsg(final String msg) {
- progress.setMessage(res.getString(R.string.cache_dialog_refresh_message)
- + "\n\n"
- + msg);
- }
- }
-
- private class DropCacheHandler extends Handler {
- @Override
- public void handleMessage(Message msg) {
- CacheDetailActivity.this.notifyDataSetChanged();
- }
- }
-
private class StoreCacheClickListener implements View.OnClickListener {
@Override
public void onClick(View arg0) {
@@ -1343,7 +1217,7 @@ public class CacheDetailActivity extends AbstractViewPagerActivity<CacheDetailAc
}
protected void storeCache(int listId) {
- final StoreCacheHandler storeCacheHandler = new StoreCacheHandler();
+ final StoreCacheHandler storeCacheHandler = new StoreCacheHandler(CacheDetailActivity.this, progress);
progress.show(CacheDetailActivity.this, res.getString(R.string.cache_dialog_offline_save_title), res.getString(R.string.cache_dialog_offline_save_message), true, storeCacheHandler.cancelMessage());
@@ -1369,7 +1243,7 @@ public class CacheDetailActivity extends AbstractViewPagerActivity<CacheDetailAc
return;
}
- final RefreshCacheHandler refreshCacheHandler = new RefreshCacheHandler();
+ final RefreshCacheHandler refreshCacheHandler = new RefreshCacheHandler(CacheDetailActivity.this, progress);
progress.show(CacheDetailActivity.this, res.getString(R.string.cache_dialog_refresh_title), res.getString(R.string.cache_dialog_refresh_message), true, refreshCacheHandler.cancelMessage());
@@ -1394,6 +1268,7 @@ public class CacheDetailActivity extends AbstractViewPagerActivity<CacheDetailAc
@Override
public void run() {
cache.store(listId, handler);
+ storeThread = null;
}
}
@@ -1407,7 +1282,7 @@ public class CacheDetailActivity extends AbstractViewPagerActivity<CacheDetailAc
@Override
public void run() {
cache.refresh(cache.getListId(), handler);
-
+ refreshThread = null;
handler.sendEmptyMessage(0);
}
}
@@ -1420,24 +1295,22 @@ public class CacheDetailActivity extends AbstractViewPagerActivity<CacheDetailAc
return;
}
- final DropCacheHandler dropCacheHandler = new DropCacheHandler();
-
progress.show(CacheDetailActivity.this, res.getString(R.string.cache_dialog_offline_drop_title), res.getString(R.string.cache_dialog_offline_drop_message), true, null);
- new DropCacheThread(dropCacheHandler).start();
+ new DropCacheThread(new ChangeNotificationHandler(CacheDetailActivity.this, progress)).start();
}
}
private class DropCacheThread extends Thread {
+ private Handler handler;
- private Handler handler = null;
-
- public DropCacheThread(Handler handlerIn) {
- handler = handlerIn;
+ public DropCacheThread(Handler handler) {
+ super();
+ this.handler = handler;
}
@Override
public void run() {
- cache.drop(handler);
+ cache.drop(this.handler);
}
}
@@ -1469,7 +1342,7 @@ public class CacheDetailActivity extends AbstractViewPagerActivity<CacheDetailAc
public void onClick(View arg0) {
doExecute(R.string.cache_dialog_watchlist_add_title,
R.string.cache_dialog_watchlist_add_message,
- new WatchlistAddThread(new WatchlistHandler()));
+ new WatchlistAddThread(new WatchlistHandler(CacheDetailActivity.this, progress)));
}
}
@@ -1481,7 +1354,7 @@ public class CacheDetailActivity extends AbstractViewPagerActivity<CacheDetailAc
public void onClick(View arg0) {
doExecute(R.string.cache_dialog_watchlist_remove_title,
R.string.cache_dialog_watchlist_remove_message,
- new WatchlistRemoveThread(new WatchlistHandler()));
+ new WatchlistRemoveThread(new WatchlistHandler(CacheDetailActivity.this, progress)));
}
}
@@ -1495,6 +1368,7 @@ public class CacheDetailActivity extends AbstractViewPagerActivity<CacheDetailAc
@Override
public void run() {
+ watchlistThread = null;
handler.sendEmptyMessage(ConnectorFactory.getConnector(cache).addToWatchlist(cache) ? 1 : -1);
}
}
@@ -1509,6 +1383,7 @@ public class CacheDetailActivity extends AbstractViewPagerActivity<CacheDetailAc
@Override
public void run() {
+ watchlistThread = null;
handler.sendEmptyMessage(ConnectorFactory.getConnector(cache).removeFromWatchlist(cache) ? 1 : -1);
}
}
@@ -1523,6 +1398,7 @@ public class CacheDetailActivity extends AbstractViewPagerActivity<CacheDetailAc
@Override
public void run() {
+ watchlistThread = null;
handler.sendEmptyMessage(GCConnector.addToFavorites(cache) ? 1 : -1);
}
}
@@ -1537,22 +1413,11 @@ public class CacheDetailActivity extends AbstractViewPagerActivity<CacheDetailAc
@Override
public void run() {
+ watchlistThread = null;
handler.sendEmptyMessage(GCConnector.removeFromFavorites(cache) ? 1 : -1);
}
}
- private class FavoriteUpdateHandler extends Handler {
- @Override
- public void handleMessage(Message msg) {
- progress.dismiss();
- if (msg.what == -1) {
- showToast(res.getString(R.string.err_favorite_failed));
- } else {
- CacheDetailActivity.this.notifyDataSetChanged(); // reload cache details
- }
- }
- }
-
/**
* Listener for "add to favorites" button
*/
@@ -1561,7 +1426,7 @@ public class CacheDetailActivity extends AbstractViewPagerActivity<CacheDetailAc
public void onClick(View arg0) {
doExecute(R.string.cache_dialog_favorite_add_title,
R.string.cache_dialog_favorite_add_message,
- new FavoriteAddThread(new FavoriteUpdateHandler()));
+ new FavoriteAddThread(new FavoriteUpdateHandler(CacheDetailActivity.this, progress)));
}
}
@@ -1573,7 +1438,7 @@ public class CacheDetailActivity extends AbstractViewPagerActivity<CacheDetailAc
public void onClick(View arg0) {
doExecute(R.string.cache_dialog_favorite_remove_title,
R.string.cache_dialog_favorite_remove_message,
- new FavoriteRemoveThread(new FavoriteUpdateHandler()));
+ new FavoriteRemoveThread(new FavoriteUpdateHandler(CacheDetailActivity.this, progress)));
}
}
@@ -1613,15 +1478,15 @@ public class CacheDetailActivity extends AbstractViewPagerActivity<CacheDetailAc
* shows/hides buttons, sets text in watchlist box
*/
private void updateWatchlistBox() {
- LinearLayout layout = (LinearLayout) view.findViewById(R.id.watchlist_box);
- boolean supportsWatchList = cache.supportsWatchList();
+ final LinearLayout layout = (LinearLayout) view.findViewById(R.id.watchlist_box);
+ final boolean supportsWatchList = cache.supportsWatchList();
layout.setVisibility(supportsWatchList ? View.VISIBLE : View.GONE);
if (!supportsWatchList) {
return;
}
- Button buttonAdd = (Button) view.findViewById(R.id.add_to_watchlist);
- Button buttonRemove = (Button) view.findViewById(R.id.remove_from_watchlist);
- TextView text = (TextView) view.findViewById(R.id.watchlist_text);
+ final Button buttonAdd = (Button) view.findViewById(R.id.add_to_watchlist);
+ final Button buttonRemove = (Button) view.findViewById(R.id.remove_from_watchlist);
+ final TextView text = (TextView) view.findViewById(R.id.watchlist_text);
if (cache.isOnWatchlist() || cache.isOwner()) {
buttonAdd.setVisibility(View.GONE);
@@ -1647,15 +1512,15 @@ public class CacheDetailActivity extends AbstractViewPagerActivity<CacheDetailAc
* shows/hides buttons, sets text in watchlist box
*/
private void updateFavPointBox() {
- LinearLayout layout = (LinearLayout) view.findViewById(R.id.favpoint_box);
- boolean supportsFavoritePoints = cache.supportsFavoritePoints();
+ final LinearLayout layout = (LinearLayout) view.findViewById(R.id.favpoint_box);
+ final boolean supportsFavoritePoints = cache.supportsFavoritePoints();
layout.setVisibility(supportsFavoritePoints ? View.VISIBLE : View.GONE);
if (!supportsFavoritePoints || cache.isOwner() || !Settings.isPremiumMember()) {
return;
}
- Button buttonAdd = (Button) view.findViewById(R.id.add_to_favpoint);
- Button buttonRemove = (Button) view.findViewById(R.id.remove_from_favpoint);
- TextView text = (TextView) view.findViewById(R.id.favpoint_text);
+ final Button buttonAdd = (Button) view.findViewById(R.id.add_to_favpoint);
+ final Button buttonRemove = (Button) view.findViewById(R.id.remove_from_favpoint);
+ final TextView text = (TextView) view.findViewById(R.id.favpoint_text);
if (cache.isFavorite()) {
buttonAdd.setVisibility(View.GONE);
@@ -1680,15 +1545,15 @@ public class CacheDetailActivity extends AbstractViewPagerActivity<CacheDetailAc
* shows/hides/updates list box
*/
private void updateListBox() {
- View box = view.findViewById(R.id.list_box);
+ final View box = view.findViewById(R.id.list_box);
if (cache.isOffline()) {
// show box
box.setVisibility(View.VISIBLE);
// update text
- TextView text = (TextView) view.findViewById(R.id.list_text);
- StoredList list = cgData.getList(cache.getListId());
+ final TextView text = (TextView) view.findViewById(R.id.list_text);
+ final StoredList list = cgData.getList(cache.getListId());
if (list != null) {
text.setText(res.getString(R.string.cache_list_text) + " " + list.title);
} else {
@@ -1701,22 +1566,6 @@ public class CacheDetailActivity extends AbstractViewPagerActivity<CacheDetailAc
}
}
- /**
- * Handler, called when watchlist add or remove is done
- */
- private class WatchlistHandler extends Handler {
- @Override
- public void handleMessage(Message msg) {
- watchlistThread = null;
- progress.dismiss();
- if (msg.what == -1) {
- showToast(res.getString(R.string.err_watchlist_failed));
- } else {
- CacheDetailActivity.this.notifyDataSetChanged(); // reload cache details
- }
- }
- }
-
private class PreviewMapTask extends AsyncTask<Void, Void, BitmapDrawable> {
@Override
protected BitmapDrawable doInBackground(Void... parameters) {
@@ -1733,7 +1582,7 @@ public class CacheDetailActivity extends AbstractViewPagerActivity<CacheDetailAc
}
return ImageUtils.scaleBitmapToFitDisplay(image);
- } catch (Exception e) {
+ } catch (final Exception e) {
Log.w("CacheDetailActivity.PreviewMapTask", e);
return null;
}
@@ -1757,12 +1606,11 @@ public class CacheDetailActivity extends AbstractViewPagerActivity<CacheDetailAc
((ImageView) view.findViewById(R.id.map_preview)).setImageDrawable(image);
view.findViewById(R.id.map_preview_box).setVisibility(View.VISIBLE);
- } catch (Exception e) {
+ } catch (final Exception e) {
Log.e("CacheDetailActivity.PreviewMapTask", e);
}
}
}
-
}
protected class DescriptionViewCreator extends AbstractCachingPageViewCreator<ScrollView> {
@@ -1789,7 +1637,7 @@ public class CacheDetailActivity extends AbstractViewPagerActivity<CacheDetailAc
if (Settings.isAutoLoadDescription()) {
loadLongDescription();
} else {
- Button showDesc = (Button) view.findViewById(R.id.show_description);
+ final Button showDesc = (Button) view.findViewById(R.id.show_description);
showDesc.setVisibility(View.VISIBLE);
showDesc.setOnClickListener(new View.OnClickListener() {
@Override
@@ -1815,6 +1663,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 +1745,21 @@ public class CacheDetailActivity extends AbstractViewPagerActivity<CacheDetailAc
}
}
+ Thread currentThread;
+
+ private void uploadPersonalNote() {
+ final SimpleCancellableHandler myHandler = new SimpleCancellableHandler(CacheDetailActivity.this, progress);
+
+ 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);
@@ -1896,7 +1771,7 @@ public class CacheDetailActivity extends AbstractViewPagerActivity<CacheDetailAc
}
private void loadLongDescription() {
- Button showDesc = (Button) view.findViewById(R.id.show_description);
+ final Button showDesc = (Button) view.findViewById(R.id.show_description);
showDesc.setVisibility(View.GONE);
showDesc.setOnClickListener(null);
view.findViewById(R.id.loading).setVisibility(View.VISIBLE);
@@ -1938,21 +1813,6 @@ public class CacheDetailActivity extends AbstractViewPagerActivity<CacheDetailAc
editNoteDialogListener.onFinishEditNoteDialog(note);
}
- private static class HtmlImageCounter implements Html.ImageGetter {
-
- private int imageCount = 0;
-
- @Override
- public Drawable getDrawable(String url) {
- imageCount++;
- return null;
- }
-
- public int getImageCount() {
- return imageCount;
- }
- }
-
/**
* Loads the description in background. <br />
* <br />
@@ -1965,14 +1825,14 @@ public class CacheDetailActivity extends AbstractViewPagerActivity<CacheDetailAc
*/
private class LoadDescriptionTask extends AsyncTask<Object, Void, Void> {
private final View loadingIndicatorView;
- private final TextView descriptionView;
+ private final IndexOutOfBoundsAvoidingTextView descriptionView;
private final String descriptionString;
private Spanned description;
private final View shortDescView;
public LoadDescriptionTask(final String description, final View descriptionView, final View loadingIndicatorView, final View shortDescView) {
this.descriptionString = description;
- this.descriptionView = (TextView) descriptionView;
+ this.descriptionView = (IndexOutOfBoundsAvoidingTextView) descriptionView;
this.loadingIndicatorView = loadingIndicatorView;
this.shortDescView = shortDescView;
}
@@ -1981,7 +1841,7 @@ public class CacheDetailActivity extends AbstractViewPagerActivity<CacheDetailAc
protected Void doInBackground(Object... params) {
try {
// Fast preview: parse only HTML without loading any images
- HtmlImageCounter imageCounter = new HtmlImageCounter();
+ final HtmlImageCounter imageCounter = new HtmlImageCounter();
final UnknownTagsHandler unknownTagsHandler = new UnknownTagsHandler();
description = Html.fromHtml(descriptionString, imageCounter, unknownTagsHandler);
publishProgress();
@@ -2008,7 +1868,7 @@ public class CacheDetailActivity extends AbstractViewPagerActivity<CacheDetailAc
if (needsRefresh) {
publishProgress();
}
- } catch (Exception e) {
+ } catch (final Exception e) {
Log.e("LoadDescriptionTask: ", e);
}
return null;
@@ -2023,7 +1883,7 @@ public class CacheDetailActivity extends AbstractViewPagerActivity<CacheDetailAc
if (StringUtils.isNotBlank(descriptionString)) {
try {
descriptionView.setText(description, TextView.BufferType.SPANNABLE);
- } catch (Exception e) {
+ } catch (final Exception e) {
// On 4.1, there is sometimes a crash on measuring the layout: https://code.google.com/p/android/issues/detail?id=35412
Log.e("Android bug setting text: ", e);
// remove the formatting by converting to a simple string
@@ -2045,7 +1905,7 @@ public class CacheDetailActivity extends AbstractViewPagerActivity<CacheDetailAc
if (shortDescView != null) {
final String shortDescription = cache.getShortDescription();
if (StringUtils.isNotBlank(shortDescription)) {
- int index = descriptionString.indexOf(shortDescription);
+ final int index = descriptionString.indexOf(shortDescription);
if (index >= 0 && index < 200) {
shortDescView.setVisibility(View.GONE);
}
@@ -2074,7 +1934,7 @@ public class CacheDetailActivity extends AbstractViewPagerActivity<CacheDetailAc
if (Settings.isLightSkin()) {
backcolor = color.white;
- for (Pattern pattern : LIGHT_COLOR_PATTERNS) {
+ for (final Pattern pattern : LIGHT_COLOR_PATTERNS) {
final MatcherWrapper matcher = new MatcherWrapper(pattern, text);
if (matcher.find()) {
view.setBackgroundResource(color.darker_gray);
@@ -2084,7 +1944,7 @@ public class CacheDetailActivity extends AbstractViewPagerActivity<CacheDetailAc
} else {
backcolor = color.black;
- for (Pattern pattern : DARK_COLOR_PATTERNS) {
+ for (final Pattern pattern : DARK_COLOR_PATTERNS) {
final MatcherWrapper matcher = new MatcherWrapper(pattern, text);
if (matcher.find()) {
view.setBackgroundResource(color.darker_gray);
@@ -2096,176 +1956,6 @@ public class CacheDetailActivity extends AbstractViewPagerActivity<CacheDetailAc
}
}
- private class LogsViewCreator extends AbstractCachingPageViewCreator<ListView> {
- private final boolean allLogs;
-
- LogsViewCreator(boolean allLogs) {
- this.allLogs = allLogs;
- }
-
- @Override
- public ListView getDispatchedView() {
- if (cache == null) {
- // something is really wrong
- return null;
- }
-
- view = (ListView) getLayoutInflater().inflate(R.layout.cachedetail_logs_page, null);
-
- // log count
- final Map<LogType, Integer> logCounts = cache.getLogCounts();
- if (logCounts != null) {
- final List<Entry<LogType, Integer>> sortedLogCounts = new ArrayList<Entry<LogType, Integer>>(logCounts.size());
- for (Entry<LogType, Integer> entry : logCounts.entrySet()) {
- // it may happen that the label is unknown -> then avoid any output for this type
- if (entry.getKey() != LogType.PUBLISH_LISTING && entry.getKey().getL10n() != null) {
- sortedLogCounts.add(entry);
- }
- }
-
- if (!sortedLogCounts.isEmpty()) {
- // sort the log counts by type id ascending. that way the FOUND, DNF log types are the first and most visible ones
- Collections.sort(sortedLogCounts, new Comparator<Entry<LogType, Integer>>() {
-
- @Override
- public int compare(Entry<LogType, Integer> logCountItem1, Entry<LogType, Integer> logCountItem2) {
- return logCountItem1.getKey().compareTo(logCountItem2.getKey());
- }
- });
-
- ArrayList<String> labels = new ArrayList<String>(sortedLogCounts.size());
- for (Entry<LogType, Integer> pair : sortedLogCounts) {
- labels.add(pair.getValue() + "× " + pair.getKey().getL10n());
- }
-
- final TextView countView = new TextView(CacheDetailActivity.this);
- countView.setText(res.getString(R.string.cache_log_types) + ": " + StringUtils.join(labels, ", "));
- view.addHeaderView(countView, null, false);
- }
- }
-
- final List<LogEntry> logs = allLogs ? cache.getLogs() : cache.getFriendsLogs();
- view.setAdapter(new ArrayAdapter<LogEntry>(CacheDetailActivity.this, R.layout.logs_item, logs) {
- final UserActionsClickListener userActionsClickListener = new UserActionsClickListener();
- final DecryptTextClickListener decryptTextClickListener = new DecryptTextClickListener();
-
- @Override
- public View getView(final int position, final View convertView, final ViewGroup parent) {
- View rowView = convertView;
- if (null == rowView) {
- rowView = getLayoutInflater().inflate(R.layout.logs_item, null);
- }
- LogViewHolder holder = (LogViewHolder) rowView.getTag();
- if (null == holder) {
- holder = new LogViewHolder(rowView);
- }
- holder.setPosition(position);
-
- final LogEntry log = getItem(position);
-
- if (log.date > 0) {
- holder.date.setText(Formatter.formatShortDateVerbally(log.date));
- holder.date.setVisibility(View.VISIBLE);
- } else {
- holder.date.setVisibility(View.GONE);
- }
-
- holder.type.setText(log.type.getL10n());
- holder.author.setText(StringEscapeUtils.unescapeHtml4(log.author));
-
- // finds count
- holder.countOrLocation.setVisibility(View.VISIBLE);
- if (log.found == -1) {
- holder.countOrLocation.setVisibility(View.GONE);
- } else {
- holder.countOrLocation.setText(res.getQuantityString(R.plurals.cache_counts, log.found, log.found));
- }
-
- // logtext, avoid parsing HTML if not necessary
- String logText = log.log;
- if (TextUtils.containsHtml(logText)) {
- logText = log.getDisplayText();
- // Fast preview: parse only HTML without loading any images
- HtmlImageCounter imageCounter = new HtmlImageCounter();
- final UnknownTagsHandler unknownTagsHandler = new UnknownTagsHandler();
- holder.text.setText(Html.fromHtml(logText, imageCounter, unknownTagsHandler), TextView.BufferType.SPANNABLE);
- if (imageCounter.getImageCount() > 0) {
- // Complete view: parse again with loading images - if necessary ! If there are any images causing problems the user can see at least the preview
- LogImageLoader loader = new LogImageLoader(holder);
- loader.execute(logText);
- }
- }
- else {
- holder.text.setText(logText, TextView.BufferType.SPANNABLE);
- }
-
- // images
- if (log.hasLogImages()) {
- holder.images.setText(log.getImageTitles());
- holder.images.setVisibility(View.VISIBLE);
- holder.images.setOnClickListener(new View.OnClickListener() {
- @Override
- public void onClick(View v) {
- ImagesActivity.startActivityLogImages(CacheDetailActivity.this, cache.getGeocode(), new ArrayList<Image>(log.getLogImages()));
- }
- });
- } else {
- holder.images.setVisibility(View.GONE);
- }
-
- // colored marker
- int marker = log.type.markerId;
- if (marker != 0) {
- holder.marker.setVisibility(View.VISIBLE);
- holder.marker.setImageResource(marker);
- }
- else {
- holder.marker.setVisibility(View.GONE);
- }
-
- if (null == convertView) {
- // if convertView != null then this listeners are already set
- holder.author.setOnClickListener(userActionsClickListener);
- holder.text.setMovementMethod(AnchorAwareLinkMovementMethod.getInstance());
- holder.text.setOnClickListener(decryptTextClickListener);
- registerForContextMenu(holder.text);
- }
-
- return rowView;
- }
- });
-
- return view;
- }
-
- /** Loads the Log Images outside the ui thread. */
-
- private class LogImageLoader extends AsyncTask<String, Progress, Spanned> {
- final private LogViewHolder holder;
- final private int position;
-
- public LogImageLoader(LogViewHolder holder) {
- this.holder = holder;
- this.position = holder.getPosition();
- }
-
- @Override
- protected Spanned doInBackground(String... logtext) {
- return Html.fromHtml(logtext[0], new HtmlImage(cache.getGeocode(), false, cache.getListId(), false), null); //, TextView.BufferType.SPANNABLE)
- }
-
- @Override
- protected void onPostExecute(Spanned result) {
- // Ensure that this holder and its view still references the right item before updating the text.
- if (position == holder.getPosition()) {
- holder.text.setText(result);
- }
- }
-
- }
-
- }
-
private class WaypointsViewCreator extends AbstractCachingPageViewCreator<ScrollView> {
@Override
@@ -2315,7 +2005,7 @@ public class CacheDetailActivity extends AbstractViewPagerActivity<CacheDetailAc
// visited
if (wpt.isVisited()) {
- TypedValue a = new TypedValue();
+ final TypedValue a = new TypedValue();
getTheme().resolveAttribute(R.attr.text_color_grey, a, true);
if (a.type >= TypedValue.TYPE_FIRST_COLOR_INT && a.type <= TypedValue.TYPE_LAST_COLOR_INT) {
// really should be just a color!
@@ -2402,9 +2092,9 @@ public class CacheDetailActivity extends AbstractViewPagerActivity<CacheDetailAc
view.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) {
- Object selection = arg0.getItemAtPosition(arg2);
+ final Object selection = arg0.getItemAtPosition(arg2);
if (selection instanceof Trackable) {
- Trackable trackable = (Trackable) selection;
+ final Trackable trackable = (Trackable) selection;
TrackableActivity.startActivity(CacheDetailActivity.this, trackable.getGuid(), trackable.getGeocode(), trackable.getName());
}
}
@@ -2449,10 +2139,10 @@ public class CacheDetailActivity extends AbstractViewPagerActivity<CacheDetailAc
*/
private AlertDialog createResetCacheCoordinatesDialog(final Geocache cache, final Waypoint wpt) {
- AlertDialog.Builder builder = new AlertDialog.Builder(this);
+ final AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setTitle(R.string.waypoint_reset_cache_coords);
- String[] items = new String[] { res.getString(R.string.waypoint_localy_reset_cache_coords), res.getString(R.string.waypoint_reset_local_and_remote_cache_coords) };
+ final String[] items = new String[] { res.getString(R.string.waypoint_localy_reset_cache_coords), res.getString(R.string.waypoint_reset_local_and_remote_cache_coords) };
builder.setSingleChoiceItems(items, 0, new DialogInterface.OnClickListener() {
@Override
@@ -2504,7 +2194,7 @@ public class CacheDetailActivity extends AbstractViewPagerActivity<CacheDetailAc
private final boolean local;
private final boolean remote;
private final Waypoint wpt;
- private ProgressDialog progress;
+ private final ProgressDialog progress;
public static final int LOCAL = 0;
public static final int ON_WEBSITE = 1;
@@ -2534,7 +2224,7 @@ public class CacheDetailActivity extends AbstractViewPagerActivity<CacheDetailAc
handler.sendEmptyMessage(LOCAL);
}
- IConnector con = ConnectorFactory.getConnector(cache);
+ final IConnector con = ConnectorFactory.getConnector(cache);
if (remote && con.supportsOwnCoordinates()) {
runOnUiThread(new Runnable() {
@Override
@@ -2564,6 +2254,29 @@ public class CacheDetailActivity extends AbstractViewPagerActivity<CacheDetailAc
}
}
+ 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(SimpleCancellableHandler.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
@@ -2606,10 +2319,10 @@ public class CacheDetailActivity extends AbstractViewPagerActivity<CacheDetailAc
return new DescriptionViewCreator();
case LOGS:
- return new LogsViewCreator(true);
+ return new CacheLogsViewCreator(this, true);
case LOGSFRIENDS:
- return new LogsViewCreator(false);
+ return new CacheLogsViewCreator(this, false);
case WAYPOINTS:
return new WaypointsViewCreator();
@@ -2635,7 +2348,7 @@ public class CacheDetailActivity extends AbstractViewPagerActivity<CacheDetailAc
final Button offlineStore = (Button) view.findViewById(R.id.offline_store);
if (cache.isOffline()) {
- long diff = (System.currentTimeMillis() / (60 * 1000)) - (cache.getDetailedUpdate() / (60 * 1000)); // minutes
+ final long diff = (System.currentTimeMillis() / (60 * 1000)) - (cache.getDetailedUpdate() / (60 * 1000)); // minutes
String ago;
if (diff < 15) {
@@ -2668,4 +2381,99 @@ public class CacheDetailActivity extends AbstractViewPagerActivity<CacheDetailAc
offlineRefresh.setClickable(true);
}
+ public Geocache getCache() {
+ return cache;
+ }
+
+ public SearchResult getSearch() {
+ return search;
+ }
+
+ private static final class StoreCacheHandler extends SimpleCancellableHandler {
+
+ public StoreCacheHandler(CacheDetailActivity activity, Progress progress) {
+ super(activity, progress);
+ }
+
+ @Override
+ public void handleRegularMessage(Message msg) {
+ if (UPDATE_LOAD_PROGRESS_DETAIL == msg.what && msg.obj instanceof String) {
+ updateStatusMsg(R.string.cache_dialog_offline_save_message, (String) msg.obj);
+ } else {
+ notifyDatasetChanged(activityRef);
+ }
+ }
+ }
+
+ private static final class RefreshCacheHandler extends SimpleCancellableHandler {
+
+ public RefreshCacheHandler(CacheDetailActivity activity, Progress progress) {
+ super(activity, progress);
+ }
+
+ @Override
+ public void handleRegularMessage(Message msg) {
+ if (UPDATE_LOAD_PROGRESS_DETAIL == msg.what && msg.obj instanceof String) {
+ updateStatusMsg(R.string.cache_dialog_refresh_message, (String) msg.obj);
+ } else {
+ notifyDatasetChanged(activityRef);
+ }
+ }
+ }
+
+ private static final class ChangeNotificationHandler extends SimpleHandler {
+
+ public ChangeNotificationHandler(CacheDetailActivity activity, Progress progress) {
+ super(activity, progress);
+ }
+
+ @Override
+ public void handleMessage(Message msg) {
+ notifyDatasetChanged(activityRef);
+ }
+ }
+
+ private static final class FavoriteUpdateHandler extends SimpleHandler {
+
+ public FavoriteUpdateHandler(CacheDetailActivity activity, Progress progress) {
+ super(activity, progress);
+ }
+
+ @Override
+ public void handleMessage(Message msg) {
+ if (msg.what == -1) {
+ dismissProgress();
+ showToast(R.string.err_favorite_failed);
+ } else {
+ notifyDatasetChanged(activityRef);
+ }
+ }
+ }
+
+ /**
+ * Handler, called when watchlist add or remove is done
+ */
+ private static final class WatchlistHandler extends SimpleHandler {
+
+ public WatchlistHandler(CacheDetailActivity activity, Progress progress) {
+ super(activity, progress);
+ }
+
+ @Override
+ public void handleMessage(Message msg) {
+ if (msg.what == -1) {
+ dismissProgress();
+ showToast(R.string.err_watchlist_failed);
+ } else {
+ notifyDatasetChanged(activityRef);
+ }
+ }
+ }
+
+ private static void notifyDatasetChanged(WeakReference<AbstractActivity> activityRef) {
+ CacheDetailActivity activity = ((CacheDetailActivity) activityRef.get());
+ if (activity != null) {
+ activity.notifyDataSetChanged();
+ }
+ }
}