diff options
Diffstat (limited to 'main/src')
26 files changed, 361 insertions, 248 deletions
diff --git a/main/src/cgeo/geocaching/AbstractPopupActivity.java b/main/src/cgeo/geocaching/AbstractPopupActivity.java index f3b0596..588ba2a 100644 --- a/main/src/cgeo/geocaching/AbstractPopupActivity.java +++ b/main/src/cgeo/geocaching/AbstractPopupActivity.java @@ -2,9 +2,7 @@ package cgeo.geocaching; import cgeo.geocaching.activity.AbstractActivity; import cgeo.geocaching.apps.cache.navi.NavigationAppFactory; -import cgeo.geocaching.connector.gc.GCMap; import cgeo.geocaching.enumerations.CacheSize; -import cgeo.geocaching.enumerations.CacheType; import cgeo.geocaching.enumerations.LoadFlags; import cgeo.geocaching.enumerations.LogType; import cgeo.geocaching.gcvote.GCVote; @@ -33,8 +31,6 @@ import android.widget.Button; import android.widget.ImageView; import android.widget.TextView; -import java.util.Collections; - public abstract class AbstractPopupActivity extends AbstractActivity { private static final int MENU_CACHES_AROUND = 5; @@ -124,10 +120,6 @@ public abstract class AbstractPopupActivity extends AbstractActivity { return; } - if (CacheType.UNKNOWN == cache.getType()) { - final SearchResult search = GCMap.searchByGeocodes(Collections.singleton(geocode)); - cache = search.getFirstCacheFromResult(LoadFlags.LOAD_CACHE_ONLY); - } geocode = cache.getGeocode().toUpperCase(); } @@ -288,6 +280,9 @@ public abstract class AbstractPopupActivity extends AbstractActivity { aquireGCVote(); } + // favourite count + details.add(R.string.cache_favourite, cache.getFavoritePoints() + "Ă—"); + // more details final Button buttonMore = (Button) findViewById(R.id.more_details); buttonMore.setOnClickListener(new OnClickListener() { diff --git a/main/src/cgeo/geocaching/CacheDetailActivity.java b/main/src/cgeo/geocaching/CacheDetailActivity.java index 49f52ba..cbd771c 100644 --- a/main/src/cgeo/geocaching/CacheDetailActivity.java +++ b/main/src/cgeo/geocaching/CacheDetailActivity.java @@ -21,7 +21,15 @@ import cgeo.geocaching.network.Parameters; import cgeo.geocaching.ui.CacheDetailsCreator; import cgeo.geocaching.ui.DecryptTextClickListener; import cgeo.geocaching.ui.Formatter; -import cgeo.geocaching.utils.*; +import cgeo.geocaching.utils.BaseUtils; +import cgeo.geocaching.utils.CancellableHandler; +import cgeo.geocaching.utils.ClipboardUtils; +import cgeo.geocaching.utils.CryptUtils; +import cgeo.geocaching.utils.GeoDirHandler; +import cgeo.geocaching.utils.ImageHelper; +import cgeo.geocaching.utils.Log; +import cgeo.geocaching.utils.TranslationUtils; +import cgeo.geocaching.utils.UnknownTagsHandler; import com.viewpagerindicator.TitlePageIndicator; import com.viewpagerindicator.TitleProvider; @@ -38,6 +46,7 @@ import android.content.Intent; import android.content.pm.PackageManager; import android.content.pm.ResolveInfo; import android.graphics.Bitmap; +import android.graphics.BitmapFactory; import android.graphics.Typeface; import android.graphics.drawable.BitmapDrawable; import android.graphics.drawable.Drawable; @@ -58,7 +67,6 @@ import android.text.format.DateUtils; import android.text.method.LinkMovementMethod; import android.text.style.StrikethroughSpan; import android.text.style.StyleSpan; -import android.util.DisplayMetrics; import android.view.ContextMenu; import android.view.Menu; import android.view.MenuItem; @@ -1680,10 +1688,7 @@ public class CacheDetailActivity extends AbstractActivity { Button buttonRemove = (Button) view.findViewById(R.id.remove_from_watchlist); TextView text = (TextView) view.findViewById(R.id.watchlist_text); - //TODO: We already have cache.isOwn(). Those 2 should be combined. - boolean userIsOwner = StringUtils.equals(cache.getOwnerReal(), Settings.getUsername()); - - if (cache.isOnWatchlist() || userIsOwner) { + if (cache.isOnWatchlist() || cache.isOwn()) { buttonAdd.setVisibility(View.GONE); buttonRemove.setVisibility(View.VISIBLE); text.setText(R.string.cache_watchlist_on); @@ -1694,7 +1699,7 @@ public class CacheDetailActivity extends AbstractActivity { } // the owner of a cache has it always on his watchlist. Adding causes an error - if (userIsOwner) { + if (cache.isOwn()) { buttonAdd.setEnabled(false); buttonAdd.setVisibility(View.GONE); buttonRemove.setEnabled(false); @@ -1707,12 +1712,10 @@ public class CacheDetailActivity extends AbstractActivity { * shows/hides buttons, sets text in watchlist box */ private void updateFavPointBox() { - boolean userIsOwner = StringUtils.equals(cache.getOwnerReal(), Settings.getUsername()); - LinearLayout layout = (LinearLayout) view.findViewById(R.id.favpoint_box); boolean supportsFavoritePoints = cache.supportsFavoritePoints(); layout.setVisibility(supportsFavoritePoints ? View.VISIBLE : View.GONE); - if (!supportsFavoritePoints || userIsOwner || !Settings.isPremiumMember()) { + if (!supportsFavoritePoints || cache.isOwn() || !Settings.isPremiumMember()) { return; } Button buttonAdd = (Button) view.findViewById(R.id.add_to_favpoint); @@ -1798,26 +1801,28 @@ public class CacheDetailActivity extends AbstractActivity { @Override protected BitmapDrawable doInBackground(Void... parameters) { try { - final String latlonMap = cache.getCoords().format(GeopointFormatter.Format.LAT_LON_DECDEGREE_COMMA); - - DisplayMetrics metrics = new DisplayMetrics(); - getWindowManager().getDefaultDisplay().getMetrics(metrics); - - final int width = metrics.widthPixels; - final int height = (int) (110 * metrics.density); - - // TODO move this code to StaticMapProvider and use its constant values - final String markerUrl = "http://cgeo.carnero.cc/_markers/my_location_mdpi.png"; + // persistent preview from storage + Bitmap image = decode(cache); + + if (image == null) { + StaticMapsProvider.storeCachePreviewMap(cache); + image = decode(cache); + if (image == null) { + return null; + } + } - final HtmlImage mapGetter = new HtmlImage(cache.getGeocode(), false, 0, false); - final Parameters params = new Parameters("zoom", "15", "size", width + "x" + height, "maptype", "roadmap", "markers", "icon:" + markerUrl + "|shadow:false|" + latlonMap, "sensor", "false"); - return mapGetter.getDrawable("http://maps.google.com/maps/api/staticmap?" + params); + return ImageHelper.scaleBitmapToFitDisplay(image); } catch (Exception e) { Log.w("CacheDetailActivity.PreviewMapTask", e); return null; } } + private Bitmap decode(final cgCache cache) { + return BitmapFactory.decodeFile(StaticMapsProvider.getMapFile(cache.getGeocode(), "preview", false).getPath()); + } + @Override protected void onPostExecute(BitmapDrawable image) { if (image == null) { diff --git a/main/src/cgeo/geocaching/ICache.java b/main/src/cgeo/geocaching/ICache.java index dccdb85..7cb2ce2 100644 --- a/main/src/cgeo/geocaching/ICache.java +++ b/main/src/cgeo/geocaching/ICache.java @@ -23,7 +23,7 @@ public interface ICache extends IBasicCache { public String getOwner(); /** - * @return GC username of the owner + * @return GC username of the (actual) owner, might differ from the owner. Never empty. */ public String getOwnerReal(); @@ -105,7 +105,7 @@ public interface ICache extends IBasicCache { /** * immutable list of attributes, never <code>null</code> - * + * * @return the list of attributes for this cache */ public List<String> getAttributes(); diff --git a/main/src/cgeo/geocaching/Settings.java b/main/src/cgeo/geocaching/Settings.java index 82ab132..6e03465 100644 --- a/main/src/cgeo/geocaching/Settings.java +++ b/main/src/cgeo/geocaching/Settings.java @@ -1,6 +1,7 @@ package cgeo.geocaching; import cgeo.geocaching.apps.cache.navi.NavigationAppFactory.NavigationAppsEnum; +import cgeo.geocaching.connector.gc.GCConstants; import cgeo.geocaching.connector.gc.Login; import cgeo.geocaching.enumerations.CacheType; import cgeo.geocaching.enumerations.LiveMapStrategy.Strategy; @@ -265,7 +266,7 @@ public final class Settings { if (memberStatus == null) { return false; } - return "Premium Member".equalsIgnoreCase(memberStatus); + return GCConstants.MEMBER_STATUS_PM.equalsIgnoreCase(memberStatus); } public static String getMemberStatus() { diff --git a/main/src/cgeo/geocaching/StaticMapsActivity.java b/main/src/cgeo/geocaching/StaticMapsActivity.java index ec417dd..a95f4d2 100644 --- a/main/src/cgeo/geocaching/StaticMapsActivity.java +++ b/main/src/cgeo/geocaching/StaticMapsActivity.java @@ -7,6 +7,8 @@ import cgeo.geocaching.utils.Log; import org.apache.commons.collections.CollectionUtils; import android.app.ProgressDialog; +import android.content.Context; +import android.content.Intent; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.os.Bundle; @@ -23,6 +25,9 @@ import java.util.List; public class StaticMapsActivity extends AbstractActivity { + private static final String EXTRAS_WAYPOINT = "waypoint"; + private static final String EXTRAS_DOWNLOAD = "download"; + private static final String EXTRAS_GEOCODE = "geocode"; private static final int MENU_REFRESH = 1; private final List<Bitmap> maps = new ArrayList<Bitmap>(); private boolean download = false; @@ -96,10 +101,10 @@ public class StaticMapsActivity extends AbstractActivity { // try to get data from extras if (extras != null) { - download = extras.getBoolean("download", false); - geocode = extras.getString("geocode"); - if (extras.containsKey("waypoint")) { - waypoint_id = extras.getInt("waypoint"); + download = extras.getBoolean(EXTRAS_DOWNLOAD, false); + geocode = extras.getString(EXTRAS_GEOCODE); + if (extras.containsKey(EXTRAS_WAYPOINT)) { + waypoint_id = extras.getInt(EXTRAS_WAYPOINT); } } @@ -133,12 +138,12 @@ public class StaticMapsActivity extends AbstractActivity { for (int level = 1; level <= 5; level++) { try { if (waypoint_id != null) { - final Bitmap image = BitmapFactory.decodeFile(StaticMapsProvider.getMapFile(geocode, "wp" + waypoint_id + "_", level, false).getPath()); + final Bitmap image = BitmapFactory.decodeFile(StaticMapsProvider.getMapFile(geocode, "wp" + waypoint_id + "_" + level, false).getPath()); if (image != null) { maps.add(image); } } else { - final Bitmap image = BitmapFactory.decodeFile(StaticMapsProvider.getMapFile(geocode, "", level, false).getPath()); + final Bitmap image = BitmapFactory.decodeFile(StaticMapsProvider.getMapFile(geocode, "" + level, false).getPath()); if (image != null) { maps.add(image); } @@ -152,12 +157,12 @@ public class StaticMapsActivity extends AbstractActivity { for (int level = 1; level <= 5; level++) { try { if (waypoint_id != null) { - final Bitmap image = BitmapFactory.decodeFile(StaticMapsProvider.getMapFile(geocode, "wp" + waypoint_id + "_", level, false).getPath()); + final Bitmap image = BitmapFactory.decodeFile(StaticMapsProvider.getMapFile(geocode, "wp" + waypoint_id + "_" + level, false).getPath()); if (image != null) { maps.add(image); } } else { - final Bitmap image = BitmapFactory.decodeFile(StaticMapsProvider.getMapFile(geocode, "", level, false).getPath()); + final Bitmap image = BitmapFactory.decodeFile(StaticMapsProvider.getMapFile(geocode, "" + level, false).getPath()); if (image != null) { maps.add(image); } @@ -207,4 +212,18 @@ public class StaticMapsActivity extends AbstractActivity { showToast(res.getString(R.string.err_detail_not_load_map_static)); return false; } + + public static void startActivity(final Context activity, final String geocode, final boolean download, final cgWaypoint waypoint) { + final Intent intent = new Intent(activity, StaticMapsActivity.class); + // if resuming our app within this activity, finish it and return to the cache activity + intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET); + intent.putExtra(EXTRAS_GEOCODE, geocode); + if (download) { + intent.putExtra(EXTRAS_DOWNLOAD, true); + } + if (waypoint != null) { + intent.putExtra(EXTRAS_WAYPOINT, waypoint.getId()); + } + activity.startActivity(intent); + } }
\ No newline at end of file diff --git a/main/src/cgeo/geocaching/StaticMapsProvider.java b/main/src/cgeo/geocaching/StaticMapsProvider.java index 7b504b4..dee026d 100644 --- a/main/src/cgeo/geocaching/StaticMapsProvider.java +++ b/main/src/cgeo/geocaching/StaticMapsProvider.java @@ -13,6 +13,7 @@ import org.apache.http.HttpResponse; import android.app.Activity; import android.content.Context; +import android.util.DisplayMetrics; import android.view.Display; import android.view.WindowManager; @@ -20,6 +21,9 @@ import java.io.File; import java.util.concurrent.TimeUnit; public class StaticMapsProvider { + private static final String GOOGLE_STATICMAP_URL = "http://maps.google.com/maps/api/staticmap"; + private static final String SATELLITE = "satellite"; + private static final String ROADMAP = "roadmap"; private static final String WAYPOINT_PREFIX = "wp"; private static final String MAP_FILENAME_PREFIX = "map_"; private static final String MARKERS_URL = "http://cgeo.carnero.cc/_markers/"; @@ -28,35 +32,34 @@ public class StaticMapsProvider { /** ThreadPool restricting this to 1 Thread. **/ private static final BlockingThreadPool pool = new BlockingThreadPool(1, Thread.MIN_PRIORITY); - public static File getMapFile(final String geocode, String prefix, final int level, final boolean createDirs) { - return LocalStorage.getStorageFile(geocode, MAP_FILENAME_PREFIX + prefix + level, false, createDirs); + public static File getMapFile(final String geocode, String prefix, final boolean createDirs) { + return LocalStorage.getStorageFile(geocode, MAP_FILENAME_PREFIX + prefix, false, createDirs); } private static void downloadDifferentZooms(final String geocode, String markerUrl, String prefix, String latlonMap, int edge, final Parameters waypoints) { - downloadMap(geocode, 20, "satellite", markerUrl, prefix, 1, latlonMap, edge, waypoints); - downloadMap(geocode, 18, "satellite", markerUrl, prefix, 2, latlonMap, edge, waypoints); - downloadMap(geocode, 16, "roadmap", markerUrl, prefix, 3, latlonMap, edge, waypoints); - downloadMap(geocode, 14, "roadmap", markerUrl, prefix, 4, latlonMap, edge, waypoints); - downloadMap(geocode, 11, "roadmap", markerUrl, prefix, 5, latlonMap, edge, waypoints); + downloadMap(geocode, 20, SATELLITE, markerUrl, prefix + "_1", "", latlonMap, edge, edge, waypoints); + downloadMap(geocode, 18, SATELLITE, markerUrl, prefix + "_2", "", latlonMap, edge, edge, waypoints); + downloadMap(geocode, 16, ROADMAP, markerUrl, prefix + "_3", "", latlonMap, edge, edge, waypoints); + downloadMap(geocode, 14, ROADMAP, markerUrl, prefix + "_4", "", latlonMap, edge, edge, waypoints); + downloadMap(geocode, 11, ROADMAP, markerUrl, prefix + "_5", "", latlonMap, edge, edge, waypoints); } - private static void downloadMap(String geocode, int zoom, String mapType, String markerUrl, String prefix, int level, String latlonMap, int edge, final Parameters waypoints) { - final String mapUrl = "http://maps.google.com/maps/api/staticmap"; + private static void downloadMap(String geocode, int zoom, String mapType, String markerUrl, String prefix, String shadow, String latlonMap, int width, int height, final Parameters waypoints) { final Parameters params = new Parameters( "center", latlonMap, "zoom", String.valueOf(zoom), - "size", edge + "x" + edge, + "size", width + "x" + height, "maptype", mapType, - "markers", "icon:" + markerUrl + '|' + latlonMap, + "markers", "icon:" + markerUrl + '|' + shadow + latlonMap, "sensor", "false"); if (waypoints != null) { params.addAll(waypoints); } - final HttpResponse httpResponse = Network.getRequest(mapUrl, params); + final HttpResponse httpResponse = Network.getRequest(GOOGLE_STATICMAP_URL, params); if (httpResponse != null) { if (httpResponse.getStatusLine().getStatusCode() == 200) { - final File file = getMapFile(geocode, prefix, level, true); + final File file = getMapFile(geocode, prefix, true); if (LocalStorage.saveEntityToFile(httpResponse, file)) { // Delete image if it has no contents final long fileSize = file.length(); @@ -82,9 +85,10 @@ public class StaticMapsProvider { return; } - int edge = guessMinDisplaySide(display); + int edge = guessMaxDisplaySide(display); if (Settings.isStoreOfflineMaps() && cache.getCoords() != null) { + storeCachePreviewMap(cache); storeCacheStaticMap(cache, edge, false); } @@ -99,7 +103,7 @@ public class StaticMapsProvider { } public static void storeWaypointStaticMap(cgCache cache, Activity activity, cgWaypoint waypoint, boolean waitForResult) { - int edge = StaticMapsProvider.guessMinDisplaySide(activity); + int edge = StaticMapsProvider.guessMaxDisplaySide(activity); storeWaypointStaticMap(cache.getGeocode(), edge, waypoint, waitForResult); } @@ -114,7 +118,7 @@ public class StaticMapsProvider { } public static void storeCacheStaticMap(cgCache cache, Activity activity, final boolean waitForResult) { - int edge = guessMinDisplaySide(activity); + int edge = guessMaxDisplaySide(activity); storeCacheStaticMap(cache, edge, waitForResult); } @@ -133,7 +137,18 @@ public class StaticMapsProvider { downloadMaps(cache.getGeocode(), cacheMarkerUrl, "", latlonMap, edge, waypoints, waitForResult); } - private static int guessMinDisplaySide(Display display) { + public static void storeCachePreviewMap(final cgCache cache) { + final String latlonMap = cache.getCoords().format(Format.LAT_LON_DECDEGREE_COMMA); + final String markerUrl = MARKERS_URL + "my_location_mdpi.png"; + final Display display = ((WindowManager) cgeoapplication.getInstance().getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay(); + DisplayMetrics metrics = new DisplayMetrics(); + display.getMetrics(metrics); + final int width = metrics.widthPixels; + final int height = (int) (110 * metrics.density); + downloadMap(cache.getGeocode(), 15, ROADMAP, markerUrl, "preview", "shadow:false|", latlonMap, width, height, null); + } + + private static int guessMaxDisplaySide(Display display) { final int maxWidth = display.getWidth() - 25; final int maxHeight = display.getHeight() - 25; if (maxWidth > maxHeight) { @@ -142,8 +157,8 @@ public class StaticMapsProvider { return maxHeight; } - private static int guessMinDisplaySide(Activity activity) { - return guessMinDisplaySide(((WindowManager) activity.getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay()); + private static int guessMaxDisplaySide(Activity activity) { + return guessMaxDisplaySide(((WindowManager) activity.getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay()); } private static void downloadMaps(final String geocode, final String markerUrl, final String prefix, final String latlonMap, final int edge, @@ -186,7 +201,7 @@ public class StaticMapsProvider { for (int level = 1; level <= 5; level++) { try { if (wp_id > 0) { - StaticMapsProvider.getMapFile(geocode, WAYPOINT_PREFIX + wp_id + "_", level, false).delete(); + StaticMapsProvider.getMapFile(geocode, WAYPOINT_PREFIX + wp_id + "_" + level, false).delete(); } } catch (Exception e) { Log.e("StaticMapsProvider.removeWpStaticMaps: " + e.toString()); @@ -202,7 +217,7 @@ public class StaticMapsProvider { */ public static boolean doesExistStaticMapForCache(String geocode) { for (int level = 1; level <= 5; level++) { - File mapFile = StaticMapsProvider.getMapFile(geocode, "", level, false); + File mapFile = StaticMapsProvider.getMapFile(geocode, "" + level, false); if (mapFile != null && mapFile.exists()) { return true; } @@ -219,7 +234,7 @@ public class StaticMapsProvider { */ public static boolean doesExistStaticMapForWaypoint(String geocode, int waypointId) { for (int level = 1; level <= 5; level++) { - File mapFile = StaticMapsProvider.getMapFile(geocode, WAYPOINT_PREFIX + waypointId + "_", level, false); + File mapFile = StaticMapsProvider.getMapFile(geocode, WAYPOINT_PREFIX + waypointId + "_" + level, false); if (mapFile != null && mapFile.exists()) { return true; } diff --git a/main/src/cgeo/geocaching/apps/cache/navi/AbstractStaticMapsApp.java b/main/src/cgeo/geocaching/apps/cache/navi/AbstractStaticMapsApp.java index 98be63a..23cb982 100644 --- a/main/src/cgeo/geocaching/apps/cache/navi/AbstractStaticMapsApp.java +++ b/main/src/cgeo/geocaching/apps/cache/navi/AbstractStaticMapsApp.java @@ -13,7 +13,6 @@ import cgeo.geocaching.geopoint.Geopoint; import org.apache.commons.lang3.StringUtils; import android.app.Activity; -import android.content.Intent; abstract class AbstractStaticMapsApp extends AbstractNavigationApp { public AbstractStaticMapsApp(String name) { @@ -54,16 +53,7 @@ abstract class AbstractStaticMapsApp extends AbstractNavigationApp { return true; } - final Intent intent = new Intent(activity, StaticMapsActivity.class); - intent.putExtra("geocode", geocode); - if (download) { - intent.putExtra("download", true); - } - if (waypoint != null) { - intent.putExtra("waypoint", waypoint.getId()); - } - activity.startActivity(intent); - + StaticMapsActivity.startActivity(activity, geocode, download, waypoint); return true; } diff --git a/main/src/cgeo/geocaching/cgeo.java b/main/src/cgeo/geocaching/cgeo.java index 8be8d9c..63b4dfc 100644 --- a/main/src/cgeo/geocaching/cgeo.java +++ b/main/src/cgeo/geocaching/cgeo.java @@ -301,9 +301,7 @@ public class cgeo extends AbstractActivity { cgeocaches.startActivityHistory(this); return true; case MENU_SCAN: - Intent intent = new Intent(SCAN_INTENT); - intent.putExtra("SCAN_MODE", "QR_CODE_MODE"); - startActivityForResult(intent, SCAN_REQUEST_CODE); + startScannerApplication(); return true; default: break; @@ -312,6 +310,13 @@ public class cgeo extends AbstractActivity { return false; } + private void startScannerApplication() { + Intent intent = new Intent(SCAN_INTENT); + intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET); // when resuming our app, cancel this activity + intent.putExtra("SCAN_MODE", "QR_CODE_MODE"); + startActivityForResult(intent, SCAN_REQUEST_CODE); + } + @Override public void onActivityResult(int requestCode, int resultCode, Intent intent) { if (requestCode == SCAN_REQUEST_CODE) { diff --git a/main/src/cgeo/geocaching/cgeocaches.java b/main/src/cgeo/geocaching/cgeocaches.java index fdc4669..c4d72d3 100644 --- a/main/src/cgeo/geocaching/cgeocaches.java +++ b/main/src/cgeo/geocaching/cgeocaches.java @@ -152,28 +152,28 @@ public class cgeocaches extends AbstractListActivity { private final GeoDirHandler geoDirHandler = new GeoDirHandler() { @Override - public void updateGeoData(final IGeoData geo) { - if (adapter == null) { - return; - } + public void updateGeoData(final IGeoData geo) { + if (adapter == null) { + return; + } - try { - if (geo.getCoords() != null) { - adapter.setActualCoordinates(geo.getCoords()); - } - - if (!Settings.isUseCompass() || geo.getSpeed() > 5) { // use GPS when speed is higher than 18 km/h - if (!Settings.isUseCompass()) { - adapter.setActualHeading(geo.getBearing()); - } - if (northHeading != null) { - adapter.setActualHeading(northHeading); - } - } - } catch (Exception e) { - Log.w("Failed to UpdateLocation location."); - } - } + try { + if (geo.getCoords() != null) { + adapter.setActualCoordinates(geo.getCoords()); + } + + if (!Settings.isUseCompass() || geo.getSpeed() > 5) { // use GPS when speed is higher than 18 km/h + if (!Settings.isUseCompass()) { + adapter.setActualHeading(geo.getBearing()); + } + if (northHeading != null) { + adapter.setActualHeading(northHeading); + } + } + } catch (Exception e) { + Log.w("Failed to UpdateLocation location."); + } + } @Override public void updateDirection(final float direction) { @@ -694,34 +694,36 @@ public class cgeocaches extends AbstractListActivity { public boolean onCreateOptionsMenu(Menu menu) { menu.add(0, MENU_FILTER, 0, res.getString(R.string.caches_filter)).setIcon(R.drawable.ic_menu_filter); - SubMenu subMenuSort = menu.addSubMenu(0, SUBMENU_SORT, 0, res.getString(R.string.caches_sort)).setIcon(R.drawable.ic_menu_sort_alphabetically); - subMenuSort.setHeaderTitle(res.getString(R.string.caches_sort_title)); - - // sort the context menu labels alphabetically for easier reading - Map<String, Integer> comparators = new HashMap<String, Integer>(); - comparators.put(res.getString(R.string.caches_sort_distance), MENU_SORT_DISTANCE); - comparators.put(res.getString(R.string.caches_sort_difficulty), MENU_SORT_DIFFICULTY); - comparators.put(res.getString(R.string.caches_sort_terrain), MENU_SORT_TERRAIN); - comparators.put(res.getString(R.string.caches_sort_size), MENU_SORT_SIZE); - comparators.put(res.getString(R.string.caches_sort_favorites), MENU_SORT_FAVORITES); - comparators.put(res.getString(R.string.caches_sort_name), MENU_SORT_NAME); - comparators.put(res.getString(R.string.caches_sort_gccode), MENU_SORT_GEOCODE); - comparators.put(res.getString(R.string.caches_sort_rating), MENU_SORT_RATING); - comparators.put(res.getString(R.string.caches_sort_vote), MENU_SORT_VOTE); - comparators.put(res.getString(R.string.caches_sort_inventory), MENU_SORT_INVENTORY); - comparators.put(res.getString(R.string.caches_sort_date), MENU_SORT_DATE); - comparators.put(res.getString(R.string.caches_sort_finds), MENU_SORT_FINDS); - comparators.put(res.getString(R.string.caches_sort_state), MENU_SORT_STATE); - comparators.put(res.getString(R.string.caches_sort_storage), MENU_SORT_STORAGE); - - List<String> sortedLabels = new ArrayList<String>(comparators.keySet()); - Collections.sort(sortedLabels); - for (String label : sortedLabels) { - Integer id = comparators.get(label); - subMenuSort.add(1, id, 0, label).setCheckable(true).setChecked(id == MENU_SORT_DISTANCE); - } - - subMenuSort.setGroupCheckable(1, true, true); + if (type != CacheListType.HISTORY) { + final SubMenu subMenuSort = menu.addSubMenu(0, SUBMENU_SORT, 0, res.getString(R.string.caches_sort)).setIcon(R.drawable.ic_menu_sort_alphabetically); + subMenuSort.setHeaderTitle(res.getString(R.string.caches_sort_title)); + + // sort the context menu labels alphabetically for easier reading + final Map<String, Integer> comparators = new HashMap<String, Integer>(); + comparators.put(res.getString(R.string.caches_sort_distance), MENU_SORT_DISTANCE); + comparators.put(res.getString(R.string.caches_sort_difficulty), MENU_SORT_DIFFICULTY); + comparators.put(res.getString(R.string.caches_sort_terrain), MENU_SORT_TERRAIN); + comparators.put(res.getString(R.string.caches_sort_size), MENU_SORT_SIZE); + comparators.put(res.getString(R.string.caches_sort_favorites), MENU_SORT_FAVORITES); + comparators.put(res.getString(R.string.caches_sort_name), MENU_SORT_NAME); + comparators.put(res.getString(R.string.caches_sort_gccode), MENU_SORT_GEOCODE); + comparators.put(res.getString(R.string.caches_sort_rating), MENU_SORT_RATING); + comparators.put(res.getString(R.string.caches_sort_vote), MENU_SORT_VOTE); + comparators.put(res.getString(R.string.caches_sort_inventory), MENU_SORT_INVENTORY); + comparators.put(res.getString(R.string.caches_sort_date), MENU_SORT_DATE); + comparators.put(res.getString(R.string.caches_sort_finds), MENU_SORT_FINDS); + comparators.put(res.getString(R.string.caches_sort_state), MENU_SORT_STATE); + comparators.put(res.getString(R.string.caches_sort_storage), MENU_SORT_STORAGE); + + final List<String> sortedLabels = new ArrayList<String>(comparators.keySet()); + Collections.sort(sortedLabels); + for (String label : sortedLabels) { + Integer id = comparators.get(label); + subMenuSort.add(1, id, 0, label).setCheckable(true).setChecked(id == MENU_SORT_DISTANCE); + } + + subMenuSort.setGroupCheckable(1, true, true); + } menu.add(0, MENU_SWITCH_SELECT_MODE, 0, res.getString(R.string.caches_select_mode)).setIcon(R.drawable.ic_menu_agenda); menu.add(0, MENU_INVERT_SELECTION, 0, res.getString(R.string.caches_select_invert)).setIcon(R.drawable.ic_menu_mark); diff --git a/main/src/cgeo/geocaching/cgeoimages.java b/main/src/cgeo/geocaching/cgeoimages.java index 6d4c77a..ba48ba3 100644 --- a/main/src/cgeo/geocaching/cgeoimages.java +++ b/main/src/cgeo/geocaching/cgeoimages.java @@ -227,6 +227,8 @@ public class cgeoimages extends AbstractActivity { 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); diff --git a/main/src/cgeo/geocaching/connector/gc/GCConstants.java b/main/src/cgeo/geocaching/connector/gc/GCConstants.java index 8d3a1ae..96991f8 100644 --- a/main/src/cgeo/geocaching/connector/gc/GCConstants.java +++ b/main/src/cgeo/geocaching/connector/gc/GCConstants.java @@ -65,6 +65,8 @@ public final class GCConstants { // Info box top-right public static final Pattern PATTERN_LOGIN_NAME = Pattern.compile("\"SignedInProfileLink\">([^<]+)</a>"); public static final Pattern PATTERN_MEMBER_STATUS = Pattern.compile("<span id=\"ctl00_litPMLevel\">([^<]+)</span>"); + public static final String MEMBER_STATUS_RENEW = "<a id=\"ctl00_hlRenew"; + public static final String MEMBER_STATUS_PM = "Premium Member"; /** Use replaceAll("[,.]","") on the resulting string before converting to an int */ public static final Pattern PATTERN_CACHES_FOUND = Pattern.compile("title=\"Caches Found\"[\\s\\w=\"/.]*/>\\s*([\\d,.]+)"); public static final Pattern PATTERN_AVATAR_IMAGE_PROFILE_PAGE = Pattern.compile("<img src=\"(http://img.geocaching.com/user/avatar/[0-9a-f-]+\\.jpg)\"[^>]*\\salt=\"Avatar\""); diff --git a/main/src/cgeo/geocaching/connector/gc/GCMap.java b/main/src/cgeo/geocaching/connector/gc/GCMap.java index 82ffc7f..a8509b8 100644 --- a/main/src/cgeo/geocaching/connector/gc/GCMap.java +++ b/main/src/cgeo/geocaching/connector/gc/GCMap.java @@ -204,7 +204,16 @@ public class GCMap { } else { cache.setType(CacheType.UNKNOWN); } - searchResult.addCache(cache); + boolean exclude = false; + if (Settings.isExcludeMyCaches() && (cache.isFound() || cache.isOwn())) { // workaround for BM + exclude = true; + } + if (Settings.isExcludeDisabledCaches() && cache.isDisabled()) { + exclude = true; + } + if (!exclude) { + searchResult.addCache(cache); + } } Log.d("Retrieved " + searchResult.getCount() + " caches for tile " + tile.toString()); @@ -225,26 +234,25 @@ public class GCMap { * @return */ public static SearchResult searchByViewport(final Viewport viewport, final String[] tokens) { + int speed = (int) cgeoapplication.getInstance().currentGeo().getSpeed() * 60 * 60 / 1000; // in km/h Strategy strategy = Settings.getLiveMapStrategy(); if (strategy == Strategy.AUTO) { - float speedNow = cgeoapplication.getInstance().currentGeo().getSpeed(); - strategy = speedNow >= 8 ? Strategy.FAST : Strategy.DETAILED; // 8 m/s = 30 km/h + strategy = speed >= 30 ? Strategy.FAST : Strategy.DETAILED; } - // return searchByViewport(viewport, tokens, strategy); - // testing purpose - { - SearchResult result = searchByViewport(viewport, tokens, strategy); + SearchResult result = searchByViewport(viewport, tokens, strategy); + + if (Settings.isDebug()) { String text = Formatter.SEPARATOR + strategy.getL10n() + Formatter.SEPARATOR; - int speed = (int) cgeoapplication.getInstance().currentGeo().getSpeed(); if (Settings.isUseMetricUnits()) { text += speed + " km/h"; } else { text += speed / IConversion.MILES_TO_KILOMETER + " mph"; } result.setUrl(result.getUrl() + text); - return result; } + + return result; } /** @@ -280,7 +288,7 @@ public class GCMap { if (tokens != null) { params.put("k", tokens[0], "st", tokens[1]); } - if (Settings.isExcludeMyCaches()) { + if (Settings.isExcludeMyCaches()) { // works only for PM params.put("hf", "1", "hh", "1"); // hide found, hide hidden } if (Settings.getCacheType() == CacheType.TRADITIONAL) { diff --git a/main/src/cgeo/geocaching/connector/gc/GCParser.java b/main/src/cgeo/geocaching/connector/gc/GCParser.java index dc69043..7ceef8e 100644 --- a/main/src/cgeo/geocaching/connector/gc/GCParser.java +++ b/main/src/cgeo/geocaching/connector/gc/GCParser.java @@ -378,10 +378,7 @@ public abstract class GCParser { // owner real name cache.setOwnerReal(URLDecoder.decode(BaseUtils.getMatch(page, GCConstants.PATTERN_OWNERREAL, true, cache.getOwnerReal()))); - final String username = Settings.getUsername(); - if (cache.getOwnerReal() != null && username != null && cache.getOwnerReal().equalsIgnoreCase(username)) { - cache.setOwn(true); - } + cache.setOwn(StringUtils.equalsIgnoreCase(cache.getOwnerReal(), Settings.getUsername())); String tableInside = page; diff --git a/main/src/cgeo/geocaching/connector/gc/Login.java b/main/src/cgeo/geocaching/connector/gc/Login.java index 113f581..c342dee 100644 --- a/main/src/cgeo/geocaching/connector/gc/Login.java +++ b/main/src/cgeo/geocaching/connector/gc/Login.java @@ -193,6 +193,9 @@ public abstract class Login { setActualUserName(BaseUtils.getMatch(page, GCConstants.PATTERN_LOGIN_NAME, true, "???")); setActualCachesFound(Integer.parseInt(BaseUtils.getMatch(page, GCConstants.PATTERN_CACHES_FOUND, true, "0").replaceAll("[,.]", ""))); Settings.setMemberStatus(BaseUtils.getMatch(page, GCConstants.PATTERN_MEMBER_STATUS, true, null)); + if ( page.contains(GCConstants.MEMBER_STATUS_RENEW) ) { + Settings.setMemberStatus(GCConstants.MEMBER_STATUS_PM); + } return true; } @@ -235,6 +238,9 @@ public abstract class Login { final String profile = BaseUtils.replaceWhitespace(Network.getResponseData(Network.getRequest("http://www.geocaching.com/my/"))); Settings.setMemberStatus(BaseUtils.getMatch(profile, GCConstants.PATTERN_MEMBER_STATUS, true, null)); + if (profile.contains(GCConstants.MEMBER_STATUS_RENEW)) { + Settings.setMemberStatus(GCConstants.MEMBER_STATUS_PM); + } setActualCachesFound(Integer.parseInt(BaseUtils.getMatch(profile, GCConstants.PATTERN_CACHES_FOUND, true, "-1").replaceAll("[,.]", ""))); diff --git a/main/src/cgeo/geocaching/maps/CGeoMap.java b/main/src/cgeo/geocaching/maps/CGeoMap.java index 3e61e09..eaf5bc8 100644 --- a/main/src/cgeo/geocaching/maps/CGeoMap.java +++ b/main/src/cgeo/geocaching/maps/CGeoMap.java @@ -1,7 +1,6 @@ package cgeo.geocaching.maps; import cgeo.geocaching.DirectionProvider; -import cgeo.geocaching.utils.GeoDirHandler; import cgeo.geocaching.IGeoData; import cgeo.geocaching.IWaypoint; import cgeo.geocaching.LiveMapInfo; @@ -36,6 +35,7 @@ import cgeo.geocaching.maps.interfaces.MapViewImpl; import cgeo.geocaching.maps.interfaces.OnMapDragListener; import cgeo.geocaching.maps.interfaces.OtherCachersOverlayItemImpl; import cgeo.geocaching.utils.CancellableHandler; +import cgeo.geocaching.utils.GeoDirHandler; import cgeo.geocaching.utils.LeastRecentlyUsedSet; import cgeo.geocaching.utils.Log; @@ -219,6 +219,12 @@ public class CGeoMap extends AbstractMap implements OnMapDragListener, ViewFacto title.append(']'); } + if (Settings.isDebug()) { + if (search != null && StringUtils.isNotBlank(search.getUrl())) { + title.append("[" + search.getUrl() + "]"); + } + } + ActivityMixin.setTitle(activity, title.toString()); break; case INVALIDATE_MAP: diff --git a/main/src/cgeo/geocaching/maps/CachesOverlay.java b/main/src/cgeo/geocaching/maps/CachesOverlay.java index 8cfeac5..4495340 100644 --- a/main/src/cgeo/geocaching/maps/CachesOverlay.java +++ b/main/src/cgeo/geocaching/maps/CachesOverlay.java @@ -2,9 +2,15 @@ package cgeo.geocaching.maps; import cgeo.geocaching.CachePopup; import cgeo.geocaching.IWaypoint; +import cgeo.geocaching.R; import cgeo.geocaching.Settings; import cgeo.geocaching.WaypointPopup; +import cgeo.geocaching.cgCache; +import cgeo.geocaching.cgeoapplication; +import cgeo.geocaching.activity.Progress; +import cgeo.geocaching.connector.gc.GCMap; import cgeo.geocaching.enumerations.CacheType; +import cgeo.geocaching.enumerations.LoadFlags; import cgeo.geocaching.geopoint.Geopoint; import cgeo.geocaching.maps.interfaces.CachesOverlayItemImpl; import cgeo.geocaching.maps.interfaces.GeoPointImpl; @@ -17,7 +23,6 @@ import cgeo.geocaching.utils.Log; import org.apache.commons.lang3.StringUtils; -import android.app.ProgressDialog; import android.content.Context; import android.graphics.Canvas; import android.graphics.DashPathEffect; @@ -28,6 +33,7 @@ import android.graphics.Point; import android.location.Location; import java.util.ArrayList; +import java.util.Collections; import java.util.List; public class CachesOverlay extends AbstractItemizedOverlay { @@ -35,7 +41,7 @@ public class CachesOverlay extends AbstractItemizedOverlay { private List<CachesOverlayItemImpl> items = new ArrayList<CachesOverlayItemImpl>(); private Context context = null; private boolean displayCircles = false; - private ProgressDialog waitDialog = null; + private Progress progress = new Progress(); private Paint blockedCircle = null; private PaintFlagsDrawFilter setFilter = null; private PaintFlagsDrawFilter removeFilter = null; @@ -201,12 +207,7 @@ public class CachesOverlay extends AbstractItemizedOverlay { return false; } - if (waitDialog == null) { - waitDialog = new ProgressDialog(context); - waitDialog.setMessage("loading details…"); - waitDialog.setCancelable(false); - } - waitDialog.show(); + progress.show(context, context.getResources().getString(R.string.map_live), context.getResources().getString(R.string.cache_dialog_loading_details), true, null); CachesOverlayItemImpl item = null; @@ -227,21 +228,27 @@ public class CachesOverlay extends AbstractItemizedOverlay { final IWaypoint coordinate = item.getCoord(); if (StringUtils.isNotBlank(coordinate.getCoordType()) && coordinate.getCoordType().equalsIgnoreCase("cache") && StringUtils.isNotBlank(coordinate.getGeocode())) { - CGeoMap.markCacheAsDirty(coordinate.getGeocode()); - CachePopup.startActivity(context, coordinate.getGeocode()); + cgCache cache = cgeoapplication.getInstance().loadCache(coordinate.getGeocode(), LoadFlags.LOAD_CACHE_OR_DB); + RequestDetailsThread requestDetailsThread = new RequestDetailsThread(cache); + if (!requestDetailsThread.requestRequired()) { + // don't show popup if we have enough details + progress.dismiss(); + } + requestDetailsThread.start(); + return true; } else if (coordinate.getCoordType() != null && coordinate.getCoordType().equalsIgnoreCase("waypoint") && coordinate.getId() > 0) { CGeoMap.markCacheAsDirty(coordinate.getGeocode()); WaypointPopup.startActivity(context, coordinate.getId(), coordinate.getGeocode()); } else { - waitDialog.dismiss(); + progress.dismiss(); return false; } - waitDialog.dismiss(); + progress.dismiss(); } catch (Exception e) { Log.e("cgMapOverlay.onTap: " + e.toString()); - if (waitDialog != null) { - waitDialog.dismiss(); + if (progress != null) { + progress.dismiss(); } } @@ -269,4 +276,28 @@ public class CachesOverlay extends AbstractItemizedOverlay { return 0; } + + private class RequestDetailsThread extends Thread { + + private final cgCache cache; + + public RequestDetailsThread(cgCache cache) { + this.cache = cache; + } + + public boolean requestRequired() { + return CacheType.UNKNOWN == cache.getType() || !cache.isReliableLatLon() || !cache.isOffline(); + } + + @Override + public void run() { + if (requestRequired()) { + /* final SearchResult search = */GCMap.searchByGeocodes(Collections.singleton(cache.getGeocode())); + CGeoMap.markCacheAsDirty(cache.getGeocode()); + } + CachePopup.startActivity(context, cache.getGeocode()); + progress.dismiss(); + } + } + } diff --git a/main/src/cgeo/geocaching/network/HtmlImage.java b/main/src/cgeo/geocaching/network/HtmlImage.java index 51f7ea8..ef13a36 100644 --- a/main/src/cgeo/geocaching/network/HtmlImage.java +++ b/main/src/cgeo/geocaching/network/HtmlImage.java @@ -5,6 +5,7 @@ import cgeo.geocaching.StoredList; import cgeo.geocaching.cgeoapplication; import cgeo.geocaching.connector.ConnectorFactory; import cgeo.geocaching.files.LocalStorage; +import cgeo.geocaching.utils.ImageHelper; import cgeo.geocaching.utils.Log; import org.apache.commons.lang3.StringUtils; @@ -14,7 +15,6 @@ import android.content.Context; import android.content.res.Resources; import android.graphics.Bitmap; import android.graphics.BitmapFactory; -import android.graphics.Rect; import android.graphics.drawable.BitmapDrawable; import android.net.Uri; import android.text.Html; @@ -121,34 +121,10 @@ public class HtmlImage implements Html.ImageGetter { } } - final int imgWidth = imagePre.getWidth(); - final int imgHeight = imagePre.getHeight(); - - int width; - int height; - - if (imgWidth > maxWidth || imgHeight > maxHeight) { - final double ratio = Math.min((double) maxHeight / (double) imgHeight, (double) maxWidth / (double) imgWidth); - width = (int) Math.ceil(imgWidth * ratio); - height = (int) Math.ceil(imgHeight * ratio); - - try { - imagePre = Bitmap.createScaledBitmap(imagePre, width, height, true); - } catch (Exception e) { - Log.d("HtmlImage.getDrawable: Failed to scale image"); - return null; - } - } else { - width = imgWidth; - height = imgHeight; - } - - final BitmapDrawable image = new BitmapDrawable(resources, imagePre); - image.setBounds(new Rect(0, 0, width, height)); - - return image; + return imagePre != null ? ImageHelper.scaleBitmapToFitDisplay(imagePre) : null; } + private Bitmap getTransparent1x1Image() { return BitmapFactory.decodeResource(resources, R.drawable.image_no_placement); } diff --git a/main/src/cgeo/geocaching/ui/AddressListAdapter.java b/main/src/cgeo/geocaching/ui/AddressListAdapter.java index 327b71d..17a9289 100644 --- a/main/src/cgeo/geocaching/ui/AddressListAdapter.java +++ b/main/src/cgeo/geocaching/ui/AddressListAdapter.java @@ -24,6 +24,11 @@ public class AddressListAdapter extends ArrayAdapter<Address> { final private LayoutInflater inflater; final private Geopoint location; + private static final class ViewHolder { + TextView label; + TextView distance; + } + public AddressListAdapter(final Context context) { super(context, 0); inflater = ((Activity) context).getLayoutInflater(); @@ -34,20 +39,20 @@ public class AddressListAdapter extends ArrayAdapter<Address> { public View getView(final int position, final View convertView, final ViewGroup parent) { final Address address = getItem(position); - // holder pattern implementation - final AddressListView holder; View view = convertView; + // holder pattern implementation + final ViewHolder holder; if (view == null) { view = inflater.inflate(R.layout.addresses_item, null); - holder = new AddressListView(); + holder = new ViewHolder(); holder.label = (TextView) view.findViewById(R.id.label); holder.distance = (TextView) view.findViewById(R.id.distance); view.setTag(holder); } else { - holder = (AddressListView) view.getTag(); + holder = (ViewHolder) view.getTag(); } view.setOnClickListener(new View.OnClickListener() { diff --git a/main/src/cgeo/geocaching/ui/AddressListView.java b/main/src/cgeo/geocaching/ui/AddressListView.java deleted file mode 100644 index 53459ed..0000000 --- a/main/src/cgeo/geocaching/ui/AddressListView.java +++ /dev/null @@ -1,8 +0,0 @@ -package cgeo.geocaching.ui; - -import android.widget.TextView; - -public class AddressListView { - public TextView label; - public TextView distance; -} diff --git a/main/src/cgeo/geocaching/ui/CacheListAdapter.java b/main/src/cgeo/geocaching/ui/CacheListAdapter.java index 391e9ac..12849f8 100644 --- a/main/src/cgeo/geocaching/ui/CacheListAdapter.java +++ b/main/src/cgeo/geocaching/ui/CacheListAdapter.java @@ -86,6 +86,24 @@ public class CacheListAdapter extends ArrayAdapter<cgCache> { } } + /** + * view holder for the cache list adapter + * + */ + private static class ViewHolder { + CheckBox checkbox; + ImageView logStatusMark; + TextView text; + TextView favourite; + TextView info; + ImageView inventory; + RelativeLayout directionLayout; + DistanceView distance; + CompassMiniView direction; + RelativeLayout dirImgLayout; + ImageView dirImg; + } + public CacheListAdapter(final Activity activity, final List<cgCache> list, CacheListType cacheListType) { super(activity, 0, list); final IGeoData currentGeo = cgeoapplication.getInstance().currentGeo(); @@ -313,11 +331,11 @@ public class CacheListAdapter extends ArrayAdapter<cgCache> { View v = rowView; - CacheListView holder; + final ViewHolder holder; if (v == null) { v = inflater.inflate(R.layout.caches_item, null); - holder = new CacheListView(); + holder = new ViewHolder(); holder.checkbox = (CheckBox) v.findViewById(R.id.checkbox); holder.logStatusMark = (ImageView) v.findViewById(R.id.log_status_mark); holder.text = (TextView) v.findViewById(R.id.text); @@ -332,7 +350,7 @@ public class CacheListAdapter extends ArrayAdapter<cgCache> { v.setTag(holder); } else { - holder = (CacheListView) v.getTag(); + holder = (ViewHolder) v.getTag(); } final boolean lightSkin = Settings.isLightSkin(); diff --git a/main/src/cgeo/geocaching/ui/CacheListView.java b/main/src/cgeo/geocaching/ui/CacheListView.java deleted file mode 100644 index 0b89c9c..0000000 --- a/main/src/cgeo/geocaching/ui/CacheListView.java +++ /dev/null @@ -1,22 +0,0 @@ -package cgeo.geocaching.ui; - - -import android.widget.CheckBox; -import android.widget.ImageView; -import android.widget.RelativeLayout; -import android.widget.TextView; - -public class CacheListView { - // layouts & views - public CheckBox checkbox; - public ImageView logStatusMark; - public TextView text; - public TextView favourite; - public TextView info; - public ImageView inventory; - public RelativeLayout directionLayout; - public DistanceView distance; - public CompassMiniView direction; - public RelativeLayout dirImgLayout; - public ImageView dirImg; -} diff --git a/main/src/cgeo/geocaching/ui/CompassMiniView.java b/main/src/cgeo/geocaching/ui/CompassMiniView.java index a0aaeaf..a60afa6 100644 --- a/main/src/cgeo/geocaching/ui/CompassMiniView.java +++ b/main/src/cgeo/geocaching/ui/CompassMiniView.java @@ -17,6 +17,10 @@ final public class CompassMiniView extends View { private Geopoint targetCoords = null; private float azimuth = 0; private float heading = 0; + /** + * remember the last state of drawing so we can avoid repainting for very small changes + */ + private float lastDrawingAzimuth; /** * lazy initialized bitmap resource depending on selected skin @@ -45,6 +49,7 @@ final public class CompassMiniView extends View { private static final int ARROW_BITMAP_SIZE = 21; private static final PaintFlagsDrawFilter FILTER_SET = new PaintFlagsDrawFilter(0, Paint.FILTER_BITMAP_FLAG); private static final PaintFlagsDrawFilter FILTER_REMOVE = new PaintFlagsDrawFilter(Paint.FILTER_BITMAP_FLAG, 0); + private static final float MINIMUM_ROTATION_DEGREES_FOR_REPAINT = 5; public CompassMiniView(Context context) { super(context); @@ -115,8 +120,15 @@ final public class CompassMiniView extends View { return; } - // compass margins + float azimuthRelative = calculateAzimuthRelative(); + + // avoid updates on very small changes, which are not visible to the user + float change = Math.abs(azimuthRelative - lastDrawingAzimuth); + if (change < MINIMUM_ROTATION_DEGREES_FOR_REPAINT) { + return; + } + // compass margins final int marginLeft = (getWidth() - compassArrowWidth) / 2; final int marginTop = (getHeight() - compassArrowHeight) / 2; @@ -127,19 +139,14 @@ final public class CompassMiniView extends View { protected void onDraw(Canvas canvas) { super.onDraw(canvas); - float azimuthRelative = azimuth - heading; - if (azimuthRelative < 0) { - azimuthRelative += 360; - } else if (azimuthRelative >= 360) { - azimuthRelative -= 360; - } + float azimuthRelative = calculateAzimuthRelative(); + lastDrawingAzimuth = azimuthRelative; // compass margins canvas.setDrawFilter(FILTER_SET); - - final int canvasCenterX = (compassArrowWidth / 2) + ((getWidth() - compassArrowWidth) / 2); - final int canvasCenterY = (compassArrowHeight / 2) + ((getHeight() - compassArrowHeight) / 2); + final int canvasCenterX = getWidth() / 2; + final int canvasCenterY = getHeight() / 2; final int marginLeft = (getWidth() - compassArrowWidth) / 2; final int marginTop = (getHeight() - compassArrowHeight) / 2; @@ -151,6 +158,16 @@ final public class CompassMiniView extends View { canvas.setDrawFilter(FILTER_REMOVE); } + private float calculateAzimuthRelative() { + float azimuthRelative = azimuth - heading; + if (azimuthRelative < 0) { + azimuthRelative += 360; + } else if (azimuthRelative >= 360) { + azimuthRelative -= 360; + } + return azimuthRelative; + } + @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { setMeasuredDimension(measureWidth(widthMeasureSpec), measureHeight(heightMeasureSpec)); diff --git a/main/src/cgeo/geocaching/ui/GPXListAdapter.java b/main/src/cgeo/geocaching/ui/GPXListAdapter.java index 76dc10e..b4ee3a1 100644 --- a/main/src/cgeo/geocaching/ui/GPXListAdapter.java +++ b/main/src/cgeo/geocaching/ui/GPXListAdapter.java @@ -19,6 +19,11 @@ public class GPXListAdapter extends ArrayAdapter<File> { private cgeogpxes activity = null; private LayoutInflater inflater = null; + private static class ViewHolder { + TextView filepath; + TextView filename; + } + public GPXListAdapter(cgeogpxes parentIn, List<File> listIn) { super(parentIn, 0, listIn); @@ -39,18 +44,18 @@ public class GPXListAdapter extends ArrayAdapter<File> { final File file = getItem(position); View v = rowView; - GPXListView holder; + final ViewHolder holder; if (v == null) { v = inflater.inflate(R.layout.gpx_item, null); - holder = new GPXListView(); + holder = new ViewHolder(); holder.filepath = (TextView) v.findViewById(R.id.filepath); holder.filename = (TextView) v.findViewById(R.id.filename); v.setTag(holder); } else { - holder = (GPXListView) v.getTag(); + holder = (ViewHolder) v.getTag(); } v.setOnClickListener(new View.OnClickListener() { diff --git a/main/src/cgeo/geocaching/ui/GPXListView.java b/main/src/cgeo/geocaching/ui/GPXListView.java deleted file mode 100644 index d2d0766..0000000 --- a/main/src/cgeo/geocaching/ui/GPXListView.java +++ /dev/null @@ -1,9 +0,0 @@ -package cgeo.geocaching.ui; - -import android.widget.TextView; - -public class GPXListView { - // layouts & views - public TextView filepath; - public TextView filename; -} diff --git a/main/src/cgeo/geocaching/ui/MapfileListAdapter.java b/main/src/cgeo/geocaching/ui/MapfileListAdapter.java index a14d120..e14bf3d 100644 --- a/main/src/cgeo/geocaching/ui/MapfileListAdapter.java +++ b/main/src/cgeo/geocaching/ui/MapfileListAdapter.java @@ -40,18 +40,18 @@ public class MapfileListAdapter extends ArrayAdapter<File> { File file = getItem(position); View v = rowView; - MapfileView holder; + ViewHolder holder; if (v == null) { v = inflater.inflate(R.layout.mapfile_item, null); - holder = new MapfileView(); + holder = new ViewHolder(); holder.filepath = (TextView) v.findViewById(R.id.mapfilepath); holder.filename = (TextView) v.findViewById(R.id.mapfilename); v.setTag(holder); } else { - holder = (MapfileView) v.getTag(); + holder = (ViewHolder) v.getTag(); } File current = new File(parentView.getCurrentMapfile()); @@ -85,8 +85,8 @@ public class MapfileListAdapter extends ArrayAdapter<File> { } } - private static class MapfileView { - public TextView filepath; - public TextView filename; + private static final class ViewHolder { + TextView filepath; + TextView filename; } } diff --git a/main/src/cgeo/geocaching/utils/ImageHelper.java b/main/src/cgeo/geocaching/utils/ImageHelper.java new file mode 100644 index 0000000..4c18b06 --- /dev/null +++ b/main/src/cgeo/geocaching/utils/ImageHelper.java @@ -0,0 +1,47 @@ +package cgeo.geocaching.utils; + +import cgeo.geocaching.cgeoapplication; + +import android.content.Context; +import android.graphics.Bitmap; +import android.graphics.Rect; +import android.graphics.drawable.BitmapDrawable; +import android.view.Display; +import android.view.WindowManager; + +public class ImageHelper { + + // Do not let this class be instantiated, this is a utility class. + private ImageHelper() { + } + + /** + * Scales a bitmap to the given bounds + * + * @param image + * The bitmap to scale + * @return BitmapDrawable The scaled image + */ + public static BitmapDrawable scaleBitmapToFitDisplay(final Bitmap image) { + final cgeoapplication app = cgeoapplication.getInstance(); + final Display display = ((WindowManager) app.getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay(); + final int maxWidth = display.getWidth() - 25; + final int maxHeight = display.getHeight() - 25; + + Bitmap result = image; + int width = image.getWidth(); + int height = image.getHeight(); + + if (width > maxWidth || height > maxHeight) { + final double ratio = Math.min((double) maxHeight / (double) height, (double) maxWidth / (double) width); + width = (int) Math.ceil(width * ratio); + height = (int) Math.ceil(height * ratio); + result = Bitmap.createScaledBitmap(image, width, height, true); + } + + final BitmapDrawable resultDrawable = new BitmapDrawable(app.getResources(), result); + resultDrawable.setBounds(new Rect(0, 0, width, height)); + return resultDrawable; + } + +} |
