package com.o3dr.android.client.apis; import com.o3dr.android.client.Drone; import com.o3dr.services.android.lib.model.AbstractCommandListener; import java.util.concurrent.ConcurrentHashMap; /** * Common interface for the drone set of api classes. * Created by Fredia Huya-Kouadio on 7/5/15. */ public abstract class Api { protected interface Builder<T extends Api> { T build(Drone drone); } /** * Retrieves the api instance bound to the given Drone object. * @param drone Drone object * @param apiCache Used to retrieve the api instance if it exists, or store it if it doesn't exist. * @param apiBuilder Api instance generator. * @param <T> Specific api instance type. * @return The matching Api instance. */ protected static <T extends Api> T getApi(Drone drone, ConcurrentHashMap<Drone, T> apiCache, Api.Builder<T> apiBuilder){ if(drone == null || apiCache == null) return null; T apiInstance = apiCache.get(drone); if(apiInstance == null && apiBuilder != null){ apiInstance = apiBuilder.build(drone); final T previousInstance = apiCache.putIfAbsent(drone, apiInstance); if(previousInstance != null) apiInstance = previousInstance; } return apiInstance; } protected static void postSuccessEvent(final AbstractCommandListener listener){ if(listener != null){ listener.onSuccess(); } } protected static void postErrorEvent(int error, AbstractCommandListener listener){ if(listener != null){ listener.onError(error); } } protected static void postTimeoutEvent(AbstractCommandListener listener){ if(listener != null){ listener.onTimeout(); } } }