diff options
Diffstat (limited to 'main/src/cgeo/geocaching/CacheDetailActivity.java')
| -rw-r--r-- | main/src/cgeo/geocaching/CacheDetailActivity.java | 732 |
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(); + } + } } |
