/**
* Copyright 2009 Joe LaPenna
*/
package com.joelapenna.foursquared.util;
import com.joelapenna.foursquared.FoursquaredSettings;
import android.net.Uri;
import android.util.Log;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.util.Observable;
import java.util.Observer;
/**
* @author Joe LaPenna (joe@joelapenna.com)
*/
public class RemoteResourceManager extends Observable {
private static final String TAG = "RemoteResourceManager";
private static final boolean DEBUG = FoursquaredSettings.DEBUG;
private DiskCache mDiskCache;
private RemoteResourceFetcher mRemoteResourceFetcher;
private FetcherObserver mFetcherObserver = new FetcherObserver();
public RemoteResourceManager(String cacheName) {
this(new BaseDiskCache("foursquare", cacheName));
}
public RemoteResourceManager(DiskCache cache) {
mDiskCache = cache;
mRemoteResourceFetcher = new RemoteResourceFetcher(mDiskCache);
mRemoteResourceFetcher.addObserver(mFetcherObserver);
}
public boolean exists(Uri uri) {
return mDiskCache.exists(Uri.encode(uri.toString()));
}
/**
* If IOException is thrown, we don't have the resource available.
*/
public File getFile(Uri uri) {
if (DEBUG) Log.d(TAG, "getInputStream(): " + uri);
return mDiskCache.getFile(Uri.encode(uri.toString()));
}
/**
* If IOException is thrown, we don't have the resource available.
*/
public InputStream getInputStream(Uri uri) throws IOException {
if (DEBUG) Log.d(TAG, "getInputStream(): " + uri);
return mDiskCache.getInputStream(Uri.encode(uri.toString()));
}
/**
* Request a resource be downloaded. Useful to call after a IOException from getInputStream.
*/
public void request(Uri uri) {
if (DEBUG) Log.d(TAG, "request(): " + uri);
mRemoteResourceFetcher.fetch(uri, Uri.encode(uri.toString()));
}
/**
* Explicitly expire an individual item.
*/
public void invalidate(Uri uri) {
mDiskCache.invalidate(Uri.encode(uri.toString()));
}
public void shutdown() {
mRemoteResourceFetcher.shutdown();
mDiskCache.cleanup();
}
public void clear() {
mRemoteResourceFetcher.shutdown();
mDiskCache.clear();
}
public static abstract class ResourceRequestObserver implements Observer {
private Uri mRequestUri;
abstract public void requestReceived(Observable observable, Uri uri);
public ResourceRequestObserver(Uri requestUri) {
mRequestUri = requestUri;
}
@Override
public void update(Observable observable, Object data) {
if (DEBUG) Log.d(TAG, "Recieved update: " + data);
Uri dataUri = (Uri)data;
if (dataUri == mRequestUri) {
if (DEBUG) Log.d(TAG, "requestReceived: " + dataUri);
requestReceived(observable, dataUri);
}
}
}
/**
* Relay the observed download to this controlling class.
*/
private class FetcherObserver implements Observer {
@Override
public void update(Observable observable, Object data) {
setChanged();
notifyObservers(data);
}
}
}