Projects >> cgeo >>6dd358bd3d9d526b44fd2d9552ded0a3d4bc510c

Chunk
Conflicting content
<<<<<<< HEAD
package cgeo.geocaching;

import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.HashMap;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import android.app.Activity;
import android.content.Intent;
import android.content.res.Resources;
import android.net.Uri;
import android.text.Spannable;
import android.util.Log;
import cgeo.geocaching.activity.IAbstractActivity;
import cgeo.geocaching.connector.ConnectorFactory;
import cgeo.geocaching.connector.IConnector;

/**
 * Internal c:geo representation of a "cache"
 */
public class cgCache implements ICache {

	public Long updated = null;
	public Long detailedUpdate = null;
	public Long visitedDate = null;
	public Integer reason = 0;
	public Boolean detailed = false;
	/**
     * Code of the cache like GCABCD
     */
	public String geocode = "";
	public String cacheid = "";
	public String guid = "";
	public String type = "";
	public String name = "";
	public Spannable nameSp = null;
	public String owner = "";
	public String ownerReal = "";
	public Date hidden = null;
	public String hint = "";
	public String size = "";
	public Float difficulty = Float.valueOf(0);
	public Float terrain = Float.valueOf(0);
	public Double direction = null;
	public Double distance = null;
	public String latlon = "";
	public String latitudeString = "";
	public String longitudeString = "";
	public String location = "";
	public Double latitude = null;
	public Double longitude = null;
	public boolean reliableLatLon = false;
	public Double elevation = null;
	public String personalNote = null;
	public String shortdesc = "";
	public String description = "";
	public boolean disabled = false;
	public boolean archived = false;
	public boolean members = false;
	public boolean found = false;
	public boolean favourite = false;
	public boolean own = false;
	public Integer favouriteCnt = null;
	public Float rating = null;
	public Integer votes = null;
	public Float myVote = null;
	public int inventoryItems = 0;
	public boolean onWatchlist = false;
	public ArrayList attributes = null;
	public ArrayList waypoints = null;
	public ArrayList spoilers = null;
	public ArrayList logs = null;
	public ArrayList inventory = null;
	public HashMap logCounts = new HashMap();
	public boolean logOffline = false;
	// temporary values
	public boolean statusChecked = false;
	public boolean statusCheckedView = false;
	public String directionImg = null;

	public cgCache merge(cgData storage) {

		boolean loadA = true;
		boolean loadW = true;
		boolean loadS = true;
		boolean loadL = true;
		boolean loadI = true;

		if (attributes == null || attributes.isEmpty()) {
			loadA = false;
		}
		if (waypoints == null || waypoints.isEmpty()) {
			loadW = false;
		}
		if (spoilers == null || spoilers.isEmpty()) {
			loadS = false;
		}
		if (logs == null || logs.isEmpty()) {
			loadL = false;
		}
		if (inventory == null || inventory.isEmpty()) {
	@Override
			loadI = false;
		}

		final cgCache oldCache = storage.loadCache(geocode, guid, loadA, loadW, loadS, loadL, loadI, false);

		if (oldCache == null) {
			return this;
		}

		updated = System.currentTimeMillis();
		if (detailed == false && oldCache.detailed) {
			detailed = true;
			detailedUpdate = System.currentTimeMillis();
		}

		if (visitedDate == null || visitedDate == 0) {
			visitedDate = oldCache.visitedDate;
		}
		if (reason == null || reason == 0) {
			reason = oldCache.reason;
		}
		if (geocode == null || geocode.length() == 0) {
			geocode = oldCache.geocode;
		}
		if (cacheid == null || cacheid.length() == 0) {
			cacheid = oldCache.cacheid;
		}
		if (guid == null || guid.length() == 0) {
			guid = oldCache.guid;
		}
		if (type == null || type.length() == 0) {
			type = oldCache.type;
		}
		if (name == null || name.length() == 0) {
			name = oldCache.name;
		}
		if (nameSp == null || nameSp.length() == 0) {
			nameSp = oldCache.nameSp;
		}
		if (owner == null || owner.length() == 0) {
			owner = oldCache.owner;
		}
		if (ownerReal == null || ownerReal.length() == 0) {
			ownerReal = oldCache.ownerReal;
		}
		if (hidden == null) {
			hidden = oldCache.hidden;
		}
		if (hint == null || hint.length() == 0) {
			hint = oldCache.hint;
		}
		if (size == null || size.length() == 0) {
			size = oldCache.size;
		}
		if (difficulty == null || difficulty == 0) {
			difficulty = oldCache.difficulty;
		}
		if (terrain == null || terrain == 0) {
			terrain = oldCache.terrain;
		}
		if (direction == null) {
			direction = oldCache.direction;
		}
		if (distance == null) {
			distance = oldCache.distance;
		}
		if (latlon == null || latlon.length() == 0) {
			latlon = oldCache.latlon;
		}
		if (latitudeString == null || latitudeString.length() == 0) {
			latitudeString = oldCache.latitudeString;
		}
		if (longitudeString == null || longitudeString.length() == 0) {
			longitudeString = oldCache.longitudeString;
		}
		if (location == null || location.length() == 0) {
			location = oldCache.location;
		}
		if (latitude == null) {
			latitude = oldCache.latitude;
		}
		if (longitude == null) {
			longitude = oldCache.longitude;
		}
		if (elevation == null) {
			elevation = oldCache.elevation;
		}
		if (personalNote == null || personalNote.length() == 0) {
			personalNote = oldCache.personalNote;
		}
		if (shortdesc == null || shortdesc.length() == 0) {
			shortdesc = oldCache.shortdesc;
		}
		if (description == null || description.length() == 0) {
			description = oldCache.description;
		}
		if (favouriteCnt == null) {
			favouriteCnt = oldCache.favouriteCnt;
		}
		if (rating == null) {
			rating = oldCache.rating;
		}
		if (votes == null) {
			votes = oldCache.votes;
		}
		if (myVote == null) {
			myVote = oldCache.myVote;
		}
		if (inventoryItems == 0) {
			inventoryItems = oldCache.inventoryItems;
		}

		if (attributes == null) {
			attributes = oldCache.attributes;
		}
		if (waypoints == null) {
			waypoints = oldCache.waypoints;
		}
		cgWaypoint.mergeWayPoints(waypoints, oldCache.waypoints);
		if (spoilers == null) {
			spoilers = oldCache.spoilers;
		}
		if (inventory == null) {
			inventory = oldCache.inventory;
		}
		if (logs == null || logs.isEmpty()) { // keep last known logs if none
			logs = oldCache.logs;
		}

		return this;
	}

	public boolean hasTrackables(){
		return inventoryItems > 0;
	}

	public boolean canBeAddedToCalendar() {
		// is event type?
		if (!isEventCache()) {
			return false;
		}
		// has event date set?
		if (hidden == null) {
			return false;
		}
		// is in future?
		Date today = new Date();
		today.setHours(0);
		today.setMinutes(0);
		today.setSeconds(0);
		if (hidden.compareTo(today) <= 0) {
			return false;
		}
		return true;
	}

	/**
	 * checks if a page contains the guid of a cache
	 *
	 * @param cache  the cache to look for
	 * @param page   the page to search in
	 *
	 * @return  true: page contains guid of cache, false: otherwise
	 */
	boolean isGuidContainedInPage(final String page) {
		// check if the guid of the cache is anywhere in the page
		if (guid == null  || guid.length() == 0) {
			return false;
		}
		Pattern patternOk = Pattern.compile(guid, Pattern.CASE_INSENSITIVE);
		Matcher matcherOk = patternOk.matcher(page);
		if (matcherOk.find()) {
			Log.i(cgSettings.tag, "cgCache.isGuidContainedInPage: guid '" + guid + "' found");
			return true;
		} else {
			Log.i(cgSettings.tag, "cgCache.isGuidContainedInPage: guid '" + guid + "' not found");
			return false;
		}
	}

	public boolean isEventCache() {
		return ("event".equalsIgnoreCase(type) || "mega".equalsIgnoreCase(type) || "cito".equalsIgnoreCase(type));
	}

	public boolean logVisit(IAbstractActivity fromActivity) {
		if (cacheid == null || cacheid.length() == 0) {
			fromActivity.showToast(((Activity)fromActivity).getResources().getString(R.string.err_cannot_log_visit));
			return true;
		}
		Intent logVisitIntent = new Intent((Activity)fromActivity, cgeovisit.class);
		logVisitIntent.putExtra(cgeovisit.EXTRAS_ID, cacheid);
		logVisitIntent.putExtra(cgeovisit.EXTRAS_GEOCODE, geocode.toUpperCase());
		logVisitIntent.putExtra(cgeovisit.EXTRAS_FOUND, found);

		((Activity)fromActivity).startActivity(logVisitIntent);

		return true;
	}

	public boolean logOffline(final IAbstractActivity fromActivity, final int logType, final cgSettings settings, final cgBase base) {
        String log = "";
        if (settings.getSignature() != null
                && settings.signatureAutoinsert
                && settings.getSignature().length() > 0) {
            log = LogTemplateProvider.applyTemplates(settings.getSignature(), base);
        }
        logOffline(fromActivity, log, Calendar.getInstance(), logType);
        return true;
	}

	void logOffline(final IAbstractActivity fromActivity, final String log, Calendar date, final int logType) {
		if (logType <= 0) {
			return;
		}
		cgeoapplication app = (cgeoapplication)((Activity)fromActivity).getApplication();
		final boolean status = app.saveLogOffline(geocode, date.getTime(), logType, log);

		Resources res = ((Activity)fromActivity).getResources();
		if (status) {
			fromActivity.showToast(res.getString(R.string.info_log_saved));
			app.saveVisitDate(geocode);
		} else {
			fromActivity.showToast(res.getString(R.string.err_log_post_failed));
		}
	}

	public ArrayList getPossibleLogTypes(cgSettings settings) {
		boolean isOwner = owner != null && owner.equalsIgnoreCase(settings.getUsername());
		ArrayList types = new ArrayList();
		if ("event".equals(type) || "mega".equals(type) || "cito".equals(type) || "lostfound".equals(type)) {
			types.add(cgBase.LOG_WILL_ATTEND);
			types.add(cgBase.LOG_NOTE);
			types.add(cgBase.LOG_ATTENDED);
			types.add(cgBase.LOG_NEEDS_ARCHIVE);
			if (isOwner) {
				types.add(cgBase.LOG_ANNOUNCEMENT);
			}
		} else if ("webcam".equals(type)) {
			types.add(cgBase.LOG_WEBCAM_PHOTO_TAKEN);
			types.add(cgBase.LOG_DIDNT_FIND_IT);
			types.add(cgBase.LOG_NOTE);
			types.add(cgBase.LOG_NEEDS_ARCHIVE);
			types.add(cgBase.LOG_NEEDS_MAINTENANCE);
		} else {
			types.add(cgBase.LOG_FOUND_IT);
			types.add(cgBase.LOG_DIDNT_FIND_IT);
			types.add(cgBase.LOG_NOTE);
			types.add(cgBase.LOG_NEEDS_ARCHIVE);
			types.add(cgBase.LOG_NEEDS_MAINTENANCE);
		}
		if (isOwner) {
			types.add(cgBase.LOG_OWNER_MAINTENANCE);
			types.add(cgBase.LOG_TEMP_DISABLE_LISTING);
			types.add(cgBase.LOG_ENABLE_LISTING);
			types.add(cgBase.LOG_ARCHIVE);
			types.remove(Integer.valueOf(cgBase.LOG_UPDATE_COORDINATES));
		}
		return types;
	}

	public void openInBrowser(Activity fromActivity) {
		fromActivity.startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse(getCacheUrl())));
	}

	private String getCacheUrl() {
		return getConnector().getCacheUrl(this);
	}

	private IConnector getConnector() {
		return ConnectorFactory.getConnector(this);
	}

	public boolean canOpenInBrowser() {
		return getCacheUrl() != null;
	}

	public boolean supportsRefresh() {
		return getConnector().supportsRefreshCache(this);
	}

	public boolean supportsWatchList() {
		return getConnector().supportsWatchList();
	}

	public boolean supportsLogging() {
		return getConnector().supportsLogging();
	}

	@Override
	public String getData() {
		return null;
	}

	@Override
	public Float getDifficulty() {
		return difficulty;
	}

	@Override
	public String getGeocode() {
		return geocode;
	}
	@Override
	public String getLatitute() {
		return latitudeString;
	}

	@Override
	public String getLongitude() {
		return longitudeString;
	}

	@Override
	public String getOwner() {
		return owner;
	}

	@Override
	public String getSize() {
		return size;
	}

	@Override
	public Float getTerrain() {
		return terrain;
	}

	public String getType() {
		return type;
	}

	@Override
	public boolean isArchived() {
		return archived;
	}

	@Override
	public boolean isDisabled() {
		return disabled;
	}

	@Override
	public boolean isMembersOnly() {
		return members;
	}

	@Override
	public boolean isOwn() {
		return own;
	}

}


=======
package cgeo.geocaching;

import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.HashMap;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import android.app.Activity;
import android.content.Intent;
import android.content.res.Resources;
import android.net.Uri;
import android.text.Spannable;
import android.util.Log;
import cgeo.geocaching.activity.IAbstractActivity;
import cgeo.geocaching.connector.ConnectorFactory;
import cgeo.geocaching.connector.IConnector;

public class cgCache {

	public Long updated = null;
	public Long detailedUpdate = null;
	public Long visitedDate = null;
	public Integer reason = 0;
	public Boolean detailed = false;
	public String geocode = "";
	public String cacheid = "";
	public String guid = "";
	public String type = "";
	public String name = "";
	public Spannable nameSp = null;
	public String owner = "";
	public String ownerReal = "";
	public Date hidden = null;
	public String hint = "";
	public String size = "";
	public Float difficulty = Float.valueOf(0);
	public Float terrain = Float.valueOf(0);
	public Double direction = null;
	public Double distance = null;
	public String latlon = "";
	public String latitudeString = "";
	public String longitudeString = "";
	public String location = "";
	public Double latitude = null;
	public Double longitude = null;
	public boolean reliableLatLon = false;
	public Double elevation = null;
	public String personalNote = null;
	public String shortdesc = "";
	public String description = "";
	public boolean disabled = false;
	public boolean archived = false;
	public boolean members = false;
	public boolean found = false;
	public boolean favourite = false;
	public boolean own = false;
	public Integer favouriteCnt = null;
	public Float rating = null;
	public Integer votes = null;
	public Float myVote = null;
	public int inventoryItems = 0;
	public boolean onWatchlist = false;
	public ArrayList attributes = null;
	public ArrayList waypoints = null;
	public ArrayList spoilers = null;
	public ArrayList logs = null;
	public ArrayList inventory = null;
	public HashMap logCounts = new HashMap();
	public boolean logOffline = false;
	// temporary values
	public boolean statusChecked = false;
	public boolean statusCheckedView = false;
	public String directionImg = null;

	public cgCache merge(cgData storage) {

		boolean loadA = true;
		boolean loadW = true;
		boolean loadS = true;
		boolean loadL = true;
		boolean loadI = true;

		if (attributes == null || attributes.isEmpty()) {
			loadA = false;
		}
		if (waypoints == null || waypoints.isEmpty()) {
			loadW = false;
		}
		if (spoilers == null || spoilers.isEmpty()) {
			loadS = false;
		}
		if (logs == null || logs.isEmpty()) {
			loadL = false;
		}
		if (inventory == null || inventory.isEmpty()) {
			loadI = false;
		}

		final cgCache oldCache = storage.loadCache(geocode, guid, loadA, loadW, loadS, loadL, loadI, false);

		if (oldCache == null) {
			return this;
		}

		updated = System.currentTimeMillis();
		if (detailed == false && oldCache.detailed) {
			detailed = true;
			detailedUpdate = System.currentTimeMillis();
		}

		if (visitedDate == null || visitedDate == 0) {
			visitedDate = oldCache.visitedDate;
		}
		if (reason == null || reason == 0) {
			reason = oldCache.reason;
		}
		if (geocode == null || geocode.length() == 0) {
			geocode = oldCache.geocode;
		}
		if (cacheid == null || cacheid.length() == 0) {
			cacheid = oldCache.cacheid;
		}
		if (guid == null || guid.length() == 0) {
			guid = oldCache.guid;
		}
		if (type == null || type.length() == 0) {
			type = oldCache.type;
		}
		if (name == null || name.length() == 0) {
			name = oldCache.name;
		}
		if (nameSp == null || nameSp.length() == 0) {
			nameSp = oldCache.nameSp;
		}
		if (owner == null || owner.length() == 0) {
			owner = oldCache.owner;
		}
		if (ownerReal == null || ownerReal.length() == 0) {
			ownerReal = oldCache.ownerReal;
		}
		if (hidden == null) {
			hidden = oldCache.hidden;
		}
		if (hint == null || hint.length() == 0) {
			hint = oldCache.hint;
		}
		if (size == null || size.length() == 0) {
			size = oldCache.size;
		}
		if (difficulty == null || difficulty == 0) {
			difficulty = oldCache.difficulty;
		}
		if (terrain == null || terrain == 0) {
			terrain = oldCache.terrain;
		}
		if (direction == null) {
			direction = oldCache.direction;
		}
		if (distance == null) {
			distance = oldCache.distance;
		}
		if (latlon == null || latlon.length() == 0) {
			latlon = oldCache.latlon;
		}
		if (latitudeString == null || latitudeString.length() == 0) {
			latitudeString = oldCache.latitudeString;
		}
		if (longitudeString == null || longitudeString.length() == 0) {
			longitudeString = oldCache.longitudeString;
		}
		if (location == null || location.length() == 0) {
			location = oldCache.location;
		}
		if (latitude == null) {
			latitude = oldCache.latitude;
		}
		if (longitude == null) {
			longitude = oldCache.longitude;
		}
		if (elevation == null) {
			elevation = oldCache.elevation;
		}
		if (personalNote == null || personalNote.length() == 0) {
			personalNote = oldCache.personalNote;
		}
		if (shortdesc == null || shortdesc.length() == 0) {
			shortdesc = oldCache.shortdesc;
		}
		if (description == null || description.length() == 0) {
			description = oldCache.description;
		}
		if (favouriteCnt == null) {
			favouriteCnt = oldCache.favouriteCnt;
		}
		if (rating == null) {
			rating = oldCache.rating;
		}
		if (votes == null) {
			votes = oldCache.votes;
		}
		if (myVote == null) {
			myVote = oldCache.myVote;
		}
		if (inventoryItems == 0) {
			inventoryItems = oldCache.inventoryItems;
		}
		if (attributes == null) {
			attributes = oldCache.attributes;
		}
		if (waypoints == null) {
			waypoints = oldCache.waypoints;
		}
		cgWaypoint.mergeWayPoints(waypoints, oldCache.waypoints);
		if (spoilers == null) {
			spoilers = oldCache.spoilers;
		}
		if (inventory == null) {
			inventory = oldCache.inventory;
		}
		if (logs == null || logs.isEmpty()) { // keep last known logs if none
			logs = oldCache.logs;
		}

		return this;
	}

	public boolean hasTrackables(){
		return inventoryItems > 0;
	}

	public boolean canBeAddedToCalendar() {
		// is event type?
		if (!isEventCache()) {
			return false;
		}
		// has event date set?
		if (hidden == null) {
			return false;
		}
		// is in future?
		Date today = new Date();
		today.setHours(0);
		today.setMinutes(0);
		today.setSeconds(0);
		if (hidden.compareTo(today) <= 0) {
			return false;
		}
		return true;
	}

	/**
	 * checks if a page contains the guid of a cache
	 *
	 * @param cache  the cache to look for
	 * @param page   the page to search in
	 *
	 * @return  true: page contains guid of cache, false: otherwise
	 */
	boolean isGuidContainedInPage(final String page) {
		// check if the guid of the cache is anywhere in the page
		if (guid == null  || guid.length() == 0) {
			return false;
		}
		Pattern patternOk = Pattern.compile(guid, Pattern.CASE_INSENSITIVE);
		Matcher matcherOk = patternOk.matcher(page);
		if (matcherOk.find()) {
			Log.i(cgSettings.tag, "cgCache.isGuidContainedInPage: guid '" + guid + "' found");
			return true;
		} else {
			Log.i(cgSettings.tag, "cgCache.isGuidContainedInPage: guid '" + guid + "' not found");
			return false;
		}
	}

	public boolean isEventCache() {
		return "event".equalsIgnoreCase(type) || "mega".equalsIgnoreCase(type) || "cito".equalsIgnoreCase(type);
	}

	public boolean logVisit(IAbstractActivity fromActivity) {
		if (cacheid == null || cacheid.length() == 0) {
			fromActivity.showToast(((Activity)fromActivity).getResources().getString(R.string.err_cannot_log_visit));
			return true;
		}
		Intent logVisitIntent = new Intent((Activity)fromActivity, cgeovisit.class);
		logVisitIntent.putExtra(cgeovisit.EXTRAS_ID, cacheid);
		logVisitIntent.putExtra(cgeovisit.EXTRAS_GEOCODE, geocode.toUpperCase());
		logVisitIntent.putExtra(cgeovisit.EXTRAS_FOUND, found);

		((Activity)fromActivity).startActivity(logVisitIntent);

		return true;
	}

	public boolean logOffline(final IAbstractActivity fromActivity, final int logType, final cgSettings settings, final cgBase base) {
        String log = "";
        if (settings.getSignature() != null
                && settings.signatureAutoinsert
                && settings.getSignature().length() > 0) {
            log = LogTemplateProvider.applyTemplates(settings.getSignature(), base);
        }
        logOffline(fromActivity, log, Calendar.getInstance(), logType);
        return true;
	}

	void logOffline(final IAbstractActivity fromActivity, final String log, Calendar date, final int logType) {
		if (logType <= 0) {
			return;
		}
		cgeoapplication app = (cgeoapplication)((Activity)fromActivity).getApplication();
		final boolean status = app.saveLogOffline(geocode, date.getTime(), logType, log);

		Resources res = ((Activity)fromActivity).getResources();
		if (status) {
			fromActivity.showToast(res.getString(R.string.info_log_saved));
			app.saveVisitDate(geocode);
		} else {
			fromActivity.showToast(res.getString(R.string.err_log_post_failed));
		}
	}

	public ArrayList getPossibleLogTypes(cgSettings settings) {
		boolean isOwner = owner != null && owner.equalsIgnoreCase(settings.getUsername());
		ArrayList types = new ArrayList();
		if ("event".equals(type) || "mega".equals(type) || "cito".equals(type) || "lostfound".equals(type)) {
			types.add(cgBase.LOG_WILL_ATTEND);
			types.add(cgBase.LOG_NOTE);
			types.add(cgBase.LOG_ATTENDED);
			types.add(cgBase.LOG_NEEDS_ARCHIVE);
			if (isOwner) {
				types.add(cgBase.LOG_ANNOUNCEMENT);
			}
		} else if ("webcam".equals(type)) {
			types.add(cgBase.LOG_WEBCAM_PHOTO_TAKEN);
			types.add(cgBase.LOG_DIDNT_FIND_IT);
			types.add(cgBase.LOG_NOTE);
			types.add(cgBase.LOG_NEEDS_ARCHIVE);
			types.add(cgBase.LOG_NEEDS_MAINTENANCE);
		} else {
			types.add(cgBase.LOG_FOUND_IT);
			types.add(cgBase.LOG_DIDNT_FIND_IT);
			types.add(cgBase.LOG_NOTE);
			types.add(cgBase.LOG_NEEDS_ARCHIVE);
			types.add(cgBase.LOG_NEEDS_MAINTENANCE);
		}
		if (isOwner) {
			types.add(cgBase.LOG_OWNER_MAINTENANCE);
			types.add(cgBase.LOG_TEMP_DISABLE_LISTING);
			types.add(cgBase.LOG_ENABLE_LISTING);
			types.add(cgBase.LOG_ARCHIVE);
			types.remove(Integer.valueOf(cgBase.LOG_UPDATE_COORDINATES));
		}
		return types;
	}

	public void openInBrowser(Activity fromActivity) {
		fromActivity.startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse(getCacheUrl())));
	}

	private String getCacheUrl() {
		return getConnector().getCacheUrl(this);
	}

	private IConnector getConnector() {
		return ConnectorFactory.getConnector(this);
	}

	public boolean canOpenInBrowser() {
		return getCacheUrl() != null;
	}

	public boolean supportsRefresh() {
		return getConnector().supportsRefreshCache(this);
	}

	public boolean supportsWatchList() {
		return getConnector().supportsWatchList();
	}

	public boolean supportsLogging() {
		return getConnector().supportsLogging();
	}

}
>>>>>>> 18ff53c1cd02c2b9c477a299b632465cd78241ff
Solution content
package cgeo.geocaching;

import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.HashMap;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import android.app.Activity;
import android.content.Intent;
import android.content.res.Resources;
import android.net.Uri;
import android.text.Spannable;
import android.util.Log;
import cgeo.geocaching.activity.IAbstractActivity;
import cgeo.geocaching.connector.ConnectorFactory;
import cgeo.geocaching.connector.IConnector;

/**
 * Internal c:geo representation of a "cache"
 */
public class cgCache implements ICache {

	public Long updated = null;
	public Long detailedUpdate = null;
	public Long visitedDate = null;
	public Integer reason = 0;
	public Boolean detailed = false;
	/**
     * Code of the cache like GCABCD
     */
		}

	public String geocode = "";
	public String cacheid = "";
	public String guid = "";
	public String type = "";
	public String name = "";
	public Spannable nameSp = null;
	public String owner = "";
	public String ownerReal = "";
	public Date hidden = null;
	public String hint = "";
	public String size = "";
	public Float difficulty = Float.valueOf(0);
	public Float terrain = Float.valueOf(0);
	public Double direction = null;
	public Double distance = null;
	public String latlon = "";
	public String latitudeString = "";
	public String longitudeString = "";
	public String location = "";
	public Double latitude = null;
	public Double longitude = null;
	public boolean reliableLatLon = false;
	public Double elevation = null;
	public String personalNote = null;
	public String shortdesc = "";
	public String description = "";
	public boolean disabled = false;
	public boolean archived = false;
	public boolean members = false;
	public boolean found = false;
	public boolean favourite = false;
	public boolean own = false;
	public Integer favouriteCnt = null;
	public Float rating = null;
	public Integer votes = null;
	public Float myVote = null;
	public int inventoryItems = 0;
	public boolean onWatchlist = false;
	public ArrayList attributes = null;
	public ArrayList waypoints = null;
	public ArrayList spoilers = null;
	public ArrayList logs = null;
	public ArrayList inventory = null;
	public HashMap logCounts = new HashMap();
	public boolean logOffline = false;
	// temporary values
	public boolean statusChecked = false;
	public boolean statusCheckedView = false;
	public String directionImg = null;
	public cgCache merge(cgData storage) {

		boolean loadA = true;
		boolean loadW = true;
		boolean loadS = true;
		boolean loadL = true;
		boolean loadI = true;

		if (attributes == null || attributes.isEmpty()) {
			loadA = false;
		}
		if (waypoints == null || waypoints.isEmpty()) {
			loadW = false;
		}
		if (spoilers == null || spoilers.isEmpty()) {
			loadS = false;
		}
		if (logs == null || logs.isEmpty()) {
			loadL = false;
		}
		if (inventory == null || inventory.isEmpty()) {
			loadI = false;
		}

		final cgCache oldCache = storage.loadCache(geocode, guid, loadA, loadW, loadS, loadL, loadI, false);

		if (oldCache == null) {
			return this;
		}

		updated = System.currentTimeMillis();
		if (detailed == false && oldCache.detailed) {
			detailed = true;
			detailedUpdate = System.currentTimeMillis();
		}

		if (visitedDate == null || visitedDate == 0) {
			visitedDate = oldCache.visitedDate;
		}
		if (reason == null || reason == 0) {
			reason = oldCache.reason;
		}
		if (geocode == null || geocode.length() == 0) {
			geocode = oldCache.geocode;
		}
		if (cacheid == null || cacheid.length() == 0) {
			cacheid = oldCache.cacheid;
		}
		if (guid == null || guid.length() == 0) {
			guid = oldCache.guid;
		}
		if (type == null || type.length() == 0) {
			type = oldCache.type;
		}
		if (name == null || name.length() == 0) {
			name = oldCache.name;
		if (nameSp == null || nameSp.length() == 0) {
			nameSp = oldCache.nameSp;
		}
		if (owner == null || owner.length() == 0) {
			owner = oldCache.owner;
		}
		if (ownerReal == null || ownerReal.length() == 0) {
			ownerReal = oldCache.ownerReal;
		}
		if (hidden == null) {
			hidden = oldCache.hidden;
		}
		if (hint == null || hint.length() == 0) {
			hint = oldCache.hint;
		}
		if (size == null || size.length() == 0) {
			size = oldCache.size;
		}
		if (difficulty == null || difficulty == 0) {
			difficulty = oldCache.difficulty;
		}
		if (terrain == null || terrain == 0) {
			terrain = oldCache.terrain;
		}
		if (direction == null) {
			direction = oldCache.direction;
		}
		if (distance == null) {
			distance = oldCache.distance;
		}
		if (latlon == null || latlon.length() == 0) {
			latlon = oldCache.latlon;
		}
		if (latitudeString == null || latitudeString.length() == 0) {
			latitudeString = oldCache.latitudeString;
		}
		if (longitudeString == null || longitudeString.length() == 0) {
			longitudeString = oldCache.longitudeString;
		}
		if (location == null || location.length() == 0) {
			location = oldCache.location;
		}
		if (latitude == null) {
			latitude = oldCache.latitude;
		}
		if (longitude == null) {
			longitude = oldCache.longitude;
		}
		if (elevation == null) {
			elevation = oldCache.elevation;
		}
		if (personalNote == null || personalNote.length() == 0) {
			personalNote = oldCache.personalNote;
		}
		if (shortdesc == null || shortdesc.length() == 0) {
			shortdesc = oldCache.shortdesc;
		}
		if (description == null || description.length() == 0) {
			description = oldCache.description;
		}
		if (favouriteCnt == null) {
			favouriteCnt = oldCache.favouriteCnt;
		}
		if (rating == null) {
			rating = oldCache.rating;
		}
		if (votes == null) {
			votes = oldCache.votes;
		}
		if (myVote == null) {
			myVote = oldCache.myVote;
		}
		if (inventoryItems == 0) {
			inventoryItems = oldCache.inventoryItems;
		}
		if (attributes == null) {
			attributes = oldCache.attributes;
		}
		if (waypoints == null) {
			waypoints = oldCache.waypoints;
		}
		cgWaypoint.mergeWayPoints(waypoints, oldCache.waypoints);
		if (spoilers == null) {
			spoilers = oldCache.spoilers;
		}
		if (inventory == null) {
			inventory = oldCache.inventory;
		}
		if (logs == null || logs.isEmpty()) { // keep last known logs if none
			logs = oldCache.logs;
		}

		return this;
	}

	public boolean hasTrackables(){
		return inventoryItems > 0;
	}

	public boolean canBeAddedToCalendar() {
		// is event type?
		if (!isEventCache()) {
			return false;
		}
		// has event date set?
		if (hidden == null) {
			return false;
		}
		// is in future?
		Date today = new Date();
		today.setHours(0);
		today.setMinutes(0);
		today.setSeconds(0);
		if (hidden.compareTo(today) <= 0) {
			return false;
		}
		return true;
	}

	/**
	 * checks if a page contains the guid of a cache
	 *
	 * @param cache  the cache to look for
	 * @param page   the page to search in
	 *
	 * @return  true: page contains guid of cache, false: otherwise
	 */
	boolean isGuidContainedInPage(final String page) {
		// check if the guid of the cache is anywhere in the page
		if (guid == null  || guid.length() == 0) {
			return false;
		}
		Pattern patternOk = Pattern.compile(guid, Pattern.CASE_INSENSITIVE);
		Matcher matcherOk = patternOk.matcher(page);
		if (matcherOk.find()) {
			Log.i(cgSettings.tag, "cgCache.isGuidContainedInPage: guid '" + guid + "' found");
			return true;
		} else {
			Log.i(cgSettings.tag, "cgCache.isGuidContainedInPage: guid '" + guid + "' not found");
			return false;
		}
	}

	public boolean isEventCache() {
		return "event".equalsIgnoreCase(type) || "mega".equalsIgnoreCase(type) || "cito".equalsIgnoreCase(type);
	}

	public boolean logVisit(IAbstractActivity fromActivity) {
		if (cacheid == null || cacheid.length() == 0) {
			fromActivity.showToast(((Activity)fromActivity).getResources().getString(R.string.err_cannot_log_visit));
			return true;
		}
		Intent logVisitIntent = new Intent((Activity)fromActivity, cgeovisit.class);
		logVisitIntent.putExtra(cgeovisit.EXTRAS_ID, cacheid);
		logVisitIntent.putExtra(cgeovisit.EXTRAS_GEOCODE, geocode.toUpperCase());
		logVisitIntent.putExtra(cgeovisit.EXTRAS_FOUND, found);

		((Activity)fromActivity).startActivity(logVisitIntent);

		return true;
	}

	@Override
	public String getLatitute() {
	public boolean logOffline(final IAbstractActivity fromActivity, final int logType, final cgSettings settings, final cgBase base) {
        String log = "";
        if (settings.getSignature() != null
                && settings.signatureAutoinsert
                && settings.getSignature().length() > 0) {
            log = LogTemplateProvider.applyTemplates(settings.getSignature(), base);
        }
        logOffline(fromActivity, log, Calendar.getInstance(), logType);
        return true;
	}

	void logOffline(final IAbstractActivity fromActivity, final String log, Calendar date, final int logType) {
		if (logType <= 0) {
			return;
		}
		cgeoapplication app = (cgeoapplication)((Activity)fromActivity).getApplication();
		final boolean status = app.saveLogOffline(geocode, date.getTime(), logType, log);

		Resources res = ((Activity)fromActivity).getResources();
		if (status) {
			fromActivity.showToast(res.getString(R.string.info_log_saved));
			app.saveVisitDate(geocode);
		} else {
			fromActivity.showToast(res.getString(R.string.err_log_post_failed));
		}
	}

	public ArrayList getPossibleLogTypes(cgSettings settings) {
		boolean isOwner = owner != null && owner.equalsIgnoreCase(settings.getUsername());
		ArrayList types = new ArrayList();
		if ("event".equals(type) || "mega".equals(type) || "cito".equals(type) || "lostfound".equals(type)) {
			types.add(cgBase.LOG_WILL_ATTEND);
			types.add(cgBase.LOG_NOTE);
			types.add(cgBase.LOG_ATTENDED);
			types.add(cgBase.LOG_NEEDS_ARCHIVE);
			if (isOwner) {
				types.add(cgBase.LOG_ANNOUNCEMENT);
			}
		} else if ("webcam".equals(type)) {
			types.add(cgBase.LOG_WEBCAM_PHOTO_TAKEN);
			types.add(cgBase.LOG_DIDNT_FIND_IT);
			types.add(cgBase.LOG_NOTE);
			types.add(cgBase.LOG_NEEDS_ARCHIVE);
			types.add(cgBase.LOG_NEEDS_MAINTENANCE);
		} else {
			types.add(cgBase.LOG_FOUND_IT);
			types.add(cgBase.LOG_DIDNT_FIND_IT);
			types.add(cgBase.LOG_NOTE);
			types.add(cgBase.LOG_NEEDS_ARCHIVE);
			types.add(cgBase.LOG_NEEDS_MAINTENANCE);
		}
		if (isOwner) {
			types.add(cgBase.LOG_OWNER_MAINTENANCE);
			types.add(cgBase.LOG_TEMP_DISABLE_LISTING);
			types.add(cgBase.LOG_ENABLE_LISTING);
			types.add(cgBase.LOG_ARCHIVE);
			types.remove(Integer.valueOf(cgBase.LOG_UPDATE_COORDINATES));
		}
		return types;
	}

	public void openInBrowser(Activity fromActivity) {
		fromActivity.startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse(getCacheUrl())));
	}

	private String getCacheUrl() {
		return getConnector().getCacheUrl(this);
	}

	private IConnector getConnector() {
		return ConnectorFactory.getConnector(this);
	}

	public boolean canOpenInBrowser() {
		return getCacheUrl() != null;
	}

	public boolean supportsRefresh() {
		return getConnector().supportsRefreshCache(this);
	}

	public boolean supportsWatchList() {
		return getConnector().supportsWatchList();
	}

	public boolean supportsLogging() {
		return getConnector().supportsLogging();
	}

	@Override
	public String getData() {
		return null;
	}

	@Override
	public Float getDifficulty() {
		return difficulty;
	}

	@Override
	public String getGeocode() {
		return geocode;
	}

		return latitudeString;
	}

	@Override
	public String getLongitude() {
		return longitudeString;
	}

	@Override
	public String getOwner() {
		return owner;
	}

	@Override
	public String getSize() {
		return size;
	}

	@Override
	public Float getTerrain() {
		return terrain;
	}

	@Override
	public String getType() {
		return type;
	}

	@Override
	public boolean isArchived() {
		return archived;
	}

	@Override
	public boolean isDisabled() {
		return disabled;
	}

	@Override
	public boolean isMembersOnly() {
		return members;
	}

	@Override
	public boolean isOwn() {
		return own;
	}

}

File
cgCache.java
Developer's decision
Combination
Kind of conflict
Class declaration
Comment
Import
Package declaration