package com.ghostsq.commander; import java.io.File; import java.io.FileNotFoundException; import com.ghostsq.commander.utils.Utils; import android.content.ContentProvider; import android.content.ContentValues; 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 FileProvider extends ContentProvider { private static final String TAG = "FileProvider"; public static final String URI_PREFIX = "content://com.ghostsq.commander.FileProvider"; public static final String AUTHORITY = "com.ghostsq.commander.FileProvider"; @Override public boolean onCreate() { return true; } @Override public String getType( Uri uri ) { String ext = Utils.getFileExt( uri.getPath() ); String mime = Utils.getMimeByExt( ext ); return mime; } @Override public Cursor query( Uri uri, String[] as, String s, String[] as1, String s1 ) { Log.v( TAG, "query( " + uri + " )" ); if( uri.toString().startsWith( URI_PREFIX ) ) { if( as == null || as.length == 0) { as = new String [] { MediaStore.MediaColumns.DATA, MediaStore.MediaColumns.MIME_TYPE, MediaStore.MediaColumns.DISPLAY_NAME, MediaStore.MediaColumns.SIZE }; } MatrixCursor c = new MatrixCursor( as ); MatrixCursor.RowBuilder row = c.newRow(); File f = new File( uri.getPath() ); if( !f.exists() || !f.isFile() ) throw new RuntimeException( "No file name specified: " + uri ); for( String col : as ) { if( MediaStore.MediaColumns.DATA.equals( col ) ) { row.add( f.getAbsolutePath() ); } else if( MediaStore.MediaColumns.MIME_TYPE.equals( col ) ) { row.add( getType( uri ) ); } else if( MediaStore.MediaColumns.DISPLAY_NAME.equals( col ) ) { row.add( f.getName() ); } else if( MediaStore.MediaColumns.SIZE.equals( col ) ) { row.add( f.length() ); } 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 { //Log.v( TAG, "openFile( " + uri + " )" ); File file = new File( uri.getPath() ); if( !file.exists() ) throw new FileNotFoundException(); ParcelFileDescriptor parcel = ParcelFileDescriptor.open( file, ParcelFileDescriptor.MODE_READ_ONLY ); return parcel; } @Override public int update( Uri uri, ContentValues contentvalues, String s, String[] as ) { return 0; } @Override public int delete( Uri uri, String s, String[] as ) { return 0; } @Override public Uri insert( Uri uri, ContentValues contentvalues ) { return null; } }