diff options
| author | rsudev <rasch@munin-soft.de> | 2014-06-06 23:44:02 +0200 |
|---|---|---|
| committer | rsudev <rasch@munin-soft.de> | 2014-06-06 23:44:02 +0200 |
| commit | 2a86e7c2f18f29d40ef22c3a4c6f0e2ab87ae832 (patch) | |
| tree | dae376a730f92d94fb2873e6c158f72f81c9e038 /main/src | |
| parent | a92aabb4b491fc27d21c435d83c3986e27e558a8 (diff) | |
| download | cgeo-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
Diffstat (limited to 'main/src')
| -rw-r--r-- | main/src/cgeo/geocaching/TrackableActivity.java | 50 | ||||
| -rw-r--r-- | main/src/cgeo/geocaching/connector/oc/OkapiClient.java | 48 |
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) { |
