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