aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorrsudev <rasch@munin-soft.de>2014-06-06 23:44:02 +0200
committerrsudev <rasch@munin-soft.de>2014-06-06 23:44:02 +0200
commit2a86e7c2f18f29d40ef22c3a4c6f0e2ab87ae832 (patch)
treedae376a730f92d94fb2873e6c158f72f81c9e038
parenta92aabb4b491fc27d21c435d83c3986e27e558a8 (diff)
downloadcgeo-2a86e7c2f18f29d40ef22c3a4c6f0e2ab87ae832.zip
cgeo-2a86e7c2f18f29d40ef22c3a4c6f0e2ab87ae832.tar.gz
cgeo-2a86e7c2f18f29d40ef22c3a4c6f0e2ab87ae832.tar.bz2
Implements #3944, Geokrety support for OC
- aquire trackable info through OKAPI, load details on request
-rw-r--r--main/src/cgeo/geocaching/TrackableActivity.java50
-rw-r--r--main/src/cgeo/geocaching/connector/oc/OkapiClient.java48
2 files changed, 64 insertions, 34 deletions
diff --git a/main/src/cgeo/geocaching/TrackableActivity.java b/main/src/cgeo/geocaching/TrackableActivity.java
index f1dab50..87aa2d2 100644
--- a/main/src/cgeo/geocaching/TrackableActivity.java
+++ b/main/src/cgeo/geocaching/TrackableActivity.java
@@ -78,7 +78,7 @@ public class TrackableActivity extends AbstractViewPagerActivity<TrackableActivi
private final Handler loadTrackableHandler = new Handler() {
@Override
- public void handleMessage(Message msg) {
+ public void handleMessage(final Message msg) {
if (trackable == null) {
if (waitDialog != null) {
waitDialog.dismiss();
@@ -134,7 +134,7 @@ public class TrackableActivity extends AbstractViewPagerActivity<TrackableActivi
private ActionMode currentActionMode;
@Override
- public void onCreate(Bundle savedInstanceState) {
+ public void onCreate(final Bundle savedInstanceState) {
super.onCreate(savedInstanceState, R.layout.viewpager_activity);
// set title in code, as the activity needs a hard coded title due to the intent filters
@@ -216,13 +216,13 @@ public class TrackableActivity extends AbstractViewPagerActivity<TrackableActivi
}
@Override
- public boolean onCreateOptionsMenu(Menu menu) {
+ public boolean onCreateOptionsMenu(final Menu menu) {
getMenuInflater().inflate(R.menu.trackable_activity, menu);
return true;
}
@Override
- public boolean onOptionsItemSelected(MenuItem item) {
+ public boolean onOptionsItemSelected(final MenuItem item) {
switch (item.getItemId()) {
case R.id.menu_log_touch:
LogTrackableActivity.startActivity(this, trackable);
@@ -235,7 +235,7 @@ public class TrackableActivity extends AbstractViewPagerActivity<TrackableActivi
}
@Override
- public boolean onPrepareOptionsMenu(Menu menu) {
+ public boolean onPrepareOptionsMenu(final Menu menu) {
if (trackable != null) {
menu.findItem(R.id.menu_log_touch).setVisible(StringUtils.isNotBlank(geocode) && trackable.isLoggable());
menu.findItem(R.id.menu_browser_trackable).setVisible(StringUtils.isNotBlank(trackable.getUrl()));
@@ -249,7 +249,7 @@ public class TrackableActivity extends AbstractViewPagerActivity<TrackableActivi
final private String guid;
final private String id;
- public LoadTrackableThread(Handler handlerIn, String geocodeIn, String guidIn, String idIn) {
+ public LoadTrackableThread(final Handler handlerIn, final String geocodeIn, final String guidIn, final String idIn) {
handler = handlerIn;
geocode = geocodeIn;
guid = guidIn;
@@ -261,14 +261,12 @@ public class TrackableActivity extends AbstractViewPagerActivity<TrackableActivi
if (StringUtils.isNotEmpty(geocode)) {
trackable = DataStore.loadTrackable(geocode);
- if (trackable == null || trackable.isLoggable()) {
- // iterate over the connectors as some codes may be handled by multiple connectors
- for (final TrackableConnector trackableConnector : ConnectorFactory.getTrackableConnectors()) {
- if (trackableConnector.canHandleTrackable(geocode)) {
- trackable = trackableConnector.searchTrackable(geocode, guid, id);
- if (trackable != null) {
- break;
- }
+ // iterate over the connectors as some codes may be handled by multiple connectors
+ for (final TrackableConnector trackableConnector : ConnectorFactory.getTrackableConnectors()) {
+ if (trackableConnector.canHandleTrackable(geocode)) {
+ trackable = trackableConnector.searchTrackable(geocode, guid, id);
+ if (trackable != null) {
+ break;
}
}
}
@@ -285,7 +283,7 @@ public class TrackableActivity extends AbstractViewPagerActivity<TrackableActivi
final private String url;
final private Handler handler;
- public TrackableIconThread(String urlIn, Handler handlerIn) {
+ public TrackableIconThread(final String urlIn, final Handler handlerIn) {
url = urlIn;
handler = handlerIn;
}
@@ -311,12 +309,12 @@ public class TrackableActivity extends AbstractViewPagerActivity<TrackableActivi
private static class TrackableIconHandler extends Handler {
final private ActionBar view;
- public TrackableIconHandler(ActionBar viewIn) {
+ public TrackableIconHandler(final ActionBar viewIn) {
view = viewIn;
}
@Override
- public void handleMessage(Message message) {
+ public void handleMessage(final Message message) {
final BitmapDrawable image = (BitmapDrawable) message.obj;
if (image != null && view != null) {
image.setBounds(0, 0, view.getHeight(), view.getHeight());
@@ -335,7 +333,7 @@ public class TrackableActivity extends AbstractViewPagerActivity<TrackableActivi
}
@Override
- protected PageViewCreator createViewCreator(Page page) {
+ protected PageViewCreator createViewCreator(final Page page) {
switch (page) {
case DETAILS:
return new DetailsViewCreator();
@@ -346,7 +344,7 @@ public class TrackableActivity extends AbstractViewPagerActivity<TrackableActivi
}
@Override
- protected String getTitle(Page page) {
+ protected String getTitle(final Page page) {
return res.getString(page.resId);
}
@@ -442,7 +440,7 @@ public class TrackableActivity extends AbstractViewPagerActivity<TrackableActivi
if (Trackable.SPOTTED_CACHE == trackable.getSpottedType()) {
spotted.setOnClickListener(new View.OnClickListener() {
@Override
- public void onClick(View arg0) {
+ public void onClick(final View arg0) {
if (StringUtils.isNotBlank(trackable.getSpottedGuid())) {
CacheDetailActivity.startActivityGuid(TrackableActivity.this, trackable.getSpottedGuid(), trackable.getSpottedName());
}
@@ -529,7 +527,7 @@ public class TrackableActivity extends AbstractViewPagerActivity<TrackableActivi
view.setOnLongClickListener(new OnLongClickListener() {
@Override
- public boolean onLongClick(View v) {
+ public boolean onLongClick(final View v) {
return startContextualActionBar(view);
}
});
@@ -537,7 +535,7 @@ public class TrackableActivity extends AbstractViewPagerActivity<TrackableActivi
view.setOnClickListener(new OnClickListener() {
@Override
- public void onClick(View v) {
+ public void onClick(final View v) {
startContextualActionBar(view);
}
});
@@ -550,7 +548,7 @@ public class TrackableActivity extends AbstractViewPagerActivity<TrackableActivi
currentActionMode = startSupportActionMode(new ActionMode.Callback() {
@Override
- public boolean onPrepareActionMode(ActionMode actionMode, Menu menu) {
+ public boolean onPrepareActionMode(final ActionMode actionMode, final Menu menu) {
final int viewId = view.getId();
assert view instanceof TextView;
clickedItemText = ((TextView) view).getText();
@@ -573,18 +571,18 @@ public class TrackableActivity extends AbstractViewPagerActivity<TrackableActivi
}
@Override
- public void onDestroyActionMode(ActionMode actionMode) {
+ public void onDestroyActionMode(final ActionMode actionMode) {
currentActionMode = null;
}
@Override
- public boolean onCreateActionMode(ActionMode actionMode, Menu menu) {
+ public boolean onCreateActionMode(final ActionMode actionMode, final Menu menu) {
actionMode.getMenuInflater().inflate(R.menu.details_context, menu);
return true;
}
@Override
- public boolean onActionItemClicked(ActionMode actionMode, MenuItem menuItem) {
+ public boolean onActionItemClicked(final ActionMode actionMode, final MenuItem menuItem) {
return onClipboardItemSelected(actionMode, menuItem, clickedItemText);
}
});
diff --git a/main/src/cgeo/geocaching/connector/oc/OkapiClient.java b/main/src/cgeo/geocaching/connector/oc/OkapiClient.java
index 1294353..96d3202 100644
--- a/main/src/cgeo/geocaching/connector/oc/OkapiClient.java
+++ b/main/src/cgeo/geocaching/connector/oc/OkapiClient.java
@@ -6,6 +6,7 @@ import cgeo.geocaching.Geocache;
import cgeo.geocaching.Image;
import cgeo.geocaching.LogEntry;
import cgeo.geocaching.R;
+import cgeo.geocaching.Trackable;
import cgeo.geocaching.Waypoint;
import cgeo.geocaching.connector.ConnectorFactory;
import cgeo.geocaching.connector.IConnector;
@@ -98,6 +99,11 @@ final class OkapiClient {
private static final String CACHE_CODE = "code";
private static final String CACHE_REQ_PASSWORD = "req_passwd";
private static final String CACHE_MY_NOTES = "my_notes";
+ private static final String CACHE_TRACKABLES_COUNT = "trackables_count";
+ private static final String CACHE_TRACKABLES = "trackables";
+
+ private static final String TRK_GEOCODE = "code";
+ private static final String TRK_NAME = "name";
private static final String LOG_TYPE = "type";
private static final String LOG_COMMENT = "comment";
@@ -112,9 +118,9 @@ final class OkapiClient {
// the several realms of possible fields for cache retrieval:
// Core: for livemap requests (L3 - only with level 3 auth)
// Additional: additional fields for full cache (L3 - only for level 3 auth, current - only for connectors with current api)
- private static final String SERVICE_CACHE_CORE_FIELDS = "code|name|location|type|status|difficulty|terrain|size|size2|date_hidden";
+ private static final String SERVICE_CACHE_CORE_FIELDS = "code|name|location|type|status|difficulty|terrain|size|size2|date_hidden|trackables_count";
private static final String SERVICE_CACHE_CORE_L3_FIELDS = "is_found";
- private static final String SERVICE_CACHE_ADDITIONAL_FIELDS = "owner|founds|notfounds|rating|rating_votes|recommendations|description|hint|images|latest_logs|alt_wpts|attrnames|req_passwd";
+ private static final String SERVICE_CACHE_ADDITIONAL_FIELDS = "owner|founds|notfounds|rating|rating_votes|recommendations|description|hint|images|latest_logs|alt_wpts|attrnames|req_passwd|trackables";
private static final String SERVICE_CACHE_ADDITIONAL_CURRENT_FIELDS = "gc_code|attribution_note|attr_acodes";
private static final String SERVICE_CACHE_ADDITIONAL_L3_FIELDS = "is_watched|my_notes";
@@ -378,6 +384,9 @@ final class OkapiClient {
//TODO: Store license per cache
//cache.setLicense(response.getString("attribution_note"));
cache.setWaypoints(parseWaypoints(response.getJSONArray(CACHE_WPTS)), false);
+
+ cache.setInventory(parseTrackables(response.getJSONArray(CACHE_TRACKABLES)));
+
if (!response.isNull(CACHE_IS_WATCHED)) {
cache.setOnWatchlist(response.getBoolean(CACHE_IS_WATCHED));
}
@@ -412,6 +421,8 @@ final class OkapiClient {
cache.setDifficulty((float) response.getDouble(CACHE_DIFFICULTY));
cache.setTerrain((float) response.getDouble(CACHE_TERRAIN));
+ cache.setInventoryItems((int) response.getInt(CACHE_TRACKABLES_COUNT));
+
if (!response.isNull(CACHE_IS_FOUND)) {
cache.setFound(response.getBoolean(CACHE_IS_FOUND));
}
@@ -481,6 +492,27 @@ final class OkapiClient {
return result;
}
+ private static List<Trackable> parseTrackables(final JSONArray trackablesJson) {
+ if (trackablesJson.length() == 0) {
+ return Collections.emptyList();
+ }
+ final List<Trackable> result = new ArrayList<Trackable>();
+ for (int i = 0; i < trackablesJson.length(); i++) {
+ try {
+ final JSONObject trackableResponse = trackablesJson.getJSONObject(i);
+ final Trackable trk = new Trackable();
+ trk.setGeocode(trackableResponse.getString(TRK_GEOCODE));
+ trk.setName(trackableResponse.getString(TRK_NAME));
+ result.add(trk);
+ } catch (final JSONException e) {
+ Log.e("OkapiClient.parseWaypoints", e);
+ // Don't overwrite internal state with possibly partial result
+ return null;
+ }
+ }
+ return result;
+ }
+
private static LogType parseLogType(final String logType) {
if ("Found it".equalsIgnoreCase(logType)) {
return LogType.FOUND_IT;
@@ -596,7 +628,7 @@ final class OkapiClient {
try {
final String size = response.getString(CACHE_SIZE2);
return CacheSize.getById(size);
- } catch (JSONException e) {
+ } catch (final JSONException e) {
Log.e("OkapiClient.getCacheSize", e);
return getCacheSizeDeprecated(response);
}
@@ -705,7 +737,7 @@ final class OkapiClient {
params.add("langpref", getPreferredLanguage());
if (connector.getSupportedAuthLevel() == OAuthLevel.Level3) {
- ImmutablePair<String, String> tokens = Settings.getTokenPair(connector.getTokenPublicPrefKeyId(), connector.getTokenSecretPrefKeyId());
+ final ImmutablePair<String, String> tokens = Settings.getTokenPair(connector.getTokenPublicPrefKeyId(), connector.getTokenSecretPrefKeyId());
OAuth.signOAuth(host, service.methodName, "GET", false, params, tokens.left, tokens.right, connector.getCK(), connector.getCS());
} else {
connector.addAuthentication(params);
@@ -772,7 +804,7 @@ final class OkapiClient {
return null;
}
- JSONObject data = result.data;
+ final JSONObject data = result.data;
if (!data.isNull(USER_UUID)) {
try {
return data.getString(USER_UUID);
@@ -795,7 +827,7 @@ final class OkapiClient {
return new UserInfo(StringUtils.EMPTY, 0, UserInfoStatus.getFromOkapiError(error.getResult()));
}
- JSONObject data = result.data;
+ final JSONObject data = result.data;
String name = StringUtils.EMPTY;
boolean successUserName = false;
@@ -831,7 +863,7 @@ final class OkapiClient {
* response containing an error object
* @return OkapiError object with detailed information
*/
- public static OkapiError decodeErrorResponse(HttpResponse response) {
+ public static OkapiError decodeErrorResponse(final HttpResponse response) {
final JSONResult result = new JSONResult(response);
if (!result.isSuccess) {
return new OkapiError(result.data);
@@ -849,7 +881,7 @@ final class OkapiClient {
public final JSONObject data;
public JSONResult(final @Nullable HttpResponse response) {
- boolean isSuccess = Network.isSuccess(response);
+ final boolean isSuccess = Network.isSuccess(response);
final String responseData = Network.getResponseDataAlways(response);
JSONObject data = null;
if (responseData != null) {