diff options
Diffstat (limited to 'main/src/cgeo/geocaching')
38 files changed, 425 insertions, 246 deletions
diff --git a/main/src/cgeo/geocaching/LogEntry.java b/main/src/cgeo/geocaching/LogEntry.java index 790becd..0121424 100644 --- a/main/src/cgeo/geocaching/LogEntry.java +++ b/main/src/cgeo/geocaching/LogEntry.java @@ -38,7 +38,7 @@ public final class LogEntry { this(Settings.getUsername(), dateInMilliSeconds, type, text); } - public LogEntry(final String author, long dateInMilliSeconds, final LogType type, final String text) { + public LogEntry(final String author, final long dateInMilliSeconds, final LogType type, final String text) { this.author = author; this.date = dateInMilliSeconds; this.type = type; @@ -51,7 +51,7 @@ public final class LogEntry { } @Override - public boolean equals(Object obj) { + public boolean equals(final Object obj) { if (this == obj) { return true; } @@ -109,7 +109,7 @@ public final class LogEntry { public String getDisplayText() { if (Settings.getPlainLogs()) { MatcherWrapper matcher = new MatcherWrapper(PATTERN_REMOVE_COLORS, log); - return matcher.replaceAll(""); + return matcher.replaceAll(StringUtils.EMPTY); } return log; } diff --git a/main/src/cgeo/geocaching/MainActivity.java b/main/src/cgeo/geocaching/MainActivity.java index 85ebe05..b565431 100644 --- a/main/src/cgeo/geocaching/MainActivity.java +++ b/main/src/cgeo/geocaching/MainActivity.java @@ -11,11 +11,12 @@ import cgeo.geocaching.enumerations.StatusCode; import cgeo.geocaching.geopoint.Geopoint; import cgeo.geocaching.geopoint.Units; import cgeo.geocaching.maps.CGeoMap; -import cgeo.geocaching.settings.SettingsActivity; import cgeo.geocaching.settings.Settings; +import cgeo.geocaching.settings.SettingsActivity; import cgeo.geocaching.ui.Formatter; import cgeo.geocaching.utils.GeoDirHandler; import cgeo.geocaching.utils.Log; +import cgeo.geocaching.utils.ProcessUtils; import cgeo.geocaching.utils.RunnableWithArgument; import cgeo.geocaching.utils.Version; @@ -30,8 +31,6 @@ import android.app.AlertDialog.Builder; import android.app.SearchManager; import android.content.DialogInterface; import android.content.Intent; -import android.content.pm.PackageManager; -import android.content.pm.ResolveInfo; import android.content.res.Configuration; import android.location.Address; import android.location.Geocoder; @@ -63,10 +62,10 @@ public class MainActivity extends AbstractActivity { @InjectView(R.id.any_button) protected ImageView any; @InjectView(R.id.filter_button) protected ImageView filter; @InjectView(R.id.nearest) protected ImageView nearestView; - @InjectView(R.id.nav_type) protected TextView navType ; - @InjectView(R.id.nav_accuracy) protected TextView navAccuracy ; - @InjectView(R.id.nav_location) protected TextView navLocation ; - @InjectView(R.id.offline_count) protected TextView countBubble ; + @InjectView(R.id.nav_type) protected TextView navType; + @InjectView(R.id.nav_accuracy) protected TextView navAccuracy; + @InjectView(R.id.nav_location) protected TextView navLocation; + @InjectView(R.id.offline_count) protected TextView countBubble; @InjectView(R.id.info_area) protected LinearLayout infoArea; private static final String SCAN_INTENT = "com.google.zxing.client.android.SCAN"; @@ -80,12 +79,12 @@ public class MainActivity extends AbstractActivity { private boolean addressObtaining = false; private boolean initialized = false; - final private UpdateLocation locationUpdater = new UpdateLocation(); + private final UpdateLocation locationUpdater = new UpdateLocation(); private Handler updateUserInfoHandler = new Handler() { @Override - public void handleMessage(Message msg) { + public void handleMessage(final Message msg) { // Get active connectors with login status ILogin[] loginConns = ConnectorFactory.getActiveLiveConnectors(); @@ -117,30 +116,29 @@ public class MainActivity extends AbstractActivity { private Handler obtainAddressHandler = new Handler() { @Override - public void handleMessage(Message msg) { + public void handleMessage(final Message msg) { try { if (CollectionUtils.isNotEmpty(addresses)) { final Address address = addresses.get(0); - final StringBuilder addText = new StringBuilder(); + final ArrayList<String> addressParts = new ArrayList<String>(); - if (address.getCountryName() != null) { - addText.append(address.getCountryName()); + final String countryName = address.getCountryName(); + if (countryName != null) { + addressParts.add(countryName); } - if (address.getLocality() != null) { - if (addText.length() > 0) { - addText.append(", "); - } - addText.append(address.getLocality()); - } else if (address.getAdminArea() != null) { - if (addText.length() > 0) { - addText.append(", "); + final String locality = address.getLocality(); + if (locality != null) { + addressParts.add(locality); + } else { + final String adminArea = address.getAdminArea(); + if (adminArea != null) { + addressParts.add(adminArea); } - addText.append(address.getAdminArea()); } addCoords = app.currentGeo().getCoords(); - navLocation.setText(addText.toString()); + navLocation.setText(StringUtils.join(addressParts, ", ")); } } catch (Exception e) { // nothing @@ -185,7 +183,7 @@ public class MainActivity extends AbstractActivity { private Handler firstLoginHandler = new Handler() { @Override - public void handleMessage(Message msg) { + public void handleMessage(final Message msg) { try { final StatusCode reason = (StatusCode) msg.obj; @@ -199,7 +197,7 @@ public class MainActivity extends AbstractActivity { }; @Override - public void onCreate(Bundle savedInstanceState) { + public void onCreate(final Bundle savedInstanceState) { // don't call the super implementation with the layout argument, as that would set the wrong theme super.onCreate(savedInstanceState); setContentView(R.layout.main_activity); @@ -220,7 +218,7 @@ public class MainActivity extends AbstractActivity { } @Override - public void onConfigurationChanged(Configuration newConfig) { + public void onConfigurationChanged(final Configuration newConfig) { super.onConfigurationChanged(newConfig); init(); @@ -258,31 +256,20 @@ public class MainActivity extends AbstractActivity { } @Override - public boolean onCreateOptionsMenu(Menu menu) { + public boolean onCreateOptionsMenu(final Menu menu) { getMenuInflater().inflate(R.menu.main_activity_options, menu); return true; } @Override - public boolean onPrepareOptionsMenu(Menu menu) { + public boolean onPrepareOptionsMenu(final Menu menu) { super.onPrepareOptionsMenu(menu); - MenuItem item = menu.findItem(R.id.menu_scan); - if (item != null) { - item.setEnabled(isIntentAvailable(SCAN_INTENT)); - } + menu.findItem(R.id.menu_scan).setEnabled(ProcessUtils.isIntentAvailable(SCAN_INTENT)); return true; } - public static boolean isIntentAvailable(String intent) { - final PackageManager packageManager = cgeoapplication.getInstance().getPackageManager(); - final List<ResolveInfo> list = packageManager.queryIntentActivities( - new Intent(intent), PackageManager.MATCH_DEFAULT_ONLY); - - return CollectionUtils.isNotEmpty(list); - } - @Override - public boolean onOptionsItemSelected(MenuItem item) { + public boolean onOptionsItemSelected(final MenuItem item) { final int id = item.getItemId(); switch (id) { case R.id.menu_about: @@ -312,7 +299,7 @@ public class MainActivity extends AbstractActivity { } @Override - public void onActivityResult(int requestCode, int resultCode, Intent intent) { + public void onActivityResult(final int requestCode, final int resultCode, final Intent intent) { IntentResult scanResult = IntentIntegrator.parseActivityResult(requestCode, resultCode, intent); if (scanResult != null) { String scan = scanResult.getContents(); @@ -348,7 +335,6 @@ public class MainActivity extends AbstractActivity { initialized = true; Settings.setLanguage(Settings.isUseEnglish()); - Settings.getGcLogin(); if (app.firstRun) { (new FirstLoginThread()).start(); @@ -357,7 +343,7 @@ public class MainActivity extends AbstractActivity { findOnMap.setClickable(true); findOnMap.setOnClickListener(new OnClickListener() { @Override - public void onClick(View v) { + public void onClick(final View v) { cgeoFindOnMap(v); } }); @@ -365,18 +351,18 @@ public class MainActivity extends AbstractActivity { findByOffline.setClickable(true); findByOffline.setOnClickListener(new OnClickListener() { @Override - public void onClick(View v) { + public void onClick(final View v) { cgeoFindByOffline(v); } }); findByOffline.setOnLongClickListener(new View.OnLongClickListener() { @Override - public boolean onLongClick(View v) { + public boolean onLongClick(final View v) { new StoredList.UserInterface(MainActivity.this).promptForListSelection(R.string.list_title, new RunnableWithArgument<Integer>() { @Override - public void run(Integer selectedListId) { + public void run(final Integer selectedListId) { Settings.saveLastList(selectedListId); cgeocaches.startActivityOffline(MainActivity.this); } @@ -389,7 +375,7 @@ public class MainActivity extends AbstractActivity { advanced.setClickable(true); advanced.setOnClickListener(new OnClickListener() { @Override - public void onClick(View v) { + public void onClick(final View v) { cgeoSearch(v); } }); @@ -397,7 +383,7 @@ public class MainActivity extends AbstractActivity { any.setClickable(true); any.setOnClickListener(new OnClickListener() { @Override - public void onClick(View v) { + public void onClick(final View v) { cgeoPoint(v); } }); @@ -405,14 +391,14 @@ public class MainActivity extends AbstractActivity { filter.setClickable(true); filter.setOnClickListener(new View.OnClickListener() { @Override - public void onClick(View v) { + public void onClick(final View v) { selectGlobalTypeFilter(); } }); filter.setOnLongClickListener(new View.OnLongClickListener() { @Override - public boolean onLongClick(View v) { + public boolean onLongClick(final View v) { selectGlobalTypeFilter(); return true; } @@ -442,7 +428,7 @@ public class MainActivity extends AbstractActivity { Collections.sort(sorted, new Comparator<CacheType>() { @Override - public int compare(CacheType left, CacheType right) { + public int compare(final CacheType left, final CacheType right) { return left.getL10n().compareToIgnoreCase(right.getL10n()); } }); @@ -464,7 +450,7 @@ public class MainActivity extends AbstractActivity { builder.setSingleChoiceItems(items, checkedItem, new DialogInterface.OnClickListener() { @Override - public void onClick(DialogInterface dialog, int position) { + public void onClick(final DialogInterface dialog, final int position) { CacheType cacheType = cacheTypes.get(position); Settings.setCacheType(cacheType); setFilterTitle(); @@ -489,7 +475,7 @@ public class MainActivity extends AbstractActivity { .setCancelable(false) .setPositiveButton(getString(android.R.string.yes), new DialogInterface.OnClickListener() { @Override - public void onClick(DialogInterface dialog, int id) { + public void onClick(final DialogInterface dialog, final int id) { dialog.dismiss(); cgData.resetNewlyCreatedDatabase(); app.restoreDatabase(MainActivity.this); @@ -497,7 +483,7 @@ public class MainActivity extends AbstractActivity { }) .setNegativeButton(getString(android.R.string.no), new DialogInterface.OnClickListener() { @Override - public void onClick(DialogInterface dialog, int id) { + public void onClick(final DialogInterface dialog, final int id) { dialog.cancel(); cgData.resetNewlyCreatedDatabase(); } @@ -517,7 +503,7 @@ public class MainActivity extends AbstractActivity { nearestView.setClickable(true); nearestView.setOnClickListener(new OnClickListener() { @Override - public void onClick(View v) { + public void onClick(final View v) { cgeoFindNearest(v); } }); @@ -564,7 +550,7 @@ public class MainActivity extends AbstractActivity { * @param v * unused here but needed since this method is referenced from XML layout */ - public void cgeoFindOnMap(View v) { + public void cgeoFindOnMap(final View v) { findOnMap.setPressed(true); CGeoMap.startActivityLiveMap(this); } @@ -573,7 +559,7 @@ public class MainActivity extends AbstractActivity { * @param v * unused here but needed since this method is referenced from XML layout */ - public void cgeoFindNearest(View v) { + public void cgeoFindNearest(final View v) { if (app.currentGeo().getCoords() == null) { return; } @@ -586,7 +572,7 @@ public class MainActivity extends AbstractActivity { * @param v * unused here but needed since this method is referenced from XML layout */ - public void cgeoFindByOffline(View v) { + public void cgeoFindByOffline(final View v) { findByOffline.setPressed(true); cgeocaches.startActivityOffline(this); } @@ -595,7 +581,7 @@ public class MainActivity extends AbstractActivity { * @param v * unused here but needed since this method is referenced from XML layout */ - public void cgeoSearch(View v) { + public void cgeoSearch(final View v) { advanced.setPressed(true); startActivity(new Intent(this, SearchActivity.class)); } @@ -604,7 +590,7 @@ public class MainActivity extends AbstractActivity { * @param v * unused here but needed since this method is referenced from XML layout */ - public void cgeoPoint(View v) { + public void cgeoPoint(final View v) { any.setPressed(true); startActivity(new Intent(this, NavigateAnyPointActivity.class)); } @@ -613,7 +599,7 @@ public class MainActivity extends AbstractActivity { * @param v * unused here but needed since this method is referenced from XML layout */ - public void cgeoFilter(View v) { + public void cgeoFilter(final View v) { filter.setPressed(true); filter.performClick(); } @@ -622,7 +608,7 @@ public class MainActivity extends AbstractActivity { * @param v * unused here but needed since this method is referenced from XML layout */ - public void cgeoNavSettings(View v) { + public void cgeoNavSettings(final View v) { startActivity(new Intent(android.provider.Settings.ACTION_LOCATION_SOURCE_SETTINGS)); } @@ -630,7 +616,7 @@ public class MainActivity extends AbstractActivity { private Handler countBubbleHandler = new Handler() { @Override - public void handleMessage(Message msg) { + public void handleMessage(final Message msg) { try { if (countBubbleCnt == 0) { countBubble.setVisibility(View.GONE); @@ -747,7 +733,7 @@ public class MainActivity extends AbstractActivity { * @param view * unused here but needed since this method is referenced from XML layout */ - public void showAbout(View view) { + public void showAbout(final View view) { AboutActivity_.intent(this).start(); } @@ -755,7 +741,7 @@ public class MainActivity extends AbstractActivity { * @param view * unused here but needed since this method is referenced from XML layout */ - public void goSearch(View view) { + public void goSearch(final View view) { onSearchRequested(); } diff --git a/main/src/cgeo/geocaching/NavigateAnyPointActivity.java b/main/src/cgeo/geocaching/NavigateAnyPointActivity.java index e7ffc3b..be4ef05 100644 --- a/main/src/cgeo/geocaching/NavigateAnyPointActivity.java +++ b/main/src/cgeo/geocaching/NavigateAnyPointActivity.java @@ -62,7 +62,7 @@ public class NavigateAnyPointActivity extends AbstractActivity { private int contextMenuItemPosition; - private String distanceUnit = ""; + private String distanceUnit = StringUtils.EMPTY; protected static class ViewHolder extends AbstractViewHolder { @InjectView(R.id.simple_way_point_longitude) protected TextView longitude; diff --git a/main/src/cgeo/geocaching/SearchActivity.java b/main/src/cgeo/geocaching/SearchActivity.java index 6285cda..ccf3edf 100644 --- a/main/src/cgeo/geocaching/SearchActivity.java +++ b/main/src/cgeo/geocaching/SearchActivity.java @@ -149,7 +149,6 @@ public class SearchActivity extends AbstractActivity { } private void init() { - Settings.getGcLogin(); buttonLatitude.setOnClickListener(new FindByCoordsAction()); buttonLongitude.setOnClickListener(new FindByCoordsAction()); diff --git a/main/src/cgeo/geocaching/StaticMapsActivity.java b/main/src/cgeo/geocaching/StaticMapsActivity.java index 4658262..2268df9 100644 --- a/main/src/cgeo/geocaching/StaticMapsActivity.java +++ b/main/src/cgeo/geocaching/StaticMapsActivity.java @@ -33,7 +33,7 @@ public class StaticMapsActivity extends AbstractActivity { private static final String EXTRAS_GEOCODE = "geocode"; @Extra(EXTRAS_DOWNLOAD) boolean download = false; - @Extra(EXTRAS_WAYPOINT) Integer waypoint_id = null; + @Extra(EXTRAS_WAYPOINT) Integer waypointId = null; @Extra(EXTRAS_GEOCODE) String geocode = null; private final List<Bitmap> maps = new ArrayList<Bitmap>(); @@ -43,7 +43,7 @@ public class StaticMapsActivity extends AbstractActivity { private final Handler loadMapsHandler = new Handler() { @Override - public void handleMessage(Message msg) { + public void handleMessage(final Message msg) { if (waitDialog != null) { waitDialog.dismiss(); } @@ -92,7 +92,7 @@ public class StaticMapsActivity extends AbstractActivity { } @Override - public void onCreate(Bundle savedInstanceState) { + public void onCreate(final Bundle savedInstanceState) { super.onCreate(savedInstanceState, R.layout.staticmaps_activity); if (geocode == null) { @@ -107,12 +107,6 @@ public class StaticMapsActivity extends AbstractActivity { (new LoadMapsThread()).start(); } - @Override - public void onResume() { - super.onResume(); - - } - private class LoadMapsThread extends Thread { @Override @@ -120,11 +114,11 @@ public class StaticMapsActivity extends AbstractActivity { try { // try downloading 2 times for (int trials = 0; trials < 2; trials++) { - for (int level = 1; level <= 5; level++) { + for (int level = 1; level <= StaticMapsProvider.MAPS_LEVEL_MAX; level++) { try { - if (waypoint_id != null) { + if (waypointId != null) { final Geocache cache = cgData.loadCache(geocode, LoadFlags.LOAD_CACHE_OR_DB); - final Bitmap image = StaticMapsProvider.getWaypointMap(geocode, cache.getWaypointById(waypoint_id), level); + final Bitmap image = StaticMapsProvider.getWaypointMap(geocode, cache.getWaypointById(waypointId), level); if (image != null) { maps.add(image); } @@ -158,12 +152,12 @@ public class StaticMapsActivity extends AbstractActivity { private boolean downloadStaticMaps() { final Geocache cache = cgData.loadCache(geocode, LoadFlags.LOAD_CACHE_OR_DB); - if (waypoint_id == null) { + if (waypointId == null) { showToast(res.getString(R.string.info_storing_static_maps)); StaticMapsProvider.storeCacheStaticMap(cache, true); return cache.hasStaticMap(); } - final Waypoint waypoint = cache.getWaypointById(waypoint_id); + final Waypoint waypoint = cache.getWaypointById(waypointId); if (waypoint != null) { showToast(res.getString(R.string.info_storing_static_maps)); // refresh always removes old waypoint files @@ -178,7 +172,7 @@ public class StaticMapsActivity extends AbstractActivity { public static void startActivity(final Context activity, final String geocode, final boolean download, final Waypoint waypoint) { StaticMapsActivity_.IntentBuilder_ builder = StaticMapsActivity_.intent(activity).geocode(geocode).download(download); if (waypoint != null) { - builder.waypoint_id(waypoint.getId()); + builder.waypointId(waypoint.getId()); } builder.start(); } diff --git a/main/src/cgeo/geocaching/StaticMapsProvider.java b/main/src/cgeo/geocaching/StaticMapsProvider.java index 041e703..2555b80 100644 --- a/main/src/cgeo/geocaching/StaticMapsProvider.java +++ b/main/src/cgeo/geocaching/StaticMapsProvider.java @@ -24,7 +24,8 @@ import android.view.WindowManager; import java.io.File; import java.util.concurrent.TimeUnit; -public class StaticMapsProvider { +public final class StaticMapsProvider { + static final int MAPS_LEVEL_MAX = 5; private static final String PREFIX_PREVIEW = "preview"; private static final String GOOGLE_STATICMAP_URL = "http://maps.google.com/maps/api/staticmap"; private static final String SATELLITE = "satellite"; @@ -32,16 +33,22 @@ public class StaticMapsProvider { private static final String WAYPOINT_PREFIX = "wp"; private static final String MAP_FILENAME_PREFIX = "map_"; private static final String MARKERS_URL = "http://status.cgeo.org/assets/markers/"; - /** We assume there is no real usable image with less than 1k */ + + /** We assume there is no real usable image with less than 1k. */ private static final int MIN_MAP_IMAGE_BYTES = 1000; + /** ThreadPool restricting this to 1 Thread. **/ - private static final BlockingThreadPool pool = new BlockingThreadPool(1, Thread.MIN_PRIORITY); + private static final BlockingThreadPool POOL = new BlockingThreadPool(1, Thread.MIN_PRIORITY); + + private StaticMapsProvider() { + // utility class + } - private static File getMapFile(final String geocode, String prefix, final boolean createDirs) { + private static File getMapFile(final String geocode, final 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) { + private static void downloadDifferentZooms(final String geocode, final String markerUrl, final String prefix, final String latlonMap, final int edge, final Parameters 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); @@ -49,7 +56,7 @@ public class StaticMapsProvider { 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, String shadow, String latlonMap, int width, int height, final Parameters waypoints) { + private static void downloadMap(final String geocode, final int zoom, final String mapType, final String markerUrl, final String prefix, final String shadow, final String latlonMap, final int width, final int height, final Parameters waypoints) { final Parameters params = new Parameters( "center", latlonMap, "zoom", String.valueOf(zoom), @@ -80,7 +87,7 @@ public class StaticMapsProvider { } } - public static void downloadMaps(Geocache cache) { + public static void downloadMaps(final Geocache cache) { if ((!Settings.isStoreOfflineMaps() && !Settings.isStoreOfflineWpMaps()) || StringUtils.isBlank(cache.getGeocode())) { return; } @@ -110,19 +117,19 @@ public class StaticMapsProvider { * @param edge * The boundings */ - private static void refreshAllWpStaticMaps(Geocache cache, int edge) { + private static void refreshAllWpStaticMaps(final Geocache cache, final int edge) { LocalStorage.deleteFilesWithPrefix(cache.getGeocode(), MAP_FILENAME_PREFIX + WAYPOINT_PREFIX); for (Waypoint waypoint : cache.getWaypoints()) { storeWaypointStaticMap(cache.getGeocode(), edge, waypoint, false); } } - public static void storeWaypointStaticMap(Geocache cache, Waypoint waypoint, boolean waitForResult) { + public static void storeWaypointStaticMap(final Geocache cache, final Waypoint waypoint, final boolean waitForResult) { int edge = StaticMapsProvider.guessMaxDisplaySide(); storeWaypointStaticMap(cache.getGeocode(), edge, waypoint, waitForResult); } - private static void storeWaypointStaticMap(final String geocode, int edge, Waypoint waypoint, final boolean waitForResult) { + private static void storeWaypointStaticMap(final String geocode, final int edge, final Waypoint waypoint, final boolean waitForResult) { if (geocode == null) { Log.e("storeWaypointStaticMap - missing input parameter geocode"); return; @@ -142,7 +149,7 @@ public class StaticMapsProvider { } } - public static void storeCacheStaticMap(Geocache cache, final boolean waitForResult) { + public static void storeCacheStaticMap(final Geocache cache, final boolean waitForResult) { int edge = guessMaxDisplaySide(); storeCacheStaticMap(cache, edge, waitForResult); } @@ -179,7 +186,7 @@ public class StaticMapsProvider { } private static void downloadMaps(final String geocode, final String markerUrl, final String prefix, final String latlonMap, final int edge, - final Parameters waypoints, boolean waitForResult) { + final Parameters waypoints, final boolean waitForResult) { if (waitForResult) { downloadDifferentZooms(geocode, markerUrl, prefix, latlonMap, edge, waypoints); } @@ -191,7 +198,7 @@ public class StaticMapsProvider { } }; try { - pool.add(currentTask, 20, TimeUnit.SECONDS); + POOL.add(currentTask, 20, TimeUnit.SECONDS); } catch (InterruptedException e) { Log.e("StaticMapsProvider.downloadMaps error adding task", e); } @@ -215,13 +222,13 @@ public class StaticMapsProvider { return MARKERS_URL + "marker_waypoint_" + type + ".png"; } - public static void removeWpStaticMaps(Waypoint waypoint, final String geocode) { + public static void removeWpStaticMaps(final Waypoint waypoint, final String geocode) { if (waypoint == null) { return; } int waypointId = waypoint.getId(); int waypointMapHash = waypoint.getStaticMapsHashcode(); - for (int level = 1; level <= 5; level++) { + for (int level = 1; level <= MAPS_LEVEL_MAX; level++) { try { StaticMapsProvider.getMapFile(geocode, WAYPOINT_PREFIX + waypointId + "_" + waypointMapHash + '_' + level, false).delete(); } catch (Exception e) { @@ -244,7 +251,7 @@ public class StaticMapsProvider { if (StringUtils.isBlank(geocode)) { return false; } - for (int level = 1; level <= 5; level++) { + for (int level = 1; level <= MAPS_LEVEL_MAX; level++) { File mapFile = StaticMapsProvider.getMapFile(geocode, String.valueOf(level), false); if (mapFile.exists()) { return true; @@ -260,10 +267,10 @@ public class StaticMapsProvider { * @param waypoint * @return <code>true</code> if at least one map file exists; <code>false</code> otherwise */ - public static boolean hasStaticMapForWaypoint(String geocode, Waypoint waypoint) { + public static boolean hasStaticMapForWaypoint(final String geocode, final Waypoint waypoint) { int waypointId = waypoint.getId(); int waypointMapHash = waypoint.getStaticMapsHashcode(); - for (int level = 1; level <= 5; level++) { + for (int level = 1; level <= MAPS_LEVEL_MAX; level++) { File mapFile = StaticMapsProvider.getMapFile(geocode, WAYPOINT_PREFIX + waypointId + "_" + waypointMapHash + "_" + level, false); if (mapFile.exists()) { return true; @@ -279,10 +286,10 @@ public class StaticMapsProvider { * @param waypoint * @return <code>true</code> if all map files exist; <code>false</code> otherwise */ - public static boolean hasAllStaticMapsForWaypoint(String geocode, Waypoint waypoint) { + public static boolean hasAllStaticMapsForWaypoint(final String geocode, final Waypoint waypoint) { int waypointId = waypoint.getId(); int waypointMapHash = waypoint.getStaticMapsHashcode(); - for (int level = 1; level <= 5; level++) { + for (int level = 1; level <= MAPS_LEVEL_MAX; level++) { File mapFile = StaticMapsProvider.getMapFile(geocode, WAYPOINT_PREFIX + waypointId + "_" + waypointMapHash + "_" + level, false); boolean mapExists = mapFile.exists(); if (!mapExists) { @@ -296,13 +303,13 @@ public class StaticMapsProvider { return decodeFile(StaticMapsProvider.getMapFile(geocode, PREFIX_PREVIEW, false)); } - public static Bitmap getWaypointMap(final String geocode, Waypoint waypoint, int level) { + public static Bitmap getWaypointMap(final String geocode, final Waypoint waypoint, final int level) { int waypointId = waypoint.getId(); int waypointMapHash = waypoint.getStaticMapsHashcode(); return decodeFile(StaticMapsProvider.getMapFile(geocode, WAYPOINT_PREFIX + waypointId + "_" + waypointMapHash + "_" + level, false)); } - public static Bitmap getCacheMap(final String geocode, int level) { + public static Bitmap getCacheMap(final String geocode, final int level) { return decodeFile(StaticMapsProvider.getMapFile(geocode, String.valueOf(level), false)); } diff --git a/main/src/cgeo/geocaching/apps/AbstractApp.java b/main/src/cgeo/geocaching/apps/AbstractApp.java index 4d7abde..7b6b3d9 100644 --- a/main/src/cgeo/geocaching/apps/AbstractApp.java +++ b/main/src/cgeo/geocaching/apps/AbstractApp.java @@ -1,7 +1,6 @@ package cgeo.geocaching.apps; import cgeo.geocaching.Geocache; -import cgeo.geocaching.MainActivity; import cgeo.geocaching.cgeoapplication; import cgeo.geocaching.utils.ProcessUtils; @@ -31,7 +30,7 @@ public abstract class AbstractApp implements App { if (StringUtils.isNotEmpty(packageName) && ProcessUtils.isLaunchable(packageName)) { return true; } - return MainActivity.isIntentAvailable(intent); + return ProcessUtils.isIntentAvailable(intent); } protected Intent getLaunchIntent() { diff --git a/main/src/cgeo/geocaching/cgData.java b/main/src/cgeo/geocaching/cgData.java index ead698d..87710fb 100644 --- a/main/src/cgeo/geocaching/cgData.java +++ b/main/src/cgeo/geocaching/cgData.java @@ -1102,7 +1102,6 @@ public class cgData { //try to update record else insert fresh.. database.beginTransaction(); - boolean result = false; try { saveAttributesWithoutTransaction(cache); saveOriginalWaypointsWithoutTransaction(cache); @@ -1118,14 +1117,14 @@ public class cgData { database.insert(dbTableCaches, null, values); } database.setTransactionSuccessful(); - result = true; + return true; } catch (Exception e) { Log.e("SaveCache", e); } finally { database.endTransaction(); } - return result; + return false; } private static void saveAttributesWithoutTransaction(final Geocache cache) { @@ -1172,17 +1171,16 @@ public class cgData { init(); database.beginTransaction(); - boolean result = false; try { saveOriginalWaypointsWithoutTransaction(cache); database.setTransactionSuccessful(); - result = true; + return true; } catch (Exception e) { Log.e("saveWaypoints", e); } finally { database.endTransaction(); } - return result; + return false; } private static void saveOriginalWaypointsWithoutTransaction(final Geocache cache) { @@ -1376,7 +1374,7 @@ public class cgData { } } - public static boolean saveTrackable(final Trackable trackable) { + public static void saveTrackable(final Trackable trackable) { init(); database.beginTransaction(); @@ -1386,8 +1384,6 @@ public class cgData { } finally { database.endTransaction(); } - - return true; } private static void saveInventoryWithoutTransaction(final String geocode, final List<Trackable> trackables) { @@ -1842,18 +1838,17 @@ public class cgData { init(); database.beginTransaction(); - boolean success = true; try { database.delete(dbTableSearchDestionationHistory, null, null); database.setTransactionSuccessful(); + return true; } catch (Exception e) { - success = false; Log.e("Unable to clear searched destinations", e); } finally { database.endTransaction(); } - return success; + return false; } public static List<LogEntry> loadLogs(String geocode) { @@ -2693,18 +2688,17 @@ public class cgData { init(); database.beginTransaction(); - boolean result = false; try { database.delete(dbTableSearchDestionationHistory, "_id = " + destination.getId(), null); database.setTransactionSuccessful(); - result = true; + return true; } catch (Exception e) { Log.e("Unable to remove searched destination", e); } finally { database.endTransaction(); } - return result; + return false; } /** @@ -3007,14 +3001,14 @@ public class cgData { if (connector.canHandle(geocode)) { Geocache geocache = cacheCache.getCacheFromCache(geocode); if (geocache.getZoomLevel() <= maxZoom) { - boolean bFound = false; + boolean found = false; for (Tile tile : tiles) { if (tile.containsPoint(geocache)) { - bFound = true; + found = true; break; } } - if (bFound) { + if (found) { missingFromSearch.add(geocode); } } diff --git a/main/src/cgeo/geocaching/connector/gc/GCConnector.java b/main/src/cgeo/geocaching/connector/gc/GCConnector.java index 44d6e8f..e6fff79 100644 --- a/main/src/cgeo/geocaching/connector/gc/GCConnector.java +++ b/main/src/cgeo/geocaching/connector/gc/GCConnector.java @@ -309,7 +309,7 @@ public class GCConnector extends AbstractConnector implements ISearchByGeocode, // invoke settings activity to insert login details if (status == StatusCode.NO_LOGIN_INFO_STORED && fromActivity != null) { - SettingsActivity.startWithServicesPage(fromActivity); + SettingsActivity.jumpToServicesPage(fromActivity); } } return status == StatusCode.NO_ERROR; diff --git a/main/src/cgeo/geocaching/connector/gc/GCConstants.java b/main/src/cgeo/geocaching/connector/gc/GCConstants.java index d908b47..c2aeffd 100644 --- a/main/src/cgeo/geocaching/connector/gc/GCConstants.java +++ b/main/src/cgeo/geocaching/connector/gc/GCConstants.java @@ -127,6 +127,7 @@ public final class GCConstants { public final static Pattern PATTERN_SEARCH_TOTALCOUNT = Pattern.compile("<span>Total Records\\D*(\\d+)<"); public final static Pattern PATTERN_SEARCH_RECAPTCHA = Pattern.compile("<script[^>]*src=\"[^\"]*/recaptcha/api/challenge\\?k=([^\"]+)\"[^>]*>"); public final static Pattern PATTERN_SEARCH_RECAPTCHACHALLENGE = Pattern.compile("challenge : '([^']+)'"); + public final static Pattern PATTERN_SEARCH_HIDDEN_DATE = Pattern.compile("<span class=\"small\">([\\d-/]{6,10})</span>"); /** * Patterns for waypoints diff --git a/main/src/cgeo/geocaching/connector/gc/GCParser.java b/main/src/cgeo/geocaching/connector/gc/GCParser.java index 9ecb51b..e32f72d 100644 --- a/main/src/cgeo/geocaching/connector/gc/GCParser.java +++ b/main/src/cgeo/geocaching/connector/gc/GCParser.java @@ -5,7 +5,6 @@ import cgeo.geocaching.Image; import cgeo.geocaching.LogEntry; import cgeo.geocaching.R; import cgeo.geocaching.SearchResult; -import cgeo.geocaching.settings.Settings; import cgeo.geocaching.Trackable; import cgeo.geocaching.TrackableLog; import cgeo.geocaching.Waypoint; @@ -27,6 +26,7 @@ import cgeo.geocaching.geopoint.Geopoint; import cgeo.geocaching.loaders.RecaptchaReceiver; import cgeo.geocaching.network.Network; import cgeo.geocaching.network.Parameters; +import cgeo.geocaching.settings.Settings; import cgeo.geocaching.ui.DirectionImage; import cgeo.geocaching.utils.CancellableHandler; import cgeo.geocaching.utils.Log; @@ -53,6 +53,7 @@ import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Calendar; import java.util.Collections; +import java.util.Date; import java.util.EnumSet; import java.util.GregorianCalendar; import java.util.List; @@ -199,6 +200,19 @@ public abstract class GCParser { final String container = TextUtils.getMatch(row, GCConstants.PATTERN_SEARCH_CONTAINER, false, 1, null, false); cache.setSize(CacheSize.getById(container)); + // date hidden, makes sorting event caches easier + final String dateHidden = TextUtils.getMatch(row, GCConstants.PATTERN_SEARCH_HIDDEN_DATE, false, 1, null, false); + if (StringUtils.isNotBlank(dateHidden)) { + try { + Date date = Login.parseGcCustomDate(dateHidden); + if (date != null) { + cache.setHidden(date); + } + } catch (ParseException e) { + Log.e("Error parsing event date from search"); + } + } + // cache inventory final MatcherWrapper matcherTbs = new MatcherWrapper(GCConstants.PATTERN_SEARCH_TRACKABLES, row); String inventoryPre = null; diff --git a/main/src/cgeo/geocaching/connector/gc/Login.java b/main/src/cgeo/geocaching/connector/gc/Login.java index 4b4c93f..2b32ba9 100644 --- a/main/src/cgeo/geocaching/connector/gc/Login.java +++ b/main/src/cgeo/geocaching/connector/gc/Login.java @@ -1,13 +1,13 @@ package cgeo.geocaching.connector.gc; import cgeo.geocaching.R; -import cgeo.geocaching.settings.Settings; import cgeo.geocaching.cgeoapplication; import cgeo.geocaching.enumerations.StatusCode; import cgeo.geocaching.network.Cookies; import cgeo.geocaching.network.HtmlImage; import cgeo.geocaching.network.Network; import cgeo.geocaching.network.Parameters; +import cgeo.geocaching.settings.Settings; import cgeo.geocaching.utils.Log; import cgeo.geocaching.utils.MatcherWrapper; import cgeo.geocaching.utils.TextUtils; @@ -68,7 +68,7 @@ public abstract class Login { private static StatusCode login(boolean retry) { final ImmutablePair<String, String> login = Settings.getGcLogin(); - if (login == null || StringUtils.isEmpty(login.left) || StringUtils.isEmpty(login.right)) { + if (StringUtils.isEmpty(login.left) || StringUtils.isEmpty(login.right)) { Login.setActualStatus(cgeoapplication.getInstance().getString(R.string.err_login)); Log.e("Login.login: No login information stored"); return StatusCode.NO_LOGIN_INFO_STORED; @@ -475,7 +475,7 @@ public abstract class Login { /** * Unfortunately the cache details page contains user generated whitespace in the personal note, therefore we cannot * remove the white space from cache details pages. - * + * * @param uri * @return */ diff --git a/main/src/cgeo/geocaching/connector/gc/Tile.java b/main/src/cgeo/geocaching/connector/gc/Tile.java index ec90036..3177f2c 100644 --- a/main/src/cgeo/geocaching/connector/gc/Tile.java +++ b/main/src/cgeo/geocaching/connector/gc/Tile.java @@ -324,6 +324,10 @@ public class Tile { public static void add(final Tile tile) { tileCache.put(tile.hashCode(), tile); } + + public static void clear() { + tileCache.clear(); + } } } diff --git a/main/src/cgeo/geocaching/connector/oc/OkapiLoggingManager.java b/main/src/cgeo/geocaching/connector/oc/OkapiLoggingManager.java index 22cb9dd..c995975 100644 --- a/main/src/cgeo/geocaching/connector/oc/OkapiLoggingManager.java +++ b/main/src/cgeo/geocaching/connector/oc/OkapiLoggingManager.java @@ -23,7 +23,7 @@ public class OkapiLoggingManager implements ILoggingManager { private final Geocache cache; private LogCacheActivity activity; - private final static List<LogType> standardLogTypes = Arrays.asList(LogType.FOUND_IT, LogType.DIDNT_FIND_IT, LogType.NOTE, LogType.NEEDS_MAINTENANCE); + private final static List<LogType> standardLogTypes = Arrays.asList(LogType.FOUND_IT, LogType.DIDNT_FIND_IT, LogType.NOTE); private final static List<LogType> eventLogTypes = Arrays.asList(LogType.WILL_ATTEND, LogType.ATTENDED, LogType.NOTE); public OkapiLoggingManager(Activity activity, OCApiLiveConnector connector, Geocache cache) { diff --git a/main/src/cgeo/geocaching/export/FieldnoteExport.java b/main/src/cgeo/geocaching/export/FieldnoteExport.java index 38b603c..9d0310c 100644 --- a/main/src/cgeo/geocaching/export/FieldnoteExport.java +++ b/main/src/cgeo/geocaching/export/FieldnoteExport.java @@ -9,6 +9,8 @@ import cgeo.geocaching.connector.gc.Login; import cgeo.geocaching.enumerations.StatusCode; import cgeo.geocaching.network.Network; import cgeo.geocaching.network.Parameters; +import cgeo.geocaching.settings.Settings; +import cgeo.geocaching.ui.Formatter; import cgeo.geocaching.utils.AsyncTaskWithProgress; import cgeo.geocaching.utils.IOUtils; import cgeo.geocaching.utils.Log; @@ -79,12 +81,9 @@ class FieldnoteExport extends AbstractExport { final CheckBox uploadOption = (CheckBox) layout.findViewById(R.id.upload); final CheckBox onlyNewOption = (CheckBox) layout.findViewById(R.id.onlynew); - uploadOption.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - onlyNewOption.setEnabled(uploadOption.isChecked()); - } - }); + if (Settings.getFieldnoteExportDate() > 0) { + onlyNewOption.setText(getString(R.string.export_fieldnotes_onlynew) + "\n(" + Formatter.formatShortDateTime(activity, Settings.getFieldnoteExportDate()) + ')'); + } builder.setPositiveButton(R.string.export, new DialogInterface.OnClickListener() { @@ -134,7 +133,10 @@ class FieldnoteExport extends AbstractExport { int i = 0; for (final Geocache cache : caches) { if (cache.isLogOffline()) { - appendFieldNote(fieldNoteBuffer, cache, cgData.loadLogOffline(cache.getGeocode())); + final LogEntry log = cgData.loadLogOffline(cache.getGeocode()); + if (!onlyNew || onlyNew && log.date > Settings.getFieldnoteExportDate()) { + appendFieldNote(fieldNoteBuffer, cache, log); + } publishProgress(++i); } } @@ -195,10 +197,6 @@ class FieldnoteExport extends AbstractExport { "__EVENTARGUMENT", "", "ctl00$ContentBody$btnUpload", "Upload Field Note"); - if (onlyNew) { - uploadParams.put("ctl00$ContentBody$chkSuppressDate", "on"); - } - Login.putViewstates(uploadParams, viewstates); Network.getResponseData(Network.postRequest(uri, uploadParams, "ctl00$ContentBody$FieldNoteLoader", "text/plain", exportFile)); @@ -216,9 +214,7 @@ class FieldnoteExport extends AbstractExport { protected void onPostExecuteInternal(Boolean result) { if (null != activity) { if (result) { - // if (onlyNew) { - // // update last export time in settings when doing it ourself (currently we use the date check from gc.com) - // } + Settings.setFieldnoteExportDate(System.currentTimeMillis()); ActivityMixin.showToast(activity, getName() + ' ' + getString(R.string.export_exportedto) + ": " + exportFile.toString()); diff --git a/main/src/cgeo/geocaching/filter/AbstractFilter.java b/main/src/cgeo/geocaching/filter/AbstractFilter.java index bc99959..6bd8587 100644 --- a/main/src/cgeo/geocaching/filter/AbstractFilter.java +++ b/main/src/cgeo/geocaching/filter/AbstractFilter.java @@ -8,12 +8,12 @@ import java.util.List; abstract class AbstractFilter implements IFilter { private final String name; - protected AbstractFilter(String name) { + protected AbstractFilter(final String name) { this.name = name; } @Override - public void filter(List<Geocache> list) { + public void filter(final List<Geocache> list) { final List<Geocache> itemsToRemove = new ArrayList<Geocache>(); for (Geocache item : list) { if (!accepts(item)) { @@ -30,7 +30,7 @@ abstract class AbstractFilter implements IFilter { /* * show name in array adapter - * + * * @see java.lang.Object#toString() */ @Override diff --git a/main/src/cgeo/geocaching/filter/AbstractRangeFilter.java b/main/src/cgeo/geocaching/filter/AbstractRangeFilter.java index e84174a..96d256a 100644 --- a/main/src/cgeo/geocaching/filter/AbstractRangeFilter.java +++ b/main/src/cgeo/geocaching/filter/AbstractRangeFilter.java @@ -8,7 +8,7 @@ abstract class AbstractRangeFilter extends AbstractFilter { protected final float rangeMin; protected final float rangeMax; - protected AbstractRangeFilter(int ressourceId, int range) { + protected AbstractRangeFilter(final int ressourceId, final int range) { super(cgeoapplication.getInstance().getResources().getString(ressourceId) + ' ' + (range == 5 ? '5' : range + " + " + String.format("%.1f", range + 0.5))); this.rangeMin = range; rangeMax = rangeMin + 1f; diff --git a/main/src/cgeo/geocaching/filter/DifficultyFilter.java b/main/src/cgeo/geocaching/filter/DifficultyFilter.java index 8099a51..438c25a 100644 --- a/main/src/cgeo/geocaching/filter/DifficultyFilter.java +++ b/main/src/cgeo/geocaching/filter/DifficultyFilter.java @@ -8,21 +8,25 @@ import java.util.List; class DifficultyFilter extends AbstractRangeFilter { - public DifficultyFilter(int difficulty) { + public DifficultyFilter(final int difficulty) { super(R.string.cache_difficulty, difficulty); } @Override - public boolean accepts(Geocache cache) { - return rangeMin <= cache.getDifficulty() && cache.getDifficulty() < rangeMax; + public boolean accepts(final Geocache cache) { + final float difficulty = cache.getDifficulty(); + return rangeMin <= difficulty && difficulty < rangeMax; } public static class Factory implements IFilterFactory { + private static final int DIFFICULTY_MIN = 1; + private static final int DIFFICULTY_MAX = 5; + @Override public List<IFilter> getFilters() { - final ArrayList<IFilter> filters = new ArrayList<IFilter>(5); - for (int difficulty = 1; difficulty <= 5; difficulty++) { + final ArrayList<IFilter> filters = new ArrayList<IFilter>(DIFFICULTY_MAX); + for (int difficulty = DIFFICULTY_MIN; difficulty <= DIFFICULTY_MAX; difficulty++) { filters.add(new DifficultyFilter(difficulty)); } return filters; diff --git a/main/src/cgeo/geocaching/filter/DistanceFilter.java b/main/src/cgeo/geocaching/filter/DistanceFilter.java new file mode 100644 index 0000000..86b09c7 --- /dev/null +++ b/main/src/cgeo/geocaching/filter/DistanceFilter.java @@ -0,0 +1,56 @@ +package cgeo.geocaching.filter; + +import cgeo.geocaching.Geocache; +import cgeo.geocaching.IGeoData; +import cgeo.geocaching.R; +import cgeo.geocaching.cgeoapplication; +import cgeo.geocaching.geopoint.Geopoint; + +import java.util.ArrayList; +import java.util.List; + +class DistanceFilter extends AbstractFilter { + private final IGeoData geo; + private final int minDistance; + private final int maxDistance; + + public DistanceFilter(String name, final int minDistance, final int maxDistance) { + super(name); + this.minDistance = minDistance; + this.maxDistance = maxDistance; + geo = cgeoapplication.getInstance().currentGeo(); + } + + @Override + public boolean accepts(final Geocache cache) { + final Geopoint currentPos = new Geopoint(geo.getLocation()); + final float distance = currentPos.distanceTo(cache.getCoords()); + + return (distance >= minDistance) && (distance <= maxDistance); + } + + public static class Factory implements IFilterFactory { + + private static final int[] KILOMETERS = { 0, 2, 5, 10, 20, 50 }; + + @Override + public List<IFilter> getFilters() { + final List<IFilter> filters = new ArrayList<IFilter>(KILOMETERS.length); + for (int i = 0; i < KILOMETERS.length; i++) { + final int minRange = KILOMETERS[i]; + final int maxRange; + if (i < KILOMETERS.length - 1) { + maxRange = KILOMETERS[i + 1]; + } + else { + maxRange = Integer.MAX_VALUE; + } + final String range = maxRange == Integer.MAX_VALUE ? "> " + String.valueOf(minRange) : String.valueOf(minRange) + " - " + String.valueOf(maxRange); + final String name = cgeoapplication.getInstance().getResources().getQuantityString(R.plurals.tts_kilometers, maxRange, range); + filters.add(new DistanceFilter(name, minRange, maxRange)); + } + return filters; + } + + } +} diff --git a/main/src/cgeo/geocaching/filter/FilterUserInterface.java b/main/src/cgeo/geocaching/filter/FilterUserInterface.java index 6c9c045..2404f44 100644 --- a/main/src/cgeo/geocaching/filter/FilterUserInterface.java +++ b/main/src/cgeo/geocaching/filter/FilterUserInterface.java @@ -1,9 +1,9 @@ package cgeo.geocaching.filter; import cgeo.geocaching.R; -import cgeo.geocaching.settings.Settings; import cgeo.geocaching.cgeoapplication; import cgeo.geocaching.enumerations.CacheType; +import cgeo.geocaching.settings.Settings; import cgeo.geocaching.utils.Log; import cgeo.geocaching.utils.RunnableWithArgument; @@ -55,12 +55,13 @@ public final class FilterUserInterface { register(R.string.caches_filter_track, TrackablesFilter.class); register(R.string.caches_filter_modified, ModifiedFilter.class); register(R.string.caches_filter_origin, OriginFilter.Factory.class); + register(R.string.caches_filter_distance, DistanceFilter.Factory.class); // sort by localized names Collections.sort(registry, new Comparator<FactoryEntry>() { @Override - public int compare(FactoryEntry lhs, FactoryEntry rhs) { + public int compare(final FactoryEntry lhs, final FactoryEntry rhs) { return lhs.name.compareToIgnoreCase(rhs.name); } }); @@ -69,7 +70,7 @@ public final class FilterUserInterface { register(R.string.caches_filter_clear, null); } - private void register(int resourceId, Class<? extends IFilterFactory> factoryClass) { + private void register(final int resourceId, final Class<? extends IFilterFactory> factoryClass) { registry.add(new FactoryEntry(res.getString(resourceId), factoryClass)); } @@ -81,7 +82,7 @@ public final class FilterUserInterface { builder.setAdapter(adapter, new DialogInterface.OnClickListener() { @Override - public void onClick(DialogInterface dialog, int itemIndex) { + public void onClick(final DialogInterface dialog, final int itemIndex) { FactoryEntry entry = adapter.getItem(itemIndex); // reset? if (entry.filterFactory == null) { @@ -114,7 +115,7 @@ public final class FilterUserInterface { final ArrayAdapter<IFilter> adapter = new ArrayAdapter<IFilter>(activity, android.R.layout.select_dialog_item, filters); builder.setAdapter(adapter, new DialogInterface.OnClickListener() { @Override - public void onClick(DialogInterface dialog, int item) { + public void onClick(final DialogInterface dialog, final int item) { runAfterwards.run(filters.get(item)); } }); diff --git a/main/src/cgeo/geocaching/filter/IFilter.java b/main/src/cgeo/geocaching/filter/IFilter.java index 4a428f8..4fafe6f 100644 --- a/main/src/cgeo/geocaching/filter/IFilter.java +++ b/main/src/cgeo/geocaching/filter/IFilter.java @@ -6,13 +6,13 @@ import java.util.List; public interface IFilter { - public abstract String getName(); + String getName(); /** * @param cache * @return true if the filter accepts the cache, false otherwise */ - public abstract boolean accepts(final Geocache cache); + boolean accepts(final Geocache cache); - public void filter(final List<Geocache> list); + void filter(final List<Geocache> list); }
\ No newline at end of file diff --git a/main/src/cgeo/geocaching/filter/IFilterFactory.java b/main/src/cgeo/geocaching/filter/IFilterFactory.java index e750639..afc99af 100644 --- a/main/src/cgeo/geocaching/filter/IFilterFactory.java +++ b/main/src/cgeo/geocaching/filter/IFilterFactory.java @@ -3,5 +3,5 @@ package cgeo.geocaching.filter; import java.util.List; interface IFilterFactory { - public List<? extends IFilter> getFilters(); + List<? extends IFilter> getFilters(); } diff --git a/main/src/cgeo/geocaching/filter/OriginFilter.java b/main/src/cgeo/geocaching/filter/OriginFilter.java index bd4e41e..8c54a4c 100644 --- a/main/src/cgeo/geocaching/filter/OriginFilter.java +++ b/main/src/cgeo/geocaching/filter/OriginFilter.java @@ -13,13 +13,13 @@ public class OriginFilter extends AbstractFilter { private final IConnector connector; - public OriginFilter(IConnector connector) { + public OriginFilter(final IConnector connector) { super(connector.getName()); this.connector = connector; } @Override - public boolean accepts(Geocache cache) { + public final boolean accepts(final Geocache cache) { return ConnectorFactory.getConnector(cache) == connector; } @@ -36,7 +36,7 @@ public class OriginFilter extends AbstractFilter { Collections.sort(filters, new Comparator<OriginFilter>() { @Override - public int compare(OriginFilter lhs, OriginFilter rhs) { + public int compare(final OriginFilter lhs, final OriginFilter rhs) { return lhs.getName().compareToIgnoreCase(rhs.getName()); } }); diff --git a/main/src/cgeo/geocaching/filter/SizeFilter.java b/main/src/cgeo/geocaching/filter/SizeFilter.java index 8ddc475..13c1d87 100644 --- a/main/src/cgeo/geocaching/filter/SizeFilter.java +++ b/main/src/cgeo/geocaching/filter/SizeFilter.java @@ -9,13 +9,13 @@ import java.util.List; class SizeFilter extends AbstractFilter { private final CacheSize cacheSize; - public SizeFilter(CacheSize cacheSize) { + public SizeFilter(final CacheSize cacheSize) { super(cacheSize.id); this.cacheSize = cacheSize; } @Override - public boolean accepts(Geocache cache) { + public boolean accepts(final Geocache cache) { return cacheSize == cache.getSize(); } diff --git a/main/src/cgeo/geocaching/filter/StateFilter.java b/main/src/cgeo/geocaching/filter/StateFilter.java index e18128d..98589ab 100644 --- a/main/src/cgeo/geocaching/filter/StateFilter.java +++ b/main/src/cgeo/geocaching/filter/StateFilter.java @@ -13,9 +13,9 @@ import java.util.List; abstract class StateFilter extends AbstractFilter { - final static Resources res = cgeoapplication.getInstance().getResources(); + static final Resources res = cgeoapplication.getInstance().getResources(); - protected StateFilter(String name) { + protected StateFilter(final String name) { super(name); } @@ -26,7 +26,7 @@ abstract class StateFilter extends AbstractFilter { } @Override - public boolean accepts(Geocache cache) { + public boolean accepts(final Geocache cache) { return cache.isFound(); } @@ -38,7 +38,7 @@ abstract class StateFilter extends AbstractFilter { } @Override - public boolean accepts(Geocache cache) { + public boolean accepts(final Geocache cache) { return cache.isArchived(); } } @@ -49,7 +49,7 @@ abstract class StateFilter extends AbstractFilter { } @Override - public boolean accepts(Geocache cache) { + public boolean accepts(final Geocache cache) { return cache.isDisabled(); } } @@ -60,7 +60,7 @@ abstract class StateFilter extends AbstractFilter { } @Override - public boolean accepts(Geocache cache) { + public boolean accepts(final Geocache cache) { return cache.isPremiumMembersOnly(); } } @@ -71,7 +71,7 @@ abstract class StateFilter extends AbstractFilter { } @Override - public boolean accepts(Geocache cache) { + public boolean accepts(final Geocache cache) { return !cache.isPremiumMembersOnly(); } } @@ -82,7 +82,7 @@ abstract class StateFilter extends AbstractFilter { } @Override - public boolean accepts(Geocache cache) { + public boolean accepts(final Geocache cache) { return cache.isLogOffline(); } } @@ -93,7 +93,7 @@ abstract class StateFilter extends AbstractFilter { } @Override - public boolean accepts(Geocache cache) { + public boolean accepts(final Geocache cache) { return cache.isOffline(); } } @@ -104,7 +104,7 @@ abstract class StateFilter extends AbstractFilter { } @Override - public boolean accepts(Geocache cache) { + public boolean accepts(final Geocache cache) { return !cache.isOffline(); } } @@ -126,7 +126,7 @@ abstract class StateFilter extends AbstractFilter { Collections.sort(filters, new Comparator<StateFilter>() { @Override - public int compare(StateFilter filter1, StateFilter filter2) { + public int compare(final StateFilter filter1, final StateFilter filter2) { return filter1.getName().compareToIgnoreCase(filter2.getName()); } }); diff --git a/main/src/cgeo/geocaching/filter/TerrainFilter.java b/main/src/cgeo/geocaching/filter/TerrainFilter.java index 87372c6..d74f954 100644 --- a/main/src/cgeo/geocaching/filter/TerrainFilter.java +++ b/main/src/cgeo/geocaching/filter/TerrainFilter.java @@ -8,20 +8,24 @@ import java.util.List; class TerrainFilter extends AbstractRangeFilter { - public TerrainFilter(int terrain) { + public TerrainFilter(final int terrain) { super(R.string.cache_terrain, terrain); } @Override - public boolean accepts(Geocache cache) { - return rangeMin <= cache.getTerrain() && cache.getTerrain() < rangeMax; + public boolean accepts(final Geocache cache) { + final float terrain = cache.getTerrain(); + return rangeMin <= terrain && terrain < rangeMax; } public static class Factory implements IFilterFactory { + private static final int TERRAIN_MIN = 1; + private static final int TERRAIN_MAX = 5; + @Override public List<IFilter> getFilters() { - final ArrayList<IFilter> filters = new ArrayList<IFilter>(5); - for (int terrain = 1; terrain <= 5; terrain++) { + final ArrayList<IFilter> filters = new ArrayList<IFilter>(TERRAIN_MAX); + for (int terrain = TERRAIN_MIN; terrain <= TERRAIN_MAX; terrain++) { filters.add(new TerrainFilter(terrain)); } return filters; diff --git a/main/src/cgeo/geocaching/filter/TrackablesFilter.java b/main/src/cgeo/geocaching/filter/TrackablesFilter.java index 5eff8a7..74f43be 100644 --- a/main/src/cgeo/geocaching/filter/TrackablesFilter.java +++ b/main/src/cgeo/geocaching/filter/TrackablesFilter.java @@ -13,7 +13,7 @@ class TrackablesFilter extends AbstractFilter implements IFilterFactory { } @Override - public boolean accepts(Geocache cache) { + public boolean accepts(final Geocache cache) { return cache.hasTrackables(); } diff --git a/main/src/cgeo/geocaching/maps/CGeoMap.java b/main/src/cgeo/geocaching/maps/CGeoMap.java index 007f707..f892622 100644 --- a/main/src/cgeo/geocaching/maps/CGeoMap.java +++ b/main/src/cgeo/geocaching/maps/CGeoMap.java @@ -13,6 +13,7 @@ import cgeo.geocaching.cgeocaches; import cgeo.geocaching.activity.ActivityMixin; import cgeo.geocaching.connector.ConnectorFactory; import cgeo.geocaching.connector.gc.Login; +import cgeo.geocaching.connector.gc.Tile; import cgeo.geocaching.enumerations.CacheType; import cgeo.geocaching.enumerations.LiveMapStrategy.Strategy; import cgeo.geocaching.enumerations.LoadFlags; @@ -182,7 +183,7 @@ public class CGeoMap extends AbstractMap implements OnMapDragListener, ViewFacto /** Live mode enabled for map. **/ private boolean isLiveEnabled; // other things - private boolean liveChanged = false; // previous state for loadTimer + private boolean markersInvalidated = false; // previous state for loadTimer private boolean centered = false; // if map is already centered private boolean alreadyCentered = false; // -""- for setting my location private static Set<String> dirtyCaches = null; @@ -571,6 +572,13 @@ public class CGeoMap extends AbstractMap implements OnMapDragListener, ViewFacto item.setTitle(res.getString(R.string.map_live_enable)); } + item = menu.findItem(R.id.menu_mycaches_mode); // own & found caches + if (Settings.isExcludeMyCaches()) { + item.setTitle(res.getString(R.string.map_mycaches_show)); + } else { + item.setTitle(res.getString(R.string.map_mycaches_hide)); + } + final Set<String> geocodesInViewport = getGeocodesForCachesInViewport(); menu.findItem(R.id.menu_store_caches).setEnabled(!isLoading() && CollectionUtils.isNotEmpty(geocodesInViewport) && new SearchResult(geocodesInViewport).hasUnsavedCaches()); @@ -622,7 +630,7 @@ public class CGeoMap extends AbstractMap implements OnMapDragListener, ViewFacto if (mapMode == MapMode.LIVE) { Settings.setLiveMap(isLiveEnabled); } - liveChanged = true; + markersInvalidated = true; lastSearchResult = null; searchIntent = null; ActivityMixin.invalidateOptionsMenu(activity); @@ -670,6 +678,14 @@ public class CGeoMap extends AbstractMap implements OnMapDragListener, ViewFacto mapView.repaintRequired(overlayCaches); ActivityMixin.invalidateOptionsMenu(activity); return true; + case R.id.menu_mycaches_mode: + Settings.setExcludeMine(!Settings.isExcludeMyCaches()); + markersInvalidated = true; + ActivityMixin.invalidateOptionsMenu(activity); + if (!Settings.isExcludeMyCaches()) { + Tile.Cache.clear(); + } + return true; case R.id.menu_theme_mode: selectMapTheme(); return true; @@ -1018,7 +1034,7 @@ public class CGeoMap extends AbstractMap implements OnMapDragListener, ViewFacto // check if map moved or zoomed //TODO Portree Use Rectangle inside with bigger search window. That will stop reloading on every move - final boolean moved = liveChanged || (isLiveEnabled && !downloaded) || (viewport == null) || zoomNow != zoom || + final boolean moved = markersInvalidated || (isLiveEnabled && !downloaded) || (viewport == null) || zoomNow != zoom || (mapMoved(viewport, viewportNow) && (cachesCnt <= 0 || CollectionUtils.isEmpty(caches) || !viewport.includes(viewportNow))); // update title on any change @@ -1029,7 +1045,7 @@ public class CGeoMap extends AbstractMap implements OnMapDragListener, ViewFacto // save new values if (moved) { - liveChanged = false; + markersInvalidated = false; long currentTime = System.currentTimeMillis(); diff --git a/main/src/cgeo/geocaching/network/Network.java b/main/src/cgeo/geocaching/network/Network.java index fc11dc8..2d2ab0b 100644 --- a/main/src/cgeo/geocaching/network/Network.java +++ b/main/src/cgeo/geocaching/network/Network.java @@ -319,8 +319,9 @@ public abstract class Network { final String etag = LocalStorage.getSavedHeader(cacheFile, LocalStorage.HEADER_ETAG); if (etag != null) { + // The ETag is a more robust check than a timestamp. If we have an ETag, it is enough + // to identify the right version of the resource. return new Parameters("If-None-Match", etag); - //FIXME: This seems to be wrong. Shouldn't we check for both headers instead of returning after finding the first? } final String lastModified = LocalStorage.getSavedHeader(cacheFile, LocalStorage.HEADER_LAST_MODIFIED); diff --git a/main/src/cgeo/geocaching/network/OAuthAuthorizationActivity.java b/main/src/cgeo/geocaching/network/OAuthAuthorizationActivity.java index 751443e..8dc8b03 100644 --- a/main/src/cgeo/geocaching/network/OAuthAuthorizationActivity.java +++ b/main/src/cgeo/geocaching/network/OAuthAuthorizationActivity.java @@ -82,6 +82,7 @@ public abstract class OAuthAuthorizationActivity extends AbstractActivity { pinEntryButton.setVisibility(View.GONE); + setResult(RESULT_OK); finish(); } else { showToast(getErrAuthProcess()); diff --git a/main/src/cgeo/geocaching/network/StatusUpdater.java b/main/src/cgeo/geocaching/network/StatusUpdater.java index d54f706..ee9bc31 100644 --- a/main/src/cgeo/geocaching/network/StatusUpdater.java +++ b/main/src/cgeo/geocaching/network/StatusUpdater.java @@ -31,7 +31,7 @@ public class StatusUpdater extends MemorySubject<StatusUpdater.Status> implement } final static public Status closeoutStatus = - new Status("", "status_closeout_warning", "attribute_abandonedbuilding", "http://www.cgeo.org/closeout/"); + new Status("", "status_closeout_warning", "attribute_abandonedbuilding", "http://faq.cgeo.org/#7_69"); final static public Status defaultStatus() { return VERSION.SDK_INT < VERSION_CODES.ECLAIR_MR1 ? closeoutStatus : null; diff --git a/main/src/cgeo/geocaching/settings/AuthorizeOcDePreference.java b/main/src/cgeo/geocaching/settings/AuthorizeOcDePreference.java index 4ef3086..28807eb 100644 --- a/main/src/cgeo/geocaching/settings/AuthorizeOcDePreference.java +++ b/main/src/cgeo/geocaching/settings/AuthorizeOcDePreference.java @@ -25,16 +25,21 @@ public class AuthorizeOcDePreference extends Preference { @Override protected View onCreateView(ViewGroup parent) { + final SettingsActivity activity = (SettingsActivity) getContext(); + setOnPreferenceClickListener(new OnPreferenceClickListener() { @Override public boolean onPreferenceClick(Preference preference) { Intent authIntent = new Intent(preference.getContext(), OCAuthorizationActivity.class); - preference.getContext().startActivity(authIntent); + activity.startActivityForResult(authIntent, + SettingsActivity.OAUTH_OCDE_REQUEST); return false; // no shared preference has to be changed } }); + + activity.setOCDEAuthTitle(); return super.onCreateView(parent); } } diff --git a/main/src/cgeo/geocaching/settings/AuthorizeTwitterPreference.java b/main/src/cgeo/geocaching/settings/AuthorizeTwitterPreference.java index 1a6d908..ed3e159 100644 --- a/main/src/cgeo/geocaching/settings/AuthorizeTwitterPreference.java +++ b/main/src/cgeo/geocaching/settings/AuthorizeTwitterPreference.java @@ -25,16 +25,21 @@ public class AuthorizeTwitterPreference extends Preference { @Override protected View onCreateView(ViewGroup parent) { + final SettingsActivity activity = (SettingsActivity) getContext(); + setOnPreferenceClickListener(new OnPreferenceClickListener() { @Override public boolean onPreferenceClick(Preference preference) { Intent authIntent = new Intent(preference.getContext(), TwitterAuthorizationActivity.class); - preference.getContext().startActivity(authIntent); + activity.startActivityForResult(authIntent, + SettingsActivity.OAUTH_TWITTER_REQUEST); return false; // no shared preference has to be changed } }); + + activity.setTwitterAuthTitle(); return super.onCreateView(parent); } } diff --git a/main/src/cgeo/geocaching/settings/CheckGcCredentialsPreference.java b/main/src/cgeo/geocaching/settings/CheckGcCredentialsPreference.java index 877a6c7..724ab80 100644 --- a/main/src/cgeo/geocaching/settings/CheckGcCredentialsPreference.java +++ b/main/src/cgeo/geocaching/settings/CheckGcCredentialsPreference.java @@ -1,6 +1,5 @@ package cgeo.geocaching.settings; -import cgeo.geocaching.settings.Settings; import cgeo.geocaching.R; import cgeo.geocaching.activity.ActivityMixin; import cgeo.geocaching.connector.gc.Login; @@ -12,7 +11,6 @@ import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.tuple.ImmutablePair; import android.annotation.SuppressLint; -import android.app.Activity; import android.app.ProgressDialog; import android.content.Context; import android.content.res.Resources; @@ -48,7 +46,7 @@ public class CheckGcCredentialsPreference extends Preference { private class GcLoginCheck implements OnPreferenceClickListener { private Resources res; - private Activity activity; + private SettingsActivity activity; private ProgressDialog loginDialog; @SuppressLint("HandlerLeak") @@ -76,23 +74,25 @@ public class CheckGcCredentialsPreference extends Preference { } catch (Exception e) { ActivityMixin.showToast(activity, R.string.err_login_failed); Log.e("SettingsActivity.logInHandler", e); - } - - if (loginDialog != null && loginDialog.isShowing()) { - loginDialog.dismiss(); + } finally { + if (loginDialog != null && loginDialog.isShowing()) { + loginDialog.dismiss(); + } + // enable/disable basic member preferences + activity.initBasicMemberPreferences(); } } }; @Override public boolean onPreferenceClick(Preference preference) { - this.activity = (Activity) CheckGcCredentialsPreference.this.getContext(); + this.activity = (SettingsActivity) CheckGcCredentialsPreference.this.getContext(); this.res = activity.getResources(); ImmutablePair<String, String> credentials = Settings.getGcLogin(); // check credentials for validity - if (credentials == null || StringUtils.isBlank(credentials.getLeft()) + if (StringUtils.isBlank(credentials.getLeft()) || StringUtils.isBlank(credentials.getRight())) { ActivityMixin.showToast(activity, R.string.err_missing_auth); return false; diff --git a/main/src/cgeo/geocaching/settings/InfoPreference.java b/main/src/cgeo/geocaching/settings/InfoPreference.java index 465cf12..ea740b4 100644 --- a/main/src/cgeo/geocaching/settings/InfoPreference.java +++ b/main/src/cgeo/geocaching/settings/InfoPreference.java @@ -2,6 +2,7 @@ package cgeo.geocaching.settings; import cgeo.geocaching.R; +import android.app.Activity; import android.app.AlertDialog; import android.content.Context; import android.content.DialogInterface; @@ -10,8 +11,11 @@ import android.content.res.TypedArray; import android.net.Uri; import android.preference.Preference; import android.util.AttributeSet; +import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; +import android.widget.ImageView; +import android.widget.LinearLayout; public class InfoPreference extends Preference { @@ -20,6 +24,8 @@ public class InfoPreference extends Preference { private String url; private String urlButton; + private LayoutInflater inflater; + public InfoPreference(Context context) { super(context); init(context, null, 0); @@ -36,6 +42,8 @@ public class InfoPreference extends Preference { } private void init(Context context, AttributeSet attrs, int defStyle) { + inflater = ((Activity) context).getLayoutInflater(); + setPersistent(false); if (attrs == null) { @@ -85,7 +93,15 @@ public class InfoPreference extends Preference { } }); - return super.onCreateView(parent); + // show an Info Icon + View v = super.onCreateView(parent); + + ImageView i = (ImageView) inflater.inflate(R.layout.preference_info_icon, parent, false); + LinearLayout l = (LinearLayout) v.findViewById(android.R.id.widget_frame); + l.setVisibility(View.VISIBLE); + l.addView(i); + + return v; } } diff --git a/main/src/cgeo/geocaching/settings/Settings.java b/main/src/cgeo/geocaching/settings/Settings.java index 08f30af..a4eeeec 100644 --- a/main/src/cgeo/geocaching/settings/Settings.java +++ b/main/src/cgeo/geocaching/settings/Settings.java @@ -199,6 +199,10 @@ public final class Settings { return sharedPrefs.getInt(getKey(prefKeyId), defaultValue); } + private static long getLong(final int prefKeyId, final long defaultValue) { + return sharedPrefs.getLong(getKey(prefKeyId), defaultValue); + } + private static boolean getBoolean(final int prefKeyId, final boolean defaultValue) { return sharedPrefs.getBoolean(getKey(prefKeyId), defaultValue); } @@ -225,6 +229,12 @@ public final class Settings { return edit.commit(); } + private static boolean putLong(final int prefKeyId, final long value) { + final SharedPreferences.Editor edit = sharedPrefs.edit(); + edit.putLong(getKey(prefKeyId), value); + return edit.commit(); + } + private static boolean putFloat(final int prefKeyId, final float value) { final SharedPreferences.Editor edit = sharedPrefs.edit(); edit.putFloat(getKey(prefKeyId), value); @@ -257,8 +267,8 @@ public final class Settings { /** * Get login and password information. - * - * @return a pair (login, password) or null if no valid information is stored + * + * @return a pair either with (login, password) or (empty, empty) if no valid information is stored */ public static ImmutablePair<String, String> getGcLogin() { @@ -266,7 +276,7 @@ public final class Settings { final String password = getString(R.string.pref_password, null); if (StringUtils.isBlank(username) || StringUtils.isBlank(password)) { - return null; + return new ImmutablePair<String, String>(StringUtils.EMPTY, StringUtils.EMPTY); } return new ImmutablePair<String, String>(username, password); @@ -316,6 +326,11 @@ public final class Settings { return getString(R.string.pref_ocde_tokensecret, ""); } + public static boolean hasOCDEAuthorization() { + return StringUtils.isNotBlank(getOCDETokenPublic()) + && StringUtils.isNotBlank(getOCDETokenSecret()); + } + public static void setOCDETokens(final String tokenPublic, final String tokenSecret, boolean enableOcDe) { putString(R.string.pref_ocde_tokenpublic, tokenPublic); @@ -735,6 +750,11 @@ public final class Settings { } + public static boolean hasTwitterAuthorization() { + return StringUtils.isNotBlank(getTokenPublic()) + && StringUtils.isNotBlank(getTokenSecret()); + } + public static void setTwitterTokens(final String tokenPublic, final String tokenSecret, boolean enableTwitter) { putString(R.string.pref_twitter_token_public, tokenPublic); @@ -753,7 +773,7 @@ public final class Settings { } public static ImmutablePair<String, String> getTempToken() { - String tokenPublic = getString(R.string.pref_twitter_token_public, null); + String tokenPublic = getString(R.string.pref_temp_twitter_token_public, null); String tokenSecret = getString(R.string.pref_temp_twitter_token_secret, null); return new ImmutablePair<String, String>(tokenPublic, tokenSecret); } @@ -934,7 +954,7 @@ public final class Settings { putBoolean(R.string.pref_excludedisabled, exclude); } - static void setExcludeMine(final boolean exclude) { + public static void setExcludeMine(final boolean exclude) { putBoolean(R.string.pref_excludemine, exclude); } @@ -964,4 +984,12 @@ public final class Settings { putBoolean(R.string.pref_units, imperial); } + public static long getFieldnoteExportDate() { + return getLong(R.string.pref_fieldnoteExportDate, 0); + } + + public static void setFieldnoteExportDate(final long date) { + putLong(R.string.pref_fieldnoteExportDate, date); + } + } diff --git a/main/src/cgeo/geocaching/settings/SettingsActivity.java b/main/src/cgeo/geocaching/settings/SettingsActivity.java index 23ae7bd..4b1c92b 100644 --- a/main/src/cgeo/geocaching/settings/SettingsActivity.java +++ b/main/src/cgeo/geocaching/settings/SettingsActivity.java @@ -38,7 +38,9 @@ import android.view.ContextMenu.ContextMenuInfo; import android.view.MenuItem; import android.view.MenuItem.OnMenuItemClickListener; import android.view.View; +import android.widget.BaseAdapter; import android.widget.EditText; +import android.widget.ListAdapter; import java.io.File; import java.util.ArrayList; @@ -62,6 +64,8 @@ public class SettingsActivity extends PreferenceActivity { private static final int INTENT_GOTO_SERVICES = 1; private static final int DIR_CHOOSER_MAPS_DIRECTORY_REQUEST = 4; + static final int OAUTH_OCDE_REQUEST = 5; + static final int OAUTH_TWITTER_REQUEST = 6; private EditText signatureText; @@ -89,25 +93,18 @@ public class SettingsActivity extends PreferenceActivity { @Override protected void onCreate(final Bundle savedInstanceState) { - - if (Settings.isLightSkin()) { - setTheme(R.style.settings_light); - } else { - setTheme(R.style.settings); - } - + setTheme(Settings.isLightSkin() ? R.style.settings_light : R.style.settings); super.onCreate(savedInstanceState); SettingsActivity.addPreferencesFromResource(this, R.xml.preferences); - initPreferences(); Intent intent = getIntent(); int gotoPage = intent.getIntExtra(INTENT_GOTO, 0); if (gotoPage == INTENT_GOTO_SERVICES) { // start with services screen - PreferenceScreen main = (PreferenceScreen) SettingsActivity.findPreference(this, getKey(R.string.pref_fakekey_main_screen)); - int index = SettingsActivity.findPreference(this, getKey(R.string.pref_fakekey_services_screen)).getOrder(); + PreferenceScreen main = (PreferenceScreen) getPreference(R.string.pref_fakekey_main_screen); + int index = getPreference(R.string.pref_fakekey_services_screen).getOrder(); main.onItemClick(null, null, index, 0); } } @@ -135,7 +132,7 @@ public class SettingsActivity extends PreferenceActivity { R.string.pref_mapDirectory, R.string.pref_defaultNavigationTool, R.string.pref_defaultNavigationTool2, R.string.pref_webDeviceName, R.string.pref_fakekey_preference_backup_info, }) { - bindSummaryToStringValue(this, getKey(k)); + bindSummaryToStringValue(k); } } @@ -143,6 +140,10 @@ public class SettingsActivity extends PreferenceActivity { return cgeoapplication.getInstance().getString(prefKeyId); } + private Preference getPreference(final int keyId) { + return SettingsActivity.findPreference(this, getKey(keyId)); + } + // workaround, because OnContextItemSelected nor onMenuItemSelected is never called OnMenuItemClickListener TEMPLATE_CLICK = new OnMenuItemClickListener() { @Override @@ -156,7 +157,7 @@ public class SettingsActivity extends PreferenceActivity { } }; - // workaround, because OnContextItemSelected nor onMenuItemSelected is never called + // workaround, because OnContextItemSelected and onMenuItemSelected are never called void setSignatureTextView(final EditText view) { this.signatureText = view; } @@ -185,7 +186,7 @@ public class SettingsActivity extends PreferenceActivity { * Fill the choice list for map sources. */ private void initMapSourcePreference() { - ListPreference pref = (ListPreference) SettingsActivity.findPreference(this, getKey(R.string.pref_mapsource)); + ListPreference pref = (ListPreference) getPreference(R.string.pref_mapsource); List<MapSource> mapSources = MapProviderFactory.getMapSources(); CharSequence[] entries = new CharSequence[mapSources.size()]; @@ -212,10 +213,10 @@ public class SettingsActivity extends PreferenceActivity { values[i] = String.valueOf(apps.get(i).id); } - ListPreference pref = (ListPreference) SettingsActivity.findPreference(this, getKey(R.string.pref_defaultNavigationTool)); + ListPreference pref = (ListPreference) getPreference(R.string.pref_defaultNavigationTool); pref.setEntries(entries); pref.setEntryValues(values); - pref = (ListPreference) SettingsActivity.findPreference(this, getKey(R.string.pref_defaultNavigationTool2)); + pref = (ListPreference) getPreference(R.string.pref_defaultNavigationTool2); pref.setEntries(entries); pref.setEntryValues(values); } @@ -223,7 +224,7 @@ public class SettingsActivity extends PreferenceActivity { private void initDirChoosers() { for (final DirChooserType dct : DirChooserType.values()) { - SettingsActivity.findPreference(this, getKey(dct.keyId)).setOnPreferenceClickListener( + getPreference(dct.keyId).setOnPreferenceClickListener( new OnPreferenceClickListener() { @Override public boolean onPreferenceClick(final Preference preference) { @@ -233,7 +234,7 @@ public class SettingsActivity extends PreferenceActivity { }); } - SettingsActivity.findPreference(this, getKey(R.string.pref_mapDirectory)).setOnPreferenceClickListener( + getPreference(R.string.pref_mapDirectory).setOnPreferenceClickListener( new OnPreferenceClickListener() { @Override public boolean onPreferenceClick(final Preference preference) { @@ -278,7 +279,7 @@ public class SettingsActivity extends PreferenceActivity { private void setChosenDirectory(final DirChooserType dct, final Intent data) { final String directory = new File(data.getData().getPath()).getAbsolutePath(); if (StringUtils.isNotBlank(directory)) { - Preference p = SettingsActivity.findPreference(this, getKey(dct.keyId)); + Preference p = getPreference(dct.keyId); if (p == null) { return; } @@ -288,7 +289,7 @@ public class SettingsActivity extends PreferenceActivity { } public void initBackupButtons() { - Preference backup = SettingsActivity.findPreference(this, getKey(R.string.pref_fakekey_preference_backup)); + Preference backup = getPreference(R.string.pref_fakekey_preference_backup); backup.setOnPreferenceClickListener(new OnPreferenceClickListener() { @Override public boolean onPreferenceClick(final Preference preference) { @@ -319,7 +320,7 @@ public class SettingsActivity extends PreferenceActivity { ? context.getString(R.string.init_backup_success) + "\n" + backupFileName : context.getString(R.string.init_backup_failed)); - VALUE_CHANGE_LISTENER.onPreferenceChange(SettingsActivity.findPreference(SettingsActivity.this, getKey(R.string.pref_fakekey_preference_backup_info)), ""); + VALUE_CHANGE_LISTENER.onPreferenceChange(SettingsActivity.this.getPreference(R.string.pref_fakekey_preference_backup_info), ""); } }); } @@ -328,7 +329,7 @@ public class SettingsActivity extends PreferenceActivity { } }); - Preference restore = SettingsActivity.findPreference(this, getKey(R.string.pref_fakekey_preference_restore)); + Preference restore = getPreference(R.string.pref_fakekey_preference_restore); restore.setOnPreferenceClickListener(new OnPreferenceClickListener() { @Override public boolean onPreferenceClick(final Preference preference) { @@ -340,7 +341,7 @@ public class SettingsActivity extends PreferenceActivity { } private void initDbLocationPreference() { - Preference p = SettingsActivity.findPreference(this, getKey(R.string.pref_dbonsdcard)); + Preference p = getPreference(R.string.pref_dbonsdcard); p.setPersistent(false); p.setOnPreferenceClickListener(new OnPreferenceClickListener() { @Override @@ -354,7 +355,7 @@ public class SettingsActivity extends PreferenceActivity { } private void initDebugPreference() { - Preference p = SettingsActivity.findPreference(this, getKey(R.string.pref_debug)); + Preference p = getPreference(R.string.pref_debug); p.setOnPreferenceChangeListener(new OnPreferenceChangeListener() { @Override public boolean onPreferenceChange(final Preference preference, final Object newValue) { @@ -364,18 +365,47 @@ public class SettingsActivity extends PreferenceActivity { }); } - private void initBasicMemberPreferences() { - SettingsActivity.findPreference(this, getKey(R.string.pref_loaddirectionimg)).setEnabled( - !Settings.isPremiumMember()); - SettingsActivity.findPreference(this, getKey(R.string.pref_showcaptcha)).setEnabled( - !Settings.isPremiumMember()); + void initBasicMemberPreferences() { + getPreference(R.string.pref_fakekey_basicmembers_screen) + .setEnabled(!Settings.isPremiumMember()); + getPreference(R.string.pref_loaddirectionimg) + .setEnabled(!Settings.isPremiumMember()); + getPreference(R.string.pref_showcaptcha) + .setEnabled(!Settings.isPremiumMember()); + + redrawScreen(R.string.pref_fakekey_services_screen); + } + + void redrawScreen(int key) { + PreferenceScreen screen = (PreferenceScreen) getPreference(key); + if (screen == null) { + return; + } + ListAdapter adapter = screen.getRootAdapter(); + if (adapter instanceof BaseAdapter) { + ((BaseAdapter) adapter).notifyDataSetChanged(); + } } private static void initSend2CgeoPreferences() { Settings.putString(R.string.pref_webDeviceName, Settings.getWebDeviceName()); } - public static void startWithServicesPage(final Context fromActivity) { + void setOCDEAuthTitle() { + getPreference(R.string.pref_fakekey_ocde_authorization) + .setTitle(getString(Settings.hasOCDEAuthorization() + ? R.string.init_reregister_oc_de + : R.string.init_register_oc_de)); + } + + void setTwitterAuthTitle() { + getPreference(R.string.pref_fakekey_twitter_authorization) + .setTitle(getString(Settings.hasTwitterAuthorization() + ? R.string.init_twitter_reauthorize + : R.string.init_twitter_authorize)); + } + + public static void jumpToServicesPage(final Context fromActivity) { final Intent intent = new Intent(fromActivity, SettingsActivity.class); intent.putExtra(INTENT_GOTO, INTENT_GOTO_SERVICES); fromActivity.startActivity(intent); @@ -405,9 +435,17 @@ public class SettingsActivity extends PreferenceActivity { } } initMapSourcePreference(); - SettingsActivity.findPreference(this, getKey(R.string.pref_mapDirectory)).setSummary( + getPreference(R.string.pref_mapDirectory).setSummary( Settings.getMapFileDirectory()); break; + case OAUTH_OCDE_REQUEST: + setOCDEAuthTitle(); + redrawScreen(R.string.pref_fakekey_services_screen); + break; + case OAUTH_TWITTER_REQUEST: + setTwitterAuthTitle(); + redrawScreen(R.string.pref_fakekey_services_screen); + break; default: throw new IllegalArgumentException(); } @@ -485,10 +523,9 @@ public class SettingsActivity extends PreferenceActivity { * * @param key */ - private static void bindSummaryToStringValue(final PreferenceActivity preferenceActivity, final String key) { - - Preference pref = findPreference(preferenceActivity, key); + private void bindSummaryToStringValue(final int key) { + Preference pref = getPreference(key); if (pref == null) { return; } diff --git a/main/src/cgeo/geocaching/utils/ProcessUtils.java b/main/src/cgeo/geocaching/utils/ProcessUtils.java index 85cedc5..3345ff1 100644 --- a/main/src/cgeo/geocaching/utils/ProcessUtils.java +++ b/main/src/cgeo/geocaching/utils/ProcessUtils.java @@ -2,9 +2,12 @@ package cgeo.geocaching.utils; import cgeo.geocaching.cgeoapplication; +import org.apache.commons.collections.CollectionUtils; + import android.content.Intent; import android.content.pm.PackageInfo; import android.content.pm.PackageManager; +import android.content.pm.ResolveInfo; import java.util.List; @@ -16,7 +19,7 @@ public final class ProcessUtils { /** * Preferred method to detect the availability of an external app - * + * * @param packageName * @return */ @@ -28,7 +31,7 @@ public final class ProcessUtils { * Checks whether a launch intent is available or if the package is just installed * This function is relatively costly, so if you know that the package in question has * a launch intent, use isLaunchable() instead. - * + * * @param packageName * @return */ @@ -65,4 +68,12 @@ public final class ProcessUtils { return null; } } + + public static boolean isIntentAvailable(final String intent) { + final PackageManager packageManager = cgeoapplication.getInstance().getPackageManager(); + final List<ResolveInfo> list = packageManager.queryIntentActivities( + new Intent(intent), PackageManager.MATCH_DEFAULT_ONLY); + + return CollectionUtils.isNotEmpty(list); + } } |
