package net.iubris.ulysses.tasks.search.aware.locationstate; import java.util.List; import net.iubris.diane.aware.cache.exceptions.base.CacheEmptyException; import net.iubris.diane.aware.network.exceptions.base.NoNetworkException; import net.iubris.diane.searcher.aware.cache.exceptions.CacheAwareSearchException; import net.iubris.diane.searcher.aware.location.exceptions.LocationAwareSearchException; import net.iubris.diane.searcher.aware.network.exceptions.NetworkAwareSearchException; import net.iubris.ulysses.engine.searcher.location.aware.cache.DefaultUlyssesLocalizedSearcherCacheAware; import net.iubris.ulysses.engine.searcher.location.aware.cache.DefaultUlyssesLocalizedSearcherCacheAware.CacheSearchExceptions; import net.iubris.ulysses.engine.searcher.location.aware.full.UlyssesLocalizedSearcher; import net.iubris.ulysses.model.Place; import net.iubris.ulysses.tasks.search.aware.SearchAwareTaskLocationStateable; import net.iubris.ulysses.tasks.search.aware.locationstate.uimessage.UIMessageForLocationStateHandlerBeforeFirstResult; import roboguice.util.Ln; import android.location.Location; // this models a LocationTooNearException throwing at the first search (just after install), // when connection occurs to be not available (it could be) and cache is (obviously) empty public class LocationExceptionStateBeforeFirstResult extends AbstractLocationExceptionState { private final UIMessageForLocationStateHandlerBeforeFirstResult uiMessageHandler; private final LocationExceptionAfterFirstResult locationExceptionDefault; public LocationExceptionStateBeforeFirstResult(SearchAwareTaskLocationStateable searchAwareTask, Class<? extends LocationAwareSearchException> extendingLocationAwareSearchExceptionClass, UIMessageForLocationStateHandlerBeforeFirstResult uiMessageHandler, LocationExceptionAfterFirstResult locationExceptionDefault ) { super(searchAwareTask, extendingLocationAwareSearchExceptionClass); this.uiMessageHandler = uiMessageHandler; this.locationExceptionDefault = locationExceptionDefault; } @Override public void tryToSearch(Location location/*, Class<? extends LocationAwareSearchException> extendingLocationAwareSearchExceptionClass*/) throws NoNetworkException, NetworkAwareSearchException { // searchAwareTask.eventuallyHandleInUIPreSearchingOnLocationTooNearExceptionWhenNeverHappenedBefore(); // 1 uiMessageHandler.eventuallyHandleInUIPreSearching(); // 1 try { Ln.d("LocationTooNearExceptionStateNeverHappenedBefore: try with location: " + location); searchAwareTask.getLocalizedSearcher().search(location); searchAwareTask.setLocationExceptionState(this, locationExceptionDefault/*, extendingLocationAwareSearchExceptionClass*/); } catch (CacheEmptyException | CacheAwareSearchException e) { try { CacheSearchExceptions valueOf = DefaultUlyssesLocalizedSearcherCacheAware.CacheSearchExceptions .valueOf(e.getMessage()); // searchAwareTask.eventuallyHandleInUISearchingFailedByCacheInLocationTooNearException(valueOf); // 2 uiMessageHandler.eventuallyHandleInUISearchingFailedByCache(valueOf); // 2 } catch (IllegalArgumentException e1) { // searchAwareTask.eventuallyHandleInUISearchingFailedByCacheInLocationTooNearExceptionWithoutSpecificReason(); // 3 uiMessageHandler.eventuallyHandleInUISearchingFailedByCacheWithoutSpecificReason(); } } } @Override public void completeExecution(/*Class<? extends LocationAwareSearchException> extendigLocationAwareSearchExceptionClass*/) { UlyssesLocalizedSearcher localizedSearcher = searchAwareTask.getLocalizedSearcher(); List<Place> result = localizedSearcher.getResult(); if (localizedSearcher.isFoundByCache()) { // searchAwareTask.eventuallyHandleInUISearchResultUsingCacheOnLocationTooNearExceptionIfNeverResultBefore(result); // 4 uiMessageHandler.eventuallyHandleInUISearchResultUsingCache(result); // 4 searchAwareTask.setResultFoundByCache(); searchAwareTask.doOnSuccess(result); } else { // searchAwareTask.eventuallyHandleInUISearchResultUsingNetworkOnLocationTooNearExceptionIfNeverResultBefore(result); uiMessageHandler.eventuallyHandleInUISearchResultUsingNetwork(result); searchAwareTask.setResultFoundByNetwork(); } } }