package cgeo.geocaching.connector.oc;
import cgeo.geocaching.CgeoApplication;
import cgeo.geocaching.SearchResult;
import cgeo.geocaching.connector.ILoggingManager;
import cgeo.geocaching.connector.capability.ILogin;
import cgeo.geocaching.connector.capability.ISearchByCenter;
import cgeo.geocaching.connector.capability.ISearchByFinder;
import cgeo.geocaching.connector.capability.ISearchByKeyword;
import cgeo.geocaching.connector.capability.ISearchByOwner;
import cgeo.geocaching.connector.capability.ISearchByViewPort;
import cgeo.geocaching.connector.capability.IgnoreCapability;
import cgeo.geocaching.connector.capability.PersonalNoteCapability;
import cgeo.geocaching.connector.capability.WatchListCapability;
import cgeo.geocaching.connector.gc.MapTokens;
import cgeo.geocaching.connector.oc.UserInfo.UserInfoStatus;
import cgeo.geocaching.location.Geopoint;
import cgeo.geocaching.location.Viewport;
import cgeo.geocaching.log.LogCacheActivity;
import cgeo.geocaching.models.Geocache;
import cgeo.geocaching.sensors.Sensors;
import cgeo.geocaching.settings.Settings;
import cgeo.geocaching.storage.DataStore;
import cgeo.geocaching.utils.CryptUtils;
import cgeo.geocaching.utils.Log;
import android.app.Activity;
import android.os.Handler;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.annotation.StringRes;
import java.util.Locale;
import org.apache.commons.lang3.StringUtils;
public class OCApiLiveConnector extends OCApiConnector implements ISearchByCenter, ISearchByViewPort, ILogin, ISearchByKeyword, ISearchByOwner, ISearchByFinder, WatchListCapability, IgnoreCapability, PersonalNoteCapability {
private final String cS;
private final int isActivePrefKeyId;
private final int tokenPublicPrefKeyId;
private final int tokenSecretPrefKeyId;
private UserInfo userInfo = new UserInfo(StringUtils.EMPTY, 0, UserInfoStatus.NOT_RETRIEVED);
public OCApiLiveConnector(final String name, final String host, final boolean https, final String prefix, final String licenseString, @StringRes final int cKResId, @StringRes final int cSResId, final int isActivePrefKeyId, final int tokenPublicPrefKeyId, final int tokenSecretPrefKeyId, final ApiSupport apiSupport, @NonNull final String abbreviation) {
super(name, host, https, prefix, CryptUtils.rot13(CgeoApplication.getInstance().getString(cKResId)), licenseString, apiSupport, abbreviation);
cS = CryptUtils.rot13(CgeoApplication.getInstance().getString(cSResId));
this.isActivePrefKeyId = isActivePrefKeyId;
this.tokenPublicPrefKeyId = tokenPublicPrefKeyId;
this.tokenSecretPrefKeyId = tokenSecretPrefKeyId;
}
@Override
public boolean isActive() {
return Settings.isOCConnectorActive(isActivePrefKeyId);
}
@Override
@NonNull
public SearchResult searchByViewport(@NonNull final Viewport viewport, @Nullable final MapTokens tokens) {
final SearchResult result = new SearchResult(OkapiClient.getCachesBBox(viewport, this));
Log.d(String.format(Locale.getDefault(), "OC returning %d caches from search by viewport", result.getCount()));
return result;
}
@Override
public SearchResult searchByCenter(@NonNull final Geopoint center) {
return new SearchResult(OkapiClient.getCachesAround(center, this));
}
@Override
public SearchResult searchByOwner(@NonNull final String username) {
return new SearchResult(OkapiClient.getCachesByOwner(username, this));
}
@Override
public SearchResult searchByFinder(@NonNull final String username) {
return new SearchResult(OkapiClient.getCachesByFinder(username, this));
}
@Override
public OAuthLevel getSupportedAuthLevel() {
if (Settings.hasOCAuthorization(tokenPublicPrefKeyId, tokenSecretPrefKeyId)) {
return OAuthLevel.Level3;
}
return OAuthLevel.Level1;
}
@Override
public String getCS() {
return CryptUtils.rot13(cS);
}
@Override
public int getTokenPublicPrefKeyId() {
return tokenPublicPrefKeyId;
}
@Override
public int getTokenSecretPrefKeyId() {
return tokenSecretPrefKeyId;
}
@Override
public boolean canAddToWatchList(@NonNull final Geocache cache) {
return getApiSupport() == ApiSupport.current;
}
@Override
public boolean addToWatchlist(@NonNull final Geocache cache) {
final boolean added = OkapiClient.setWatchState(cache, true, this);
if (added) {
DataStore.saveChangedCache(cache);
}
return added;
}
@Override
public boolean removeFromWatchlist(@NonNull final Geocache cache) {
final boolean removed = OkapiClient.setWatchState(cache, false, this);
if (removed) {
DataStore.saveChangedCache(cache);
}
return removed;
}
@Override
public boolean supportsLogging() {
return true;
}
@Override
@NonNull
public ILoggingManager getLoggingManager(@NonNull final LogCacheActivity activity, @NonNull final Geocache cache) {
return new OkapiLoggingManager(activity, this, cache);
}
@Override
public boolean canLog(@NonNull final Geocache cache) {
return true;
}
private boolean supportsPersonalization() {
return getSupportedAuthLevel() == OAuthLevel.Level3;
}
@Override
public boolean login(final Handler handler, @Nullable final Activity fromActivity) {
if (supportsPersonalization()) {
userInfo = OkapiClient.getUserInfo(this);
} else {
userInfo = new UserInfo(StringUtils.EMPTY, 0, UserInfoStatus.NOT_SUPPORTED);
}
return userInfo.getStatus() == UserInfoStatus.SUCCESSFUL;
}
@Override
public boolean isOwner(@NonNull final Geocache cache) {
return StringUtils.isNotEmpty(getUserName()) && StringUtils.equals(cache.getOwnerDisplayName(), getUserName());
}
@Override
public String getUserName() {
return userInfo.getName();
}
@Override
public int getCachesFound() {
return userInfo.getFinds();
}
@Override
public String getLoginStatusString() {
return CgeoApplication.getInstance().getString(userInfo.getStatus().resId);
}
@Override
public boolean isLoggedIn() {
return userInfo.getStatus() == UserInfoStatus.SUCCESSFUL;
}
@Override
public SearchResult searchByKeyword(@NonNull final String name) {
return new SearchResult(OkapiClient.getCachesNamed(Sensors.getInstance().currentGeo().getCoords(), name, this));
}
@Override
public boolean isSearchForMyCaches(final String username) {
return StringUtils.equalsIgnoreCase(username, getUserName());
}
@Override
public boolean canAddPersonalNote(@NonNull final Geocache cache) {
return this.getApiSupport() == ApiSupport.current && isActive();
}
@Override
public boolean uploadPersonalNote(@NonNull final Geocache cache) {
return OkapiClient.uploadPersonalNotes(this, cache);
}
@Override
public boolean canIgnoreCache(final Geocache cache) {
return true;
}
@Override
public void ignoreCache(final Geocache cache) {
final boolean ignored = OkapiClient.setIgnored(cache, this);
if (ignored) {
DataStore.saveChangedCache(cache);
}
}
}