1a9f280f938b5fd5891c5cfe0999f8f1d4945d7a1nicolasroard/* 2a9f280f938b5fd5891c5cfe0999f8f1d4945d7a1nicolasroard * Copyright (C) 2012 The Android Open Source Project 3a9f280f938b5fd5891c5cfe0999f8f1d4945d7a1nicolasroard * 4a9f280f938b5fd5891c5cfe0999f8f1d4945d7a1nicolasroard * Licensed under the Apache License, Version 2.0 (the "License"); 5a9f280f938b5fd5891c5cfe0999f8f1d4945d7a1nicolasroard * you may not use this file except in compliance with the License. 6a9f280f938b5fd5891c5cfe0999f8f1d4945d7a1nicolasroard * You may obtain a copy of the License at 7a9f280f938b5fd5891c5cfe0999f8f1d4945d7a1nicolasroard * 8a9f280f938b5fd5891c5cfe0999f8f1d4945d7a1nicolasroard * http://www.apache.org/licenses/LICENSE-2.0 9a9f280f938b5fd5891c5cfe0999f8f1d4945d7a1nicolasroard * 10a9f280f938b5fd5891c5cfe0999f8f1d4945d7a1nicolasroard * Unless required by applicable law or agreed to in writing, software 11a9f280f938b5fd5891c5cfe0999f8f1d4945d7a1nicolasroard * distributed under the License is distributed on an "AS IS" BASIS, 12a9f280f938b5fd5891c5cfe0999f8f1d4945d7a1nicolasroard * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13a9f280f938b5fd5891c5cfe0999f8f1d4945d7a1nicolasroard * See the License for the specific language governing permissions and 14a9f280f938b5fd5891c5cfe0999f8f1d4945d7a1nicolasroard * limitations under the License. 15a9f280f938b5fd5891c5cfe0999f8f1d4945d7a1nicolasroard */ 160ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard 170ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroardpackage com.android.gallery3d.filtershow.provider; 180ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard 190ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroardimport android.content.ContentProvider; 200ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroardimport android.content.ContentValues; 210ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroardimport android.database.Cursor; 220ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroardimport android.database.MatrixCursor; 230ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroardimport android.net.Uri; 240ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroardimport android.os.ConditionVariable; 250ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroardimport android.os.ParcelFileDescriptor; 260ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroardimport android.provider.BaseColumns; 270ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroardimport android.provider.MediaStore; 280ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroardimport android.provider.OpenableColumns; 290ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard 300ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroardimport java.io.File; 310ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroardimport java.io.FileNotFoundException; 320ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard 330ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroardpublic class SharedImageProvider extends ContentProvider { 340ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard 350ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard private static final String LOGTAG = "SharedImageProvider"; 360ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard 370ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard public static final String MIME_TYPE = "image/jpeg"; 380ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard public static final String AUTHORITY = "com.android.gallery3d.filtershow.provider.SharedImageProvider"; 390ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard public static final Uri CONTENT_URI = Uri.parse("content://" + AUTHORITY + "/image"); 400ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard public static final String PREPARE = "prepare"; 410ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard 420ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard private final String[] mMimeStreamType = { 430ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard MIME_TYPE 440ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard }; 450ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard 460ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard private static ConditionVariable mImageReadyCond = new ConditionVariable(false); 470ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard 480ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard @Override 490ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard public int delete(Uri arg0, String arg1, String[] arg2) { 500ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard return 0; 510ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard } 520ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard 530ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard @Override 540ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard public String getType(Uri arg0) { 550ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard return MIME_TYPE; 560ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard } 570ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard 580ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard @Override 590ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard public String[] getStreamTypes(Uri arg0, String mimeTypeFilter) { 600ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard return mMimeStreamType; 610ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard } 620ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard 630ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard @Override 640ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard public Uri insert(Uri uri, ContentValues values) { 650ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard if (values.containsKey(PREPARE)) { 660ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard if (values.getAsBoolean(PREPARE)) { 670ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard mImageReadyCond.close(); 680ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard } else { 690ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard mImageReadyCond.open(); 700ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard } 710ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard } 720ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard return null; 730ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard } 740ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard 750ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard @Override 760ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard public int update(Uri arg0, ContentValues arg1, String arg2, String[] arg3) { 770ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard return 0; 780ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard } 790ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard 800ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard @Override 810ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard public boolean onCreate() { 820ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard return true; 830ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard } 840ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard 850ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard @Override 860ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) { 870ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard String uriPath = uri.getLastPathSegment(); 880ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard if (uriPath == null) { 890ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard return null; 900ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard } 910ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard if (projection == null) { 920ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard projection = new String[] { 930ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard BaseColumns._ID, 940ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard MediaStore.MediaColumns.DATA, 950ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard OpenableColumns.DISPLAY_NAME, 960ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard OpenableColumns.SIZE 970ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard }; 980ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard } 990ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard // If we receive a query on display name or size, 1000ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard // we should block until the image is ready 1010ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard mImageReadyCond.block(); 1020ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard 1030ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard File path = new File(uriPath); 1040ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard 1050ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard MatrixCursor cursor = new MatrixCursor(projection); 1060ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard Object[] columns = new Object[projection.length]; 1070ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard for (int i = 0; i < projection.length; i++) { 1080ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard if (projection[i].equalsIgnoreCase(BaseColumns._ID)) { 1090ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard columns[i] = 0; 1100ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard } else if (projection[i].equalsIgnoreCase(MediaStore.MediaColumns.DATA)) { 1110ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard columns[i] = uri; 1120ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard } else if (projection[i].equalsIgnoreCase(OpenableColumns.DISPLAY_NAME)) { 1130ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard columns[i] = path.getName(); 1140ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard } else if (projection[i].equalsIgnoreCase(OpenableColumns.SIZE)) { 1150ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard columns[i] = path.length(); 1160ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard } 1170ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard } 1180ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard cursor.addRow(columns); 1190ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard 1200ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard return cursor; 1210ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard } 1220ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard 123a9f280f938b5fd5891c5cfe0999f8f1d4945d7a1nicolasroard @Override 1240ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard public ParcelFileDescriptor openFile(Uri uri, String mode) 1250ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard throws FileNotFoundException { 1260ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard String uriPath = uri.getLastPathSegment(); 1270ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard if (uriPath == null) { 1280ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard return null; 1290ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard } 1300ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard // Here we need to block until the image is ready 1310ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard mImageReadyCond.block(); 1320ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard File path = new File(uriPath); 1330ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard int imode = 0; 1340ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard imode |= ParcelFileDescriptor.MODE_READ_ONLY; 1350ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard return ParcelFileDescriptor.open(path, imode); 1360ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard } 1370ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard} 138