package org.openintents.filemanager;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import org.openintents.filemanager.util.MimeTypeParser;
import org.openintents.filemanager.util.MimeTypes;
import org.xmlpull.v1.XmlPullParserException;
import android.content.ContentProvider;
import android.content.ContentValues;
import android.content.Context;
import android.content.pm.PackageManager.NameNotFoundException;
import android.content.res.XmlResourceParser;
import android.database.Cursor;
import android.database.MatrixCursor;
import android.net.Uri;
import android.os.ParcelFileDescriptor;
import android.provider.MediaStore;
import android.util.Log;
public class FileManagerProvider extends ContentProvider {
public static final String FILE_PROVIDER_PREFIX = "content://org.openintents.filemanager";
public static final String AUTHORITY = "org.openintents.filemanager";
private MimeTypes mMimeTypes;
@Override
public boolean onCreate() {
MimeTypes.initInstance(getContext());
mMimeTypes = MimeTypes.getInstance();
return true;
}
@Override
public int delete(Uri uri, String s, String[] as) {
// not supported
return 0;
}
@Override
public String getType(Uri uri) {
// return file extension (uri.lastIndexOf("."))
return mMimeTypes.getMimeType(uri.toString());
}
@Override
public Uri insert(Uri uri, ContentValues contentvalues) {
// not supported
return null;
}
@Override
public Cursor query(Uri uri, String[] projection, String s,
String[] as1, String s1) {
if (uri.toString().startsWith(FILE_PROVIDER_PREFIX)) {
if (projection == null || projection.length == 0) {
// Standard projection including all supported rows
projection = new String [] {
MediaStore.MediaColumns.DATA,
MediaStore.MediaColumns.MIME_TYPE,
MediaStore.MediaColumns.DISPLAY_NAME,
MediaStore.MediaColumns.SIZE};
}
MatrixCursor c = new MatrixCursor(projection);
MatrixCursor.RowBuilder row = c.newRow();
// data = absolute path to file
String data = uri.getPath();
int fromIndex = data.lastIndexOf(File.separatorChar) + 1;
if (fromIndex >= data.length()) {
// Last character was '/' or data is empty, so no file name
// was specified and we don't want to raise an
// IndexOutOfBoundsException
throw new RuntimeException("No file name specified: ".concat(data));
}
// According to Android docs, DISPLAY_NAME should be
// the last segment of Uri
String displayName =
(fromIndex > 0) ? data.substring(fromIndex) : data;
String mimeType = mMimeTypes.getMimeType(data);
long size = -1;
File file = new File(data);
if (file.exists() && file.isFile()) {
size = file.length();
}
for (String col : projection) {
if (col.equals(MediaStore.MediaColumns.DATA)) {
row.add(data);
} else if (col.equals(MediaStore.MediaColumns.MIME_TYPE)) {
row.add(mimeType);
} else if (col.equals(MediaStore.MediaColumns.DISPLAY_NAME)) {
row.add(displayName);
} else if (col.equals(MediaStore.MediaColumns.SIZE)) {
if (size >= 0)
row.add(size);
else {
// According to Android docs for unknown size.
// Standard getLong() won't throw exception and
// value will be 0.
row.add(null);
}
} else {
// Unsupported or unknown columns are filled up with null
row.add(null);
}
}
return c;
} else {
throw new RuntimeException("Unsupported uri");
}
}
@Override
public ParcelFileDescriptor openFile(Uri uri, String mode)
throws FileNotFoundException {
if (uri.toString().startsWith(FILE_PROVIDER_PREFIX)) {
int m = ParcelFileDescriptor.MODE_READ_ONLY;
if (mode.equalsIgnoreCase("rw"))
m = ParcelFileDescriptor.MODE_READ_WRITE;
File f = new File(uri.getPath());
return ParcelFileDescriptor.open(f, m);
} else {
throw new FileNotFoundException ("Unsupported uri: " + uri.toString());
}
}
@Override
public int update(Uri uri, ContentValues contentvalues, String s, String[] as) {
// not supported
return 0;
}
}