aboutsummaryrefslogtreecommitdiffstats
path: root/main/src/cgeo/geocaching/TrackableActivity.java
diff options
context:
space:
mode:
Diffstat (limited to 'main/src/cgeo/geocaching/TrackableActivity.java')
-rw-r--r--main/src/cgeo/geocaching/TrackableActivity.java89
1 files changed, 55 insertions, 34 deletions
diff --git a/main/src/cgeo/geocaching/TrackableActivity.java b/main/src/cgeo/geocaching/TrackableActivity.java
index dcfd80a..855eb4d 100644
--- a/main/src/cgeo/geocaching/TrackableActivity.java
+++ b/main/src/cgeo/geocaching/TrackableActivity.java
@@ -25,6 +25,9 @@ import cgeo.geocaching.utils.UnknownTagsHandler;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.tuple.ImmutablePair;
import org.apache.commons.lang3.tuple.Pair;
+import rx.android.observables.AndroidObservable;
+import rx.android.observables.ViewObservable;
+import rx.functions.Action1;
import android.app.ProgressDialog;
import android.content.Intent;
@@ -34,6 +37,7 @@ import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.text.Html;
+import android.view.ContextMenu;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
@@ -109,6 +113,8 @@ public class TrackableActivity extends AbstractViewPagerActivity<TrackableActivi
}
};
+ private CharSequence clickedItemText = null;
+
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState, R.layout.viewpager_activity);
@@ -130,6 +136,8 @@ public class TrackableActivity extends AbstractViewPagerActivity<TrackableActivi
// try to get data from URI
if (geocode == null && guid == null && id == null && uri != null) {
+ geocode = ConnectorFactory.getTrackableFromURL(uri.toString());
+
final String uriHost = uri.getHost().toLowerCase(Locale.US);
if (uriHost.contains("geocaching.com")) {
geocode = uri.getQueryParameter("tracker");
@@ -190,6 +198,36 @@ public class TrackableActivity extends AbstractViewPagerActivity<TrackableActivi
}
@Override
+ public void onCreateContextMenu(ContextMenu menu, View view, ContextMenu.ContextMenuInfo info) {
+ super.onCreateContextMenu(menu, view, info);
+ final int viewId = view.getId();
+ assert view instanceof TextView;
+ clickedItemText = ((TextView) view).getText();
+ switch (viewId) {
+ case R.id.value: // name, TB-code, origin, released, distance
+ final String itemTitle = (String) ((TextView) ((View) view.getParent()).findViewById(R.id.name)).getText();
+ buildDetailsContextMenu(menu, clickedItemText, itemTitle, true);
+ break;
+ case R.id.goal:
+ buildDetailsContextMenu(menu, clickedItemText, res.getString(R.string.trackable_goal), false);
+ break;
+ case R.id.details:
+ buildDetailsContextMenu(menu, clickedItemText, res.getString(R.string.trackable_details), false);
+ break;
+ case R.id.log:
+ buildDetailsContextMenu(menu, clickedItemText, res.getString(R.string.cache_logs), false);
+ break;
+ default:
+ break;
+ }
+ }
+
+ @Override
+ public boolean onContextItemSelected(MenuItem item) {
+ return onClipboardItemSelected(item, clickedItemText) || onOptionsItemSelected(item);
+ }
+
+ @Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.trackable_activity, menu);
return true;
@@ -360,7 +398,7 @@ public class TrackableActivity extends AbstractViewPagerActivity<TrackableActivi
}
// trackable name
- details.add(R.string.trackable_name, StringUtils.isNotBlank(trackable.getName()) ? Html.fromHtml(trackable.getName()).toString() : res.getString(R.string.trackable_unknown));
+ registerForContextMenu(details.add(R.string.trackable_name, StringUtils.isNotBlank(trackable.getName()) ? Html.fromHtml(trackable.getName()).toString() : res.getString(R.string.trackable_unknown)));
// trackable type
String tbType;
@@ -372,7 +410,7 @@ public class TrackableActivity extends AbstractViewPagerActivity<TrackableActivi
details.add(R.string.trackable_type, tbType);
// trackable geocode
- details.add(R.string.trackable_code, trackable.getGeocode());
+ registerForContextMenu(details.add(R.string.trackable_code, trackable.getGeocode()));
// trackable owner
final TextView owner = details.add(R.string.trackable_owner, res.getString(R.string.trackable_unknown));
@@ -441,16 +479,17 @@ public class TrackableActivity extends AbstractViewPagerActivity<TrackableActivi
if (StringUtils.isNotBlank(trackable.getOrigin())) {
final TextView origin = details.add(R.string.trackable_origin, "");
origin.setText(Html.fromHtml(trackable.getOrigin()), TextView.BufferType.SPANNABLE);
+ registerForContextMenu(origin);
}
// trackable released
if (trackable.getReleased() != null) {
- details.add(R.string.trackable_released, Formatter.formatDate(trackable.getReleased().getTime()));
+ registerForContextMenu(details.add(R.string.trackable_released, Formatter.formatDate(trackable.getReleased().getTime())));
}
// trackable distance
if (trackable.getDistance() >= 0) {
- details.add(R.string.trackable_distance, Units.getDistanceFromKilometers(trackable.getDistance()));
+ registerForContextMenu(details.add(R.string.trackable_distance, Units.getDistanceFromKilometers(trackable.getDistance())));
}
// trackable goal
@@ -459,6 +498,7 @@ public class TrackableActivity extends AbstractViewPagerActivity<TrackableActivi
goalTextView.setVisibility(View.VISIBLE);
goalTextView.setText(Html.fromHtml(trackable.getGoal(), new HtmlImage(geocode, true, 0, false), null), TextView.BufferType.SPANNABLE);
goalTextView.setMovementMethod(AnchorAwareLinkMovementMethod.getInstance());
+ registerForContextMenu(goalTextView);
}
// trackable details
@@ -467,6 +507,7 @@ public class TrackableActivity extends AbstractViewPagerActivity<TrackableActivi
detailsTextView.setVisibility(View.VISIBLE);
detailsTextView.setText(Html.fromHtml(trackable.getDetails(), new HtmlImage(geocode, true, 0, false), new UnknownTagsHandler()), TextView.BufferType.SPANNABLE);
detailsTextView.setMovementMethod(AnchorAwareLinkMovementMethod.getInstance());
+ registerForContextMenu(detailsTextView);
}
// trackable image
@@ -476,41 +517,21 @@ public class TrackableActivity extends AbstractViewPagerActivity<TrackableActivi
trackableImage.setImageResource(R.drawable.image_not_loaded);
trackableImage.setClickable(true);
- trackableImage.setOnClickListener(new View.OnClickListener() {
-
+ ViewObservable.clicks(trackableImage, false).subscribe(new Action1<View>() {
@Override
- public void onClick(View arg0) {
+ public void call(final View view) {
startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse(trackable.getImage())));
}
});
- // try to load image
- final Handler handler = new Handler() {
-
- @Override
- public void handleMessage(Message message) {
- final BitmapDrawable image = (BitmapDrawable) message.obj;
- if (image != null) {
- trackableImage.setImageDrawable((BitmapDrawable) message.obj);
- }
- }
- };
-
- new Thread() {
-
- @Override
- public void run() {
- try {
- final HtmlImage imgGetter = new HtmlImage(geocode, true, 0, false);
-
- final BitmapDrawable image = imgGetter.getDrawable(trackable.getImage());
- final Message message = handler.obtainMessage(0, image);
- handler.sendMessage(message);
- } catch (final Exception e) {
- Log.e("TrackableActivity.DetailsViewCreator.ImageGetterThread: ", e);
- }
- }
- }.start();
+ AndroidObservable.fromActivity(TrackableActivity.this,
+ new HtmlImage(geocode, true, 0, false).fetchDrawable(trackable.getImage()))
+ .subscribe(new Action1<BitmapDrawable>() {
+ @Override
+ public void call(final BitmapDrawable bitmapDrawable) {
+ trackableImage.setImageDrawable(bitmapDrawable);
+ }
+ });
imageView.addView(trackableImage);
}