package org.limewire.core.impl.search.browse; import java.util.ArrayList; import java.util.List; import java.util.concurrent.ExecutorService; import org.limewire.core.api.library.RemoteLibrary; import org.limewire.core.api.library.RemoteLibraryEvent; import org.limewire.core.api.library.RemoteLibraryManager; import org.limewire.core.api.library.RemoteLibraryEvent.Type; import org.limewire.core.api.search.SearchListener; import org.limewire.core.api.search.SearchResult; import org.limewire.core.api.search.browse.BrowseStatus; import org.limewire.core.api.search.browse.BrowseStatusListener; import org.limewire.core.api.search.browse.BrowseStatus.BrowseState; import org.limewire.listener.EventListener; class AllFriendsBrowseSearch extends AbstractBrowseSearch { private final RemoteLibraryManager remoteLibraryManager; private final ExecutorService backgroundExecutor; private final AllFriendsListEventListener listEventListener = new AllFriendsListEventListener(); public AllFriendsBrowseSearch(RemoteLibraryManager remoteLibraryManager, ExecutorService backgroundExecutor) { this.remoteLibraryManager = remoteLibraryManager; this.backgroundExecutor = backgroundExecutor; } @Override public void start() { backgroundExecutor.execute(new Runnable() { @Override public void run() { for (SearchListener listener : searchListeners) { listener.searchStarted(AllFriendsBrowseSearch.this); } installListener(); loadSnapshot(); } }); } @Override public void stop() { for (SearchListener listener : searchListeners) { listener.searchStopped(AllFriendsBrowseSearch.this); } removeListener(); } private void loadSnapshot() { RemoteLibrary allFriendsLibrary = remoteLibraryManager.getAllFriendsLibrary(); List<SearchResult> remoteFileItems = new ArrayList<SearchResult>(allFriendsLibrary.size()); for (SearchResult searchResult : allFriendsLibrary) { remoteFileItems.add(searchResult); } //add all files for (SearchListener listener : searchListeners) { listener.handleSearchResults(this, remoteFileItems); } //browse is finished for (SearchListener listener : searchListeners) { listener.searchStopped(AllFriendsBrowseSearch.this); } BrowseStatus status = (remoteFileItems.size() > 0) ? new BrowseStatus(AllFriendsBrowseSearch.this, BrowseState.LOADED) : new BrowseStatus(AllFriendsBrowseSearch.this, BrowseState.NO_FRIENDS_SHARING); for (BrowseStatusListener listener : browseStatusListeners){ listener.statusChanged(status); } } private void installListener(){ remoteLibraryManager.getAllFriendsLibrary().addListener(listEventListener); } private void removeListener(){ remoteLibraryManager.getAllFriendsLibrary().removeListener(listEventListener); } private class AllFriendsListEventListener implements EventListener<RemoteLibraryEvent> { @Override public void handleEvent(RemoteLibraryEvent event) { if (event.getType() != Type.STATE_CHANGED) { BrowseStatus status = new BrowseStatus(AllFriendsBrowseSearch.this, BrowseState.UPDATED); for (BrowseStatusListener listener : browseStatusListeners){ listener.statusChanged(status); } } } } @Override public void repeat() { backgroundExecutor.execute(new Runnable() { public void run() { loadSnapshot(); } }); } }