package com.vaguehope.onosendai.images;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap;
import com.vaguehope.onosendai.util.LogWrapper;
public class ImageLoadRequestManager {
private static final LogWrapper LOG = new LogWrapper("ILRM");
private final ConcurrentMap<String, List<ImageLoadRequest>> reqs = new ConcurrentHashMap<String, List<ImageLoadRequest>>();
public void registerRequest (final ImageLoadRequest req) {
cleanUp(); // FIXME doing this here is a lazy hack.
List<ImageLoadRequest> list = this.reqs.get(req.getUrl());
if (list == null) {
final List<ImageLoadRequest> newList = new ArrayList<ImageLoadRequest>();
final List<ImageLoadRequest> prevList = this.reqs.putIfAbsent(req.getUrl(), newList);
list = prevList != null ? prevList : newList;
}
synchronized (list) {
list.add(req);
}
}
public void unregisterRequest (final ImageLoadRequest req) {
final List<ImageLoadRequest> list = this.reqs.get(req.getUrl());
if (list == null) return;
synchronized (list) {
list.remove(req);
}
}
public void setLoadingProgressIfRequired (final ImageLoadRequest originReq, final String msg) {
final List<ImageLoadRequest> list = this.reqs.get(originReq.getUrl());
if (list == null) return;
synchronized (list) {
for (final ImageLoadRequest req : list) {
if (req != originReq) req.setLoadingProgressIfRequired(msg);
}
}
}
public void setFetchingProgressIfRequired (final ImageLoadRequest originReq, final Integer progress, final Integer total) {
final List<ImageLoadRequest> list = this.reqs.get(originReq.getUrl());
if (list == null) return;
synchronized (list) {
for (final ImageLoadRequest req : list) {
if (req != originReq) req.setFetchingProgressIfRequired(progress, total);
}
}
}
public void clear () {
this.reqs.clear();
}
private void cleanUp () {
final Iterator<List<ImageLoadRequest>> ittr = this.reqs.values().iterator();
while (ittr.hasNext()) {
final List<ImageLoadRequest> list = ittr.next();
synchronized (list) {
removeExpired(list.iterator());
if (list.size() < 1) ittr.remove();
}
}
if (this.reqs.size() > 100) LOG.e("Manager has %s active requests, is there a leak?", this.reqs.size());
}
private static void removeExpired (final Iterator<ImageLoadRequest> ittr) {
while (ittr.hasNext()) {
if (!ittr.next().shouldFinishLoading()) ittr.remove();
}
}
}