package cgeo.geocaching.connector.trackable;
import cgeo.geocaching.connector.UserAction;
import cgeo.geocaching.log.AbstractLoggingActivity;
import cgeo.geocaching.log.TrackableLog;
import cgeo.geocaching.models.Trackable;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import java.util.List;
import io.reactivex.Observable;
/**
* Methods to be implemented by any connector for handling trackables
*
*/
public interface TrackableConnector {
/**
* Return the preference activity for which the connector is attached to.
* The service could be launched to ask user to configure something.
*
* @return the service ID corresponding to the preference activity for the connector
*/
int getPreferenceActivity();
boolean canHandleTrackable(@Nullable final String geocode);
boolean canHandleTrackable(@Nullable final String geocode, @Nullable final TrackableBrand brand);
/**
* Return the Title of the service the connector is attached to.
* Title may be used in messages given to the user, like to say which connector need to
* be activated for a specific feature.
*
* @return the service TITLE corresponding to this connector
*/
@NonNull
String getServiceTitle();
/**
* Check whether the connector has URLs corresponding to the trackable.
*
* @return <tt>true</tt> if the connector handles URLs, <tt>false</tt> otherwise
*/
boolean hasTrackableUrls();
/**
* Return the URL for a trackable. Might throw {@link IllegalStateException} if called
* on a connector which does not have URLs for trackables. This might be checked using
* {@link #hasTrackableUrls()}.
*
* @param trackable
* the trackable
* @return the URL corresponding to this trackable
*/
@NonNull
String getUrl(@NonNull final Trackable trackable);
/**
* Tell if the trackable has logging capabilities.
*
* @return True if trackable is loggable.
*/
boolean isLoggable();
/**
* Return a Trackable corresponding to the Trackable Geocode (Tracking Code) or Guid.
* Note: Only GC connector support guid.
*
* @param geocode
* the trackable Tracking Code
* @param guid
* the trackable guid
* @param id
* the trackable id
* @return the Trackable object.
*/
@Nullable
Trackable searchTrackable(final String geocode, final String guid, final String id);
/**
* Return a Trackable corresponding to the Trackable Geocode.
*
* @param geocode
* the trackable
* @return the Trackable object.
*/
@NonNull
List<Trackable> searchTrackables(final String geocode);
/**
* Return a Trackable id from an url.
*
* @param url
* for one trackable
* @return the Trackable Geocode.
*/
@Nullable
String getTrackableCodeFromUrl(@NonNull final String url);
/**
* Return a Trackable Tracking Code from an url.
*
* @param url for one trackable
* @return the Trackable Tracking Code, {@code null} if the URL cannot be decoded.
*/
@Nullable
String getTrackableTrackingCodeFromUrl(@NonNull final String url);
/**
* Return available user actions for the trackable.
*
* @return the List of available user action.
*/
@NonNull
List<UserAction> getUserActions();
/**
* Return the Brand object for the Trackable.
* If Brand could not be defined, return UNKNOWN_BRAND
*
* @return the Trackable Brand object.
*/
@NonNull
TrackableBrand getBrand();
/**
* Return a list of Trackable in user's inventory.
* In most case, user must be connected to the service.
*
* @return the Trackable list.
*/
@NonNull
List<Trackable> loadInventory();
/**
* Return the Trackable Logging Manager for the Trackable.
*
* @param activity
* currently running
* @return the Trackable logging manager.
*/
@Nullable
AbstractTrackableLoggingManager getTrackableLoggingManager(final AbstractLoggingActivity activity);
/**
* Tell if the trackable is loggable via a generic Trackable Connector.
*
* @return True if Trackable is loggable via a generic Trackable Connector.
*/
boolean isGenericLoggable();
/**
* Tell if the connector for this trackable is active.
*
* @return True if connector is active.
*/
boolean isActive();
/**
* Tell if user is registered to the connector for this trackable.
*
* @return True if user is connected to service.
*/
boolean isRegistered();
/**
* Tell if the connector recommend logging a Trackable with Geocode.
*
* @return True if connector recommend Geocode.
*/
boolean recommendLogWithGeocode();
int getTrackableLoggingManagerLoaderId();
/**
* Return list of Trackables in user's inventory converted to TrackableLog object.
* TrackableLog are used for posting a Trackable Log, they contain necessary
* information to post the Trackable Log.
*
* @return the TrackableLog corresponding to trackables in user's inventory as Observable.
*/
@NonNull
Observable<TrackableLog> trackableLogInventory();
/**
* Get host name of the connector server for dynamic loading of data.
*/
@NonNull
String getHost();
/**
* Get url of the connector server, for dynamic loading of data.
* Contains scheme.
*/
@NonNull
String getHostUrl();
/**
* Get url to use when testing website availability (because host url may redirect)
*
*/
@NonNull
String getTestUrl();
/**
* Get proxy url name of the connector server, if any, for dynamic loading of data.
* Contains scheme.
*/
@Nullable
String getProxyUrl();
}