aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--main/AndroidManifest.xml2
-rw-r--r--main/res/layout/caches_images.xml15
-rw-r--r--main/res/layout/spoilers.xml39
-rw-r--r--main/res/values-de/strings.xml3
-rw-r--r--main/res/values/strings.xml5
-rw-r--r--main/src/cgeo/geocaching/CacheDetailActivity.java128
-rw-r--r--main/src/cgeo/geocaching/ImagesActivity.java115
-rw-r--r--main/src/cgeo/geocaching/cgCache.java20
-rw-r--r--main/src/cgeo/geocaching/cgData.java9
-rw-r--r--main/src/cgeo/geocaching/cgImage.java13
-rw-r--r--main/src/cgeo/geocaching/cgeotrackable.java2
-rw-r--r--main/src/cgeo/geocaching/ui/ImagesList.java (renamed from main/src/cgeo/geocaching/cgeoimages.java)230
12 files changed, 379 insertions, 202 deletions
diff --git a/main/AndroidManifest.xml b/main/AndroidManifest.xml
index e866138..749443a 100644
--- a/main/AndroidManifest.xml
+++ b/main/AndroidManifest.xml
@@ -154,7 +154,7 @@
android:configChanges="keyboardHidden|orientation" >
</activity>
<activity
- android:name=".cgeoimages"
+ android:name=".ImagesActivity"
android:label="@string/app_name"
android:configChanges="keyboardHidden|orientation" >
</activity>
diff --git a/main/res/layout/caches_images.xml b/main/res/layout/caches_images.xml
new file mode 100644
index 0000000..2360dd0
--- /dev/null
+++ b/main/res/layout/caches_images.xml
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="utf-8"?>
+<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="fill_parent"
+ android:layout_height="fill_parent"
+ android:orientation="vertical"
+ android:padding="4dip" >
+
+ <LinearLayout
+ android:id="@+id/spoiler_list"
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content"
+ android:orientation="vertical" >
+ </LinearLayout>
+
+</ScrollView> \ No newline at end of file
diff --git a/main/res/layout/spoilers.xml b/main/res/layout/spoilers.xml
index ef6bb39..233972a 100644
--- a/main/res/layout/spoilers.xml
+++ b/main/res/layout/spoilers.xml
@@ -1,24 +1,21 @@
<?xml version="1.0" encoding="UTF-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent"
- android:orientation="vertical"
- android:background="?background_color" >
- <LinearLayout style="@style/action_bar">
- <ImageView style="@style/action_bar_action"
- android:onClick="goHome" />
- <View style="@style/action_bar_separator" />
- <TextView style="@style/action_bar_title" />
- </LinearLayout>
- <ScrollView
- android:layout_width="fill_parent"
- android:layout_height="fill_parent"
- android:padding="4dip"
- android:orientation="vertical" >
- <LinearLayout android:id="@+id/spoiler_list"
- android:layout_width="fill_parent"
- android:layout_height="wrap_content"
- android:orientation="vertical" >
- </LinearLayout>
- </ScrollView>
+ android:layout_width="fill_parent"
+ android:layout_height="fill_parent"
+ android:background="?background_color"
+ android:orientation="vertical" >
+
+ <LinearLayout style="@style/action_bar" >
+
+ <ImageView
+ style="@style/action_bar_action"
+ android:onClick="goHome" />
+
+ <View style="@style/action_bar_separator" />
+
+ <TextView style="@style/action_bar_title" />
+ </LinearLayout>
+
+ <include layout="@layout/caches_images" />
+
</LinearLayout> \ No newline at end of file
diff --git a/main/res/values-de/strings.xml b/main/res/values-de/strings.xml
index 9501763..ffa5fa7 100644
--- a/main/res/values-de/strings.xml
+++ b/main/res/values-de/strings.xml
@@ -527,7 +527,8 @@
<string name="cache_favpoint_not_on">Dieser Cache ist kein Favorit.</string>
<string name="cache_favpoint_add">Hinzufügen</string>
<string name="cache_favpoint_remove">Entfernen</string>
-
+ <string name="cache_images">Bilder</string>
+
<string name="cache_waypoints">Wegpunkte</string>
<plurals name="waypoints">
<item quantity="one">1 Wegpunkt</item>
diff --git a/main/res/values/strings.xml b/main/res/values/strings.xml
index 64ffe97..45c09de 100644
--- a/main/res/values/strings.xml
+++ b/main/res/values/strings.xml
@@ -537,7 +537,8 @@
<string name="cache_favpoint_not_on">This cache is not one of your favorites.</string>
<string name="cache_favpoint_add">Add</string>
<string name="cache_favpoint_remove">Remove</string>
-
+ <string name="cache_images">Images</string>
+
<string name="cache_waypoints">Waypoints</string>
<plurals name="waypoints">
<item quantity="one">1 Waypoint</item>
@@ -614,6 +615,8 @@
<string name="cache_coordinates_original">Original Coordinates</string>
<string name="cache_spoiler_images_title">Spoiler images</string>
<string name="cache_spoiler_images_loading">Loading spoiler images…</string>
+ <string name="cache_images_title">Images</string>
+ <string name="cache_images_loading">Loading images…</string>
<string name="cache_log_types">Log types</string>
<string name="cache_coordinates_no">This cache has no coordinates.</string>
<string name="cache_export_fieldnote">Export as Field Notes</string>
diff --git a/main/src/cgeo/geocaching/CacheDetailActivity.java b/main/src/cgeo/geocaching/CacheDetailActivity.java
index 60b5bec..63e59bb 100644
--- a/main/src/cgeo/geocaching/CacheDetailActivity.java
+++ b/main/src/cgeo/geocaching/CacheDetailActivity.java
@@ -20,6 +20,8 @@ import cgeo.geocaching.ui.CacheDetailsCreator;
import cgeo.geocaching.ui.DecryptTextClickListener;
import cgeo.geocaching.ui.EditorDialog;
import cgeo.geocaching.ui.Formatter;
+import cgeo.geocaching.ui.ImagesList;
+import cgeo.geocaching.ui.ImagesList.ImageType;
import cgeo.geocaching.ui.LoggingUI;
import cgeo.geocaching.utils.BaseUtils;
import cgeo.geocaching.utils.CancellableHandler;
@@ -110,6 +112,7 @@ import java.util.regex.Pattern;
*/
public class CacheDetailActivity extends AbstractActivity {
+ private static final String EXTRAS_PAGE = "page";
private static final int MENU_FIELD_COPY = 1;
private static final int MENU_FIELD_TRANSLATE = 2;
private static final int MENU_FIELD_TRANSLATE_EN = 3;
@@ -206,6 +209,7 @@ public class CacheDetailActivity extends AbstractActivity {
notifyDataSetChanged();
}
};
+ protected ImagesList imagesList;
public CacheDetailActivity() {
// identifier for manual
@@ -325,6 +329,10 @@ public class CacheDetailActivity extends AbstractActivity {
if (Settings.isOpenLastDetailsPage()) {
Settings.setLastDetailsPage(position);
}
+ // lazy loading of cache images
+ if (pageOrder.get(position) == Page.IMAGES) {
+ loadCacheImages();
+ }
}
@Override
@@ -338,17 +346,16 @@ public class CacheDetailActivity extends AbstractActivity {
// switch to entry page (last used or 2)
int entryPageIndex;
- if (extras != null && extras.get("page") != null) {
- entryPageIndex = extras.getInt("page");
+ if (extras != null && extras.get(EXTRAS_PAGE) != null) {
+ entryPageIndex = extras.getInt(EXTRAS_PAGE);
}
- else
- {
+ else {
entryPageIndex = Settings.isOpenLastDetailsPage() ? Settings.getLastDetailsPage() : 1;
- if (viewPagerAdapter.getCount() < entryPageIndex) {
- for (int i = 0; i <= entryPageIndex; i++) {
- // we can't switch to a page that is out of bounds, so we add null-pages
- pageOrder.add(null);
- }
+ }
+ if (viewPagerAdapter.getCount() < entryPageIndex) {
+ for (int i = 0; i <= entryPageIndex; i++) {
+ // we can't switch to a page that is out of bounds, so we add null-pages
+ pageOrder.add(null);
}
}
viewPager.setCurrentItem(entryPageIndex, false);
@@ -399,7 +406,7 @@ public class CacheDetailActivity extends AbstractActivity {
case R.id.longdesc:
// combine short and long description
String shortDesc = cache.getShortDescription();
- if (shortDesc.compareTo("") == 0) {
+ if (StringUtils.isBlank(shortDesc)) {
clickedItemText = ((TextView) view).getText();
} else {
clickedItemText = shortDesc + "\n\n" + ((TextView) view).getText();
@@ -448,6 +455,9 @@ public class CacheDetailActivity extends AbstractActivity {
}
break;
default:
+ if (imagesList != null) {
+ imagesList.onCreateContextMenu(menu, view);
+ }
break;
}
}
@@ -542,8 +552,13 @@ public class CacheDetailActivity extends AbstractActivity {
}
}
break;
- default:
+ default: {
+ if (imagesList != null && imagesList.onContextItemSelected(item)) {
+ return true;
+ }
+
return onOptionsItemSelected(item);
+ }
}
return false;
}
@@ -678,9 +693,9 @@ public class CacheDetailActivity extends AbstractActivity {
creator.notifyDataSetChanged();
}
- // action bar: title and icon (default: mystery-icon)
+ // action bar: title and icon (default: mystery icon)
if (StringUtils.isNotBlank(cache.getName())) {
- setTitle(cache.getName() + " (" + cache.getGeocode().toUpperCase() + ")");
+ setTitle(cache.getName() + " (" + cache.getGeocode().toUpperCase() + ')');
} else {
setTitle(cache.getGeocode().toUpperCase());
}
@@ -691,6 +706,7 @@ public class CacheDetailActivity extends AbstractActivity {
pageOrder.add(Page.WAYPOINTS);
pageOrder.add(Page.DETAILS);
+ final int detailsIndex = pageOrder.size() - 1;
pageOrder.add(Page.DESCRIPTION);
if (CollectionUtils.isNotEmpty(cache.getLogs(true))) {
pageOrder.add(Page.LOGS);
@@ -701,10 +717,13 @@ public class CacheDetailActivity extends AbstractActivity {
if (CollectionUtils.isNotEmpty(cache.getInventory())) {
pageOrder.add(Page.INVENTORY);
}
+ if (CollectionUtils.isNotEmpty(cache.getImages())) {
+ pageOrder.add(Page.IMAGES);
+ }
- // switch to page 2 (index 1) if we're out of bounds
+ // switch to details page, if we're out of bounds
if (viewPager.getCurrentItem() < 0 || viewPager.getCurrentItem() >= viewPagerAdapter.getCount()) {
- viewPager.setCurrentItem(1, false);
+ viewPager.setCurrentItem(detailsIndex, false);
}
// notify the adapter that the data has changed
@@ -713,7 +732,7 @@ public class CacheDetailActivity extends AbstractActivity {
// notify the indicator that the data has changed
titleIndicator.notifyDataSetChanged();
- // rendering done! remove progress-popup if any there
+ // rendering done! remove progress popup if any there
progress.dismiss();
}
@@ -771,9 +790,9 @@ public class CacheDetailActivity extends AbstractActivity {
} else {
intent = new Intent(action, uri);
}
- List<ResolveInfo> list = packageManager.queryIntentActivities(intent,
+ final List<ResolveInfo> list = packageManager.queryIntentActivities(intent,
PackageManager.MATCH_DEFAULT_ONLY);
- return list.size() > 0;
+ return !list.isEmpty();
}
private void addToCalendarWithIntent() {
@@ -925,6 +944,22 @@ public class CacheDetailActivity extends AbstractActivity {
alert.show();
}
+ private void loadCacheImages() {
+ if (imagesList != null) {
+ return;
+ }
+ PageViewCreator creator = viewCreators.get(Page.IMAGES);
+ if (creator == null) {
+ return;
+ }
+ View imageView = creator.getView();
+ if (imageView == null) {
+ return;
+ }
+ imagesList = new ImagesList(CacheDetailActivity.this, cache.getGeocode());
+ imagesList.loadImages(imageView, cache.getImages(), ImageType.AllImages, false);
+ }
+
public static void startActivity(final Context context, final String geocode) {
final Intent detailIntent = new Intent(context, CacheDetailActivity.class);
detailIntent.putExtra("geocode", geocode.toUpperCase());
@@ -934,7 +969,7 @@ public class CacheDetailActivity extends AbstractActivity {
public static void startActivity(final Context context, final String geocode, final int page) {
final Intent detailIntent = new Intent(context, CacheDetailActivity.class);
detailIntent.putExtra("geocode", geocode.toUpperCase());
- detailIntent.putExtra("page", page);
+ detailIntent.putExtra(EXTRAS_PAGE, page);
context.startActivity(detailIntent);
}
@@ -989,6 +1024,10 @@ public class CacheDetailActivity extends AbstractActivity {
case INVENTORY:
creator = new InventoryViewCreator();
break;
+
+ case IMAGES:
+ creator = new ImagesViewCreator();
+ break;
}
viewCreators.put(page, creator);
}
@@ -1011,7 +1050,7 @@ public class CacheDetailActivity extends AbstractActivity {
@Override
public boolean isViewFromObject(View view, Object object) {
- return (view == object);
+ return view == object;
}
@Override
@@ -1058,7 +1097,8 @@ public class CacheDetailActivity extends AbstractActivity {
LOGS(R.string.cache_logs),
LOGSFRIENDS(R.string.cache_logsfriends),
WAYPOINTS(R.string.cache_waypoints),
- INVENTORY(R.string.cache_inventory);
+ INVENTORY(R.string.cache_inventory),
+ IMAGES(R.string.cache_images);
final private int titleStringId;
@@ -1845,7 +1885,7 @@ public class CacheDetailActivity extends AbstractActivity {
private class DescriptionViewCreator implements PageViewCreator {
- ScrollView view;
+ private ScrollView view;
@Override
public void notifyDataSetChanged() {
@@ -1953,7 +1993,7 @@ public class CacheDetailActivity extends AbstractActivity {
return;
}
- cgeoimages.startActivitySpoilerImages(CacheDetailActivity.this, cache.getGeocode(), cache.getSpoilers());
+ ImagesActivity.startActivitySpoilerImages(CacheDetailActivity.this, cache.getGeocode(), cache.getSpoilers());
}
});
} else {
@@ -2099,8 +2139,8 @@ public class CacheDetailActivity extends AbstractActivity {
}
private class LogsViewCreator implements PageViewCreator {
- ListView view;
- boolean allLogs;
+ private ListView view;
+ private boolean allLogs;
LogsViewCreator(boolean allLogs) {
super();
@@ -2215,7 +2255,7 @@ public class CacheDetailActivity extends AbstractActivity {
holder.images.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
- cgeoimages.startActivityLogImages(CacheDetailActivity.this, cache.getGeocode(), new ArrayList<cgImage>(log.getLogImages()));
+ ImagesActivity.startActivityLogImages(CacheDetailActivity.this, cache.getGeocode(), new ArrayList<cgImage>(log.getLogImages()));
}
});
} else {
@@ -2281,7 +2321,7 @@ public class CacheDetailActivity extends AbstractActivity {
private class WaypointsViewCreator implements PageViewCreator {
- ScrollView view;
+ private ScrollView view;
@Override
public void notifyDataSetChanged() {
@@ -2396,7 +2436,7 @@ public class CacheDetailActivity extends AbstractActivity {
private class InventoryViewCreator implements PageViewCreator {
- ListView view;
+ private ListView view;
@Override
public void notifyDataSetChanged() {
@@ -2439,6 +2479,38 @@ public class CacheDetailActivity extends AbstractActivity {
}
}
+ private class ImagesViewCreator implements PageViewCreator {
+
+ private View view;
+
+ @Override
+ public void notifyDataSetChanged() {
+ view = null;
+ }
+
+ @Override
+ public View getView() {
+ if (view == null) {
+ view = getDispatchedView();
+ }
+
+ return view;
+ }
+
+ @Override
+ public View getDispatchedView() {
+ if (cache == null) {
+ return null; // something is really wrong
+ }
+
+ view = getLayoutInflater().inflate(R.layout.caches_images, null);
+ if (imagesList == null && viewPager.getCurrentItem() == pageOrder.indexOf(Page.IMAGES)) {
+ loadCacheImages();
+ }
+ return view;
+ }
+ }
+
public static void startActivity(final Context context, final String geocode, final String cacheName) {
final Intent cachesIntent = new Intent(context, CacheDetailActivity.class);
cachesIntent.putExtra("geocode", geocode);
diff --git a/main/src/cgeo/geocaching/ImagesActivity.java b/main/src/cgeo/geocaching/ImagesActivity.java
new file mode 100644
index 0000000..0accf12
--- /dev/null
+++ b/main/src/cgeo/geocaching/ImagesActivity.java
@@ -0,0 +1,115 @@
+package cgeo.geocaching;
+
+import cgeo.geocaching.activity.AbstractActivity;
+import cgeo.geocaching.ui.ImagesList;
+import cgeo.geocaching.ui.ImagesList.ImageType;
+
+import org.apache.commons.collections.CollectionUtils;
+
+import android.content.Context;
+import android.content.Intent;
+import android.os.Bundle;
+import android.view.ContextMenu;
+import android.view.ContextMenu.ContextMenuInfo;
+import android.view.MenuItem;
+import android.view.View;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class ImagesActivity extends AbstractActivity {
+
+ private static final String EXTRAS_IMAGES = "images";
+ private static final String EXTRAS_TYPE = "type";
+ private static final String EXTRAS_GEOCODE = "geocode";
+
+ private boolean offline;
+ private ArrayList<cgImage> imageNames;
+ private ImagesList imagesList;
+ private ImageType imgType = ImageType.SpoilerImages;
+
+
+ @Override
+ public void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+
+ // get parameters
+ final Bundle extras = getIntent().getExtras();
+
+ String geocode = null;
+ if (extras != null) {
+ geocode = extras.getString(EXTRAS_GEOCODE);
+ imgType = (ImageType) extras.getSerializable(EXTRAS_TYPE);
+ }
+
+ if (extras == null || geocode == null) {
+ showToast("Sorry, c:geo forgot for what cache you want to load spoiler images.");
+ finish();
+ return;
+ }
+
+ // init
+ setTheme();
+ setContentView(R.layout.spoilers);
+ setTitle(res.getString(imgType.getTitle()));
+
+ imagesList = new ImagesList(this, geocode);
+
+ imageNames = extras.getParcelableArrayList(EXTRAS_IMAGES);
+ if (CollectionUtils.isEmpty(imageNames)) {
+ showToast(res.getString(R.string.warn_load_images));
+ finish();
+ return;
+ }
+
+ offline = app.isOffline(geocode, null) && (imgType == ImageType.SpoilerImages || Settings.isStoreLogImages());
+ }
+
+ @Override
+ public void onStart() {
+ super.onStart();
+ imagesList.loadImages(findViewById(R.id.spoiler_list), imageNames, imgType, offline);
+ }
+
+ @Override
+ public void onStop() {
+ // Reclaim native memory faster than the finalizers would
+ imagesList.removeAllViews();
+ super.onStop();
+ }
+
+ public static void startActivityLogImages(final Context fromActivity, final String geocode, List<cgImage> logImages) {
+ startActivity(fromActivity, geocode, logImages, ImageType.LogImages);
+ }
+
+ private static void startActivity(final Context fromActivity, final String geocode, List<cgImage> logImages, ImageType imageType) {
+ final Intent logImgIntent = new Intent(fromActivity, ImagesActivity.class);
+ // if resuming our app within this activity, finish it and return to the cache activity
+ logImgIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET)
+ .putExtra(EXTRAS_GEOCODE, geocode.toUpperCase())
+ .putExtra(EXTRAS_TYPE, imageType);
+
+ // avoid forcing the array list as parameter type
+ final ArrayList<cgImage> arrayList = new ArrayList<cgImage>(logImages);
+ logImgIntent.putParcelableArrayListExtra(EXTRAS_IMAGES, arrayList);
+ fromActivity.startActivity(logImgIntent);
+ }
+
+ public static void startActivitySpoilerImages(final Context fromActivity, String geocode, List<cgImage> spoilers) {
+ startActivity(fromActivity, geocode, spoilers, ImageType.SpoilerImages);
+ }
+
+ @Override
+ public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) {
+ super.onCreateContextMenu(menu, v, menuInfo);
+ imagesList.onCreateContextMenu(menu, v);
+ }
+
+ @Override
+ public boolean onContextItemSelected(MenuItem item) {
+ if (imagesList.onContextItemSelected(item)) {
+ return true;
+ }
+ return super.onContextItemSelected(item);
+ }
+}
diff --git a/main/src/cgeo/geocaching/cgCache.java b/main/src/cgeo/geocaching/cgCache.java
index 43adc61..3ea49e9 100644
--- a/main/src/cgeo/geocaching/cgCache.java
+++ b/main/src/cgeo/geocaching/cgCache.java
@@ -96,7 +96,7 @@ public class cgCache implements ICache, IWaypoint {
private boolean onWatchlist = false;
private List<String> attributes = null;
private List<cgWaypoint> waypoints = null;
- private ArrayList<cgImage> spoilers = null;
+ private List<cgImage> spoilers = null;
private List<LogEntry> logs = null;
private List<cgTrackable> inventory = null;
private Map<LogType, Integer> logCounts = new HashMap<LogType, Integer>();
@@ -686,8 +686,11 @@ public class cgCache implements ICache, IWaypoint {
}
@Override
- public ArrayList<cgImage> getSpoilers() {
- return spoilers;
+ public List<cgImage> getSpoilers() {
+ if (spoilers == null) {
+ return Collections.emptyList();
+ }
+ return Collections.unmodifiableList(spoilers);
}
@Override
@@ -1049,7 +1052,7 @@ public class cgCache implements ICache, IWaypoint {
this.attributes = attributes;
}
- public void setSpoilers(ArrayList<cgImage> spoilers) {
+ public void setSpoilers(List<cgImage> spoilers) {
this.spoilers = spoilers;
}
@@ -1615,4 +1618,13 @@ public class cgCache implements ICache, IWaypoint {
public boolean hasStaticMap() {
return StaticMapsProvider.hasStaticMap(this);
}
+
+ public List<cgImage> getImages() {
+ List<cgImage> result = new ArrayList<cgImage>();
+ result.addAll(getSpoilers());
+ for (LogEntry log : getLogs()) {
+ result.addAll(log.getLogImages());
+ }
+ return result;
+ }
} \ No newline at end of file
diff --git a/main/src/cgeo/geocaching/cgData.java b/main/src/cgeo/geocaching/cgData.java
index 30ca5f7..491f8ad 100644
--- a/main/src/cgeo/geocaching/cgData.java
+++ b/main/src/cgeo/geocaching/cgData.java
@@ -1513,14 +1513,7 @@ public class cgData {
if (loadFlags.contains(LoadFlag.LOAD_SPOILERS)) {
final List<cgImage> spoilers = loadSpoilers(cache.getGeocode());
- if (CollectionUtils.isNotEmpty(spoilers)) {
- if (cache.getSpoilers() == null) {
- cache.setSpoilers(new ArrayList<cgImage>());
- } else {
- cache.getSpoilers().clear();
- }
- cache.getSpoilers().addAll(spoilers);
- }
+ cache.setSpoilers(spoilers);
}
if (loadFlags.contains(LoadFlag.LOAD_LOGS)) {
diff --git a/main/src/cgeo/geocaching/cgImage.java b/main/src/cgeo/geocaching/cgImage.java
index 0b6f4b9..b313ef5 100644
--- a/main/src/cgeo/geocaching/cgImage.java
+++ b/main/src/cgeo/geocaching/cgImage.java
@@ -72,4 +72,17 @@ public class cgImage implements Parcelable {
final Intent browserIntent = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
fromActivity.startActivity(browserIntent);
}
+
+ @Override
+ public String toString() {
+ if (null != title) {
+ return title;
+ }
+
+ if (url != null) {
+ return url;
+ }
+
+ return "???";
+ }
}
diff --git a/main/src/cgeo/geocaching/cgeotrackable.java b/main/src/cgeo/geocaching/cgeotrackable.java
index 0052cad..ccc09a4 100644
--- a/main/src/cgeo/geocaching/cgeotrackable.java
+++ b/main/src/cgeo/geocaching/cgeotrackable.java
@@ -479,7 +479,7 @@ public class cgeotrackable extends AbstractActivity {
final View.OnClickListener listener = new View.OnClickListener() {
@Override
public void onClick(View v) {
- cgeoimages.startActivityLogImages(cgeotrackable.this, trackable.getGeocode(), logImages);
+ ImagesActivity.startActivityLogImages(cgeotrackable.this, trackable.getGeocode(), logImages);
}
};
diff --git a/main/src/cgeo/geocaching/cgeoimages.java b/main/src/cgeo/geocaching/ui/ImagesList.java
index 6de6444..3d6f95c 100644
--- a/main/src/cgeo/geocaching/cgeoimages.java
+++ b/main/src/cgeo/geocaching/ui/ImagesList.java
@@ -1,27 +1,28 @@
-package cgeo.geocaching;
+package cgeo.geocaching.ui;
-import cgeo.geocaching.activity.AbstractActivity;
+import cgeo.geocaching.R;
+import cgeo.geocaching.StoredList;
+import cgeo.geocaching.cgImage;
import cgeo.geocaching.files.LocalStorage;
import cgeo.geocaching.network.HtmlImage;
import cgeo.geocaching.utils.Log;
-import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
+import org.mapsforge.core.IOUtils;
+import android.app.Activity;
import android.app.ProgressDialog;
-import android.content.Context;
import android.content.Intent;
+import android.content.res.Resources;
import android.graphics.Bitmap;
import android.graphics.Bitmap.CompressFormat;
import android.graphics.Rect;
import android.graphics.drawable.BitmapDrawable;
import android.net.Uri;
import android.os.AsyncTask;
-import android.os.Bundle;
import android.text.Html;
import android.util.SparseArray;
import android.view.ContextMenu;
-import android.view.ContextMenu.ContextMenuInfo;
import android.view.LayoutInflater;
import android.view.MenuItem;
import android.view.View;
@@ -32,41 +33,64 @@ import android.widget.TextView;
import java.io.File;
import java.io.FileOutputStream;
-import java.util.ArrayList;
import java.util.Collection;
import java.util.LinkedList;
import java.util.List;
-public class cgeoimages extends AbstractActivity {
+public class ImagesList {
- private static final int MENU_BROWSER = 2;
- private static final int MENU_FILE = 1;
- private static final int UNKNOWN_TYPE = 0;
- private static final int LOG_IMAGES = 1;
- private static final int SPOILER_IMAGES = 2;
+ private static final int MENU_FILE = 201;
+ private static final int MENU_BROWSER = 202;
+
+ private BitmapDrawable currentDrawable;
+ private cgImage currentImage;
+
+ public enum ImageType {
+ LogImages(R.string.cache_log_images_title, R.string.cache_log_images_loading),
+ SpoilerImages(R.string.cache_spoiler_images_title, R.string.cache_spoiler_images_loading),
+ AllImages(R.string.cache_images_title, R.string.cache_images_loading);
+
+ private final int titleResId;
+ private final int loadingResId;
+
+ private ImageType(final int title, final int loading) {
+ this.titleResId = title;
+ this.loadingResId = loading;
+ }
+
+ public int getTitle() {
+ return titleResId;
+ }
+ }
- private String geocode = null;
private LayoutInflater inflater = null;
private ProgressDialog progressDialog = null;
- private LinearLayout imagesView = null;
private int count = 0;
private int countDone = 0;
- private final SparseArray<cgImage> images = new SparseArray<cgImage>();
- private BitmapDrawable currentDrawable;
- private cgImage currentImage;
-
+ private final Activity activity;
// We could use a Set here, but we will insert no duplicates, so there is no need to check for uniqueness.
private final Collection<Bitmap> bitmaps = new LinkedList<Bitmap>();
- private int message;
- private boolean offline;
- private ArrayList<cgImage> imageNames;
+ /**
+ * map image view id to image
+ */
+ private final SparseArray<cgImage> images = new SparseArray<cgImage>();
+ private final String geocode;
+ private LinearLayout imagesView;
- private void loadImages(final List<cgImage> images, final int progressMessage, final boolean offline) {
+ public ImagesList(final Activity activity, final String geocode) {
+ this.activity = activity;
+ this.geocode = geocode;
+ inflater = activity.getLayoutInflater();
+ }
+
+ public void loadImages(final View parentView, final List<cgImage> images, ImageType imageType, final boolean offline) {
+
+ imagesView = (LinearLayout) parentView.findViewById(R.id.spoiler_list);
count = images.size();
- progressDialog = new ProgressDialog(this);
+ progressDialog = new ProgressDialog(activity);
progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
- progressDialog.setMessage(res.getString(progressMessage));
+ progressDialog.setMessage(activity.getString(imageType.loadingResId));
progressDialog.setCancelable(true);
progressDialog.setMax(count);
progressDialog.show();
@@ -105,7 +129,7 @@ public class cgeoimages extends AbstractActivity {
@Override
protected BitmapDrawable doInBackground(Void... params) {
- final HtmlImage imgGetter = new HtmlImage(geocode, true, offline ? 1 : 0, false);
+ final HtmlImage imgGetter = new HtmlImage(geocode, true, offline ? StoredList.STANDARD_LIST_ID : StoredList.TEMPORARY_LIST_ID, false);
return imgGetter.getDrawable(img.getUrl());
}
@@ -113,31 +137,31 @@ public class cgeoimages extends AbstractActivity {
protected void onPostExecute(final BitmapDrawable image) {
if (image != null) {
bitmaps.add(image.getBitmap());
- final ImageView image_view = (ImageView) inflater.inflate(R.layout.image_item, null);
+ final ImageView imageView = (ImageView) inflater.inflate(R.layout.image_item, null);
final Rect bounds = image.getBounds();
- image_view.setImageResource(R.drawable.image_not_loaded);
- image_view.setClickable(true);
- image_view.setOnClickListener(new View.OnClickListener() {
+ imageView.setImageResource(R.drawable.image_not_loaded);
+ imageView.setClickable(true);
+ imageView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View arg0) {
viewImageInStandardApp(image);
}
});
- cgeoimages.this.registerForContextMenu(image_view);
- image_view.setImageDrawable(image);
- image_view.setScaleType(ImageView.ScaleType.CENTER_CROP);
- image_view.setLayoutParams(new LayoutParams(bounds.width(), bounds.height()));
+ activity.registerForContextMenu(imageView);
+ imageView.setImageDrawable(image);
+ imageView.setScaleType(ImageView.ScaleType.CENTER_CROP);
+ imageView.setLayoutParams(new LayoutParams(bounds.width(), bounds.height()));
- view.addView(image_view);
+ view.addView(imageView);
- image_view.setId(image.hashCode());
- images.put(image_view.getId(), img);
+ imageView.setId(image.hashCode());
+ images.put(imageView.getId(), img);
}
- synchronized (cgeoimages.this) {
+ synchronized (activity) {
countDone++;
progressDialog.setProgress(countDone);
if (progressDialog.getProgress() >= count) {
@@ -147,110 +171,20 @@ public class cgeoimages extends AbstractActivity {
}
}
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
-
- // get parameters
- final Bundle extras = getIntent().getExtras();
-
- // try to get data from extras
- int img_type = UNKNOWN_TYPE;
- if (extras != null) {
- geocode = extras.getString("geocode");
- img_type = extras.getInt("type", 0);
- }
-
- if (extras == null || geocode == null) {
- showToast("Sorry, c:geo forgot for what cache you want to load spoiler images.");
- finish();
- return;
- }
-
- if (img_type != SPOILER_IMAGES && img_type != LOG_IMAGES) {
- showToast("Sorry, can't load unknown image type.");
- finish();
- return;
- }
-
- // init
- setTheme();
- setContentView(R.layout.spoilers);
- setTitle(res.getString(img_type == SPOILER_IMAGES ? R.string.cache_spoiler_images_title : R.string.cache_log_images_title));
-
- inflater = getLayoutInflater();
- imagesView = (LinearLayout) findViewById(R.id.spoiler_list);
-
- imageNames = extras.getParcelableArrayList("images");
- if (CollectionUtils.isEmpty(imageNames)) {
- showToast(res.getString(R.string.warn_load_images));
- finish();
- return;
- }
-
- message = img_type == SPOILER_IMAGES ? R.string.cache_spoiler_images_loading : R.string.cache_log_images_loading;
- offline = app.isOffline(geocode, null) && (img_type == SPOILER_IMAGES || Settings.isStoreLogImages());
- }
-
- @Override
- public void onStart() {
- super.onStart();
- loadImages(imageNames, message, offline);
- }
-
- @Override
- public void onStop() {
- // Reclaim native memory faster than the finalizers would
+ public void removeAllViews() {
imagesView.removeAllViews();
for (final Bitmap b : bitmaps) {
b.recycle();
}
bitmaps.clear();
- super.onStop();
- }
-
- private void viewImageInStandardApp(final BitmapDrawable image) {
- final File file = LocalStorage.getStorageFile(null, "temp.jpg", false, true);
- try {
- final FileOutputStream fos = new FileOutputStream(file);
- image.getBitmap().compress(CompressFormat.JPEG, 100, fos);
- fos.close();
- } catch (Exception e) {
- Log.e("cgeoimages.handleMessage.onClick: " + e.toString());
- return;
- }
-
- final Intent intent = new Intent();
- intent.setAction(android.content.Intent.ACTION_VIEW);
- intent.setDataAndType(Uri.fromFile(file), "image/jpeg");
- startActivity(intent);
-
- if (file.exists()) {
- file.deleteOnExit();
- }
- }
-
- public static void startActivityLogImages(final Context fromActivity, final String geocode, ArrayList<cgImage> logImages) {
- startActivity(fromActivity, geocode, logImages, cgeoimages.LOG_IMAGES);
- }
-
- private static void startActivity(final Context fromActivity, final String geocode, ArrayList<cgImage> logImages, int imageType) {
- final Intent logImgIntent = new Intent(fromActivity, cgeoimages.class);
- // if resuming our app within this activity, finish it and return to the cache activity
- logImgIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET);
- logImgIntent.putExtra("geocode", geocode.toUpperCase());
- logImgIntent.putExtra("type", imageType);
- logImgIntent.putParcelableArrayListExtra("images", logImages);
- fromActivity.startActivity(logImgIntent);
}
- public static void startActivitySpoilerImages(final Context fromActivity, String geocode, ArrayList<cgImage> spoilers) {
- startActivity(fromActivity, geocode, spoilers, cgeoimages.SPOILER_IMAGES);
+ public cgImage getImage(int id) {
+ return images.get(id);
}
- @Override
- public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) {
- super.onCreateContextMenu(menu, v, menuInfo);
+ public void onCreateContextMenu(ContextMenu menu, View v) {
+ final Resources res = activity.getResources();
menu.setHeaderTitle(res.getString(R.string.cache_image));
menu.add(0, MENU_FILE, 0, res.getString(R.string.cache_image_open_file));
menu.add(0, MENU_BROWSER, 0, res.getString(R.string.cache_image_open_browser));
@@ -259,7 +193,6 @@ public class cgeoimages extends AbstractActivity {
currentImage = images.get(view.getId());
}
- @Override
public boolean onContextItemSelected(MenuItem item) {
switch (item.getItemId()) {
case MENU_FILE:
@@ -267,12 +200,35 @@ public class cgeoimages extends AbstractActivity {
return true;
case MENU_BROWSER:
if (currentImage != null) {
- currentImage.openInBrowser(this);
+ currentImage.openInBrowser(activity);
}
return true;
default:
- break;
+ return false;
}
- return super.onContextItemSelected(item);
}
+
+ private void viewImageInStandardApp(final BitmapDrawable image) {
+ final File file = LocalStorage.getStorageFile(null, "temp.jpg", false, true);
+ FileOutputStream fos = null;
+ try {
+ fos = new FileOutputStream(file);
+ image.getBitmap().compress(CompressFormat.JPEG, 100, fos);
+ } catch (Exception e) {
+ Log.e("ImagesActivity.handleMessage.onClick: " + e.toString());
+ return;
+ } finally {
+ IOUtils.closeQuietly(fos);
+ }
+
+ final Intent intent = new Intent();
+ intent.setAction(android.content.Intent.ACTION_VIEW);
+ intent.setDataAndType(Uri.fromFile(file), "image/jpeg");
+ activity.startActivity(intent);
+
+ if (file.exists()) {
+ file.deleteOnExit();
+ }
+ }
+
}