package com.f.programming;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.MalformedURLException;
import java.net.URL;
import android.content.ContentProvider;
import android.content.ContentValues;
import android.content.Context;
import android.content.UriMatcher;
import android.database.Cursor;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.net.Uri;
import android.os.ParcelFileDescriptor;
import android.util.Log;
public class NetworkContentProvider extends ContentProvider {
private static final String TAG = "NetworkContentProvider";
public static final String URL_QUERY_KEY = "url";
public static final String AUTHORITY = "com.f.programming.networkcontentprovider";
public static final String NETWORK_PATH = "newtwork";
private static final int BASE_URI_CODE = 0;
private static final int NETWORK_CODE = 1;
private final static UriMatcher sUriMatcher = new UriMatcher(BASE_URI_CODE);
static
{
sUriMatcher.addURI(AUTHORITY, NETWORK_PATH, NETWORK_CODE);
}
@Override
public final boolean onCreate() {
return true;
}
@Override
public final ParcelFileDescriptor openFile(final Uri uri, final String mode) {
Log.d(TAG, "openFile called. uri = " + uri);
ParcelFileDescriptor retVal = null;
final int code = sUriMatcher.match(uri);
switch (code) {
case NETWORK_CODE:
// get url from query parameter in uri.
final String urlString = uri.getQueryParameter(URL_QUERY_KEY);
if (urlString != null) {
// support only read from network.
if (!"r".equals(mode)) {
throw new IllegalArgumentException("not supported.");
}
Log.d(TAG, "Download URL is " + urlString);
// Check network state.
if (isConnected(getContext())) {
InputStream is = null;
OutputStream os = null;
try {
// Download from the URL.
URL url = new URL(urlString);
is = url.openStream();
// Get tmp folder.
File tmpFolder = getContext().getCacheDir();
// Delete tmp files.
File[] tmps = tmpFolder.listFiles();
if (tmps != null && tmps.length != 0) {
for (int i = 0; tmps.length < i; i++) {
tmps[i].delete();
}
}
//TODO Add file extension handling.
// Create new tmp file.
File tmp = File.createTempFile(null, null, tmpFolder);
Log.d(TAG, "tmp file: " + tmp.getAbsolutePath());
os = new FileOutputStream(tmp);
byte[] buffer = new byte[1024];
while(is.read(buffer) != -1) {
os.write(buffer);
}
os.close();
is.close();
retVal = ParcelFileDescriptor.open(tmp, ParcelFileDescriptor.MODE_READ_ONLY);
} catch (MalformedURLException e) {
Log.d(TAG, "Read error on " + urlString, e);
} catch (IOException e) {
// close streams.
if (is != null) {
try {
is.close();
} catch (IOException e1) {
Log.d(TAG, "Error on file close");
}
}
if (os != null) {
try {
os.close();
} catch (IOException e1) {
Log.d(TAG, "Error on file close");
}
}
}
}
}
break;
}
return retVal;
}
/**
* Check network connection state.
* @param context
* @return
*/
private static boolean isConnected(Context context) {
boolean retVal = false;
if(context != null) {
ConnectivityManager manager = (ConnectivityManager)context.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo info = manager.getActiveNetworkInfo();
if (info != null) {
retVal = info.isConnected();
}
}
return retVal;
}
@Override
public final String getType(Uri uri) {
return null;
}
@Override
public final Uri insert(Uri uri, ContentValues values) {
throw new IllegalArgumentException("not supported.");
}
@Override
public final int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) {
throw new IllegalArgumentException("not supported.");
}
@Override
public final Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) {
throw new IllegalArgumentException("not supported.");
}
@Override
public final int delete(Uri uri, String selection, String[] selectionArgs) {
throw new IllegalArgumentException("not supported.");
}
}