diff options
Diffstat (limited to 'main/src')
| -rw-r--r-- | main/src/cgeo/geocaching/CacheDetailActivity.java | 128 | ||||
| -rw-r--r-- | main/src/cgeo/geocaching/ImagesActivity.java | 115 | ||||
| -rw-r--r-- | main/src/cgeo/geocaching/cgCache.java | 20 | ||||
| -rw-r--r-- | main/src/cgeo/geocaching/cgData.java | 9 | ||||
| -rw-r--r-- | main/src/cgeo/geocaching/cgImage.java | 13 | ||||
| -rw-r--r-- | main/src/cgeo/geocaching/cgeotrackable.java | 2 | ||||
| -rw-r--r-- | main/src/cgeo/geocaching/ui/ImagesList.java (renamed from main/src/cgeo/geocaching/cgeoimages.java) | 230 |
7 files changed, 339 insertions, 178 deletions
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(); + } + } + } |
