package cgeo.geocaching.connector.trackable; import cgeo.geocaching.models.Geocache; import cgeo.geocaching.models.Image; import cgeo.geocaching.R; import cgeo.geocaching.activity.ActivityMixin; import cgeo.geocaching.connector.ImageResult; import cgeo.geocaching.connector.LogResult; import cgeo.geocaching.connector.gc.GCLogin; import cgeo.geocaching.connector.gc.GCParser; import cgeo.geocaching.enumerations.StatusCode; import cgeo.geocaching.log.AbstractLoggingActivity; import cgeo.geocaching.log.LogTypeTrackable; import cgeo.geocaching.log.TrackableLog; import cgeo.geocaching.settings.Settings; import cgeo.geocaching.utils.Log; import android.support.annotation.NonNull; import android.support.annotation.Nullable; import java.util.ArrayList; import java.util.Calendar; import java.util.List; public class TravelBugLoggingManager extends AbstractTrackableLoggingManager { private final AbstractLoggingActivity activity; private String guid; private boolean hasLoaderError = true; private String[] viewstates = null; private List<LogTypeTrackable> possibleLogTypesTrackable; public TravelBugLoggingManager(final AbstractLoggingActivity activity) { super(activity); this.activity = activity; } @Override public List<LogTypeTrackable> loadInBackground() { if (!Settings.hasGCCredentials()) { // allow offline logging ActivityMixin.showToast(activity, activity.getString(R.string.err_login)); return null; } final String page = TravelBugConnector.getTravelbugViewstates(guid); if (page == null) { activity.showToast(activity.getString(R.string.err_log_load_data)); hasLoaderError = true; } else { viewstates = GCLogin.getViewstates(page); possibleLogTypesTrackable = GCParser.parseLogTypesTrackables(page); hasLoaderError = possibleLogTypesTrackable.isEmpty(); } return possibleLogTypesTrackable; } @Override public boolean postReady() { return !hasLoaderError; } @Override public LogResult postLog(final Geocache cache, final TrackableLog trackableLog, final Calendar date, final String log) { // 'cache' is not used here, but it is for GeokretyLoggingManager try { final StatusCode status = GCParser.postLogTrackable( guid, trackableLog.trackCode, viewstates, trackableLog.action, date.get(Calendar.YEAR), date.get(Calendar.MONTH) + 1, date.get(Calendar.DATE), log); return new LogResult(status, ""); } catch (final Exception e) { Log.e("TrackableLoggingManager.postLog", e); } return new LogResult(StatusCode.LOG_POST_ERROR, ""); } @Override @Nullable public ImageResult postLogImage(final String logId, final Image image) { return null; } @Override @NonNull public List<LogTypeTrackable> getPossibleLogTypesTrackable() { if (hasLoaderError) { final List<LogTypeTrackable> logTypes = new ArrayList<>(); logTypes.add(LogTypeTrackable.RETRIEVED_IT); logTypes.add(LogTypeTrackable.GRABBED_IT); logTypes.add(LogTypeTrackable.NOTE); logTypes.add(LogTypeTrackable.DISCOVERED_IT); return logTypes; } return possibleLogTypesTrackable; } @Override public boolean canLogTime() { return false; } @Override public boolean canLogCoordinates() { return false; } @Override public void setGuid(final String guid) { this.guid = guid; } }