LocalSource.java revision 88d80f4471c900628e2cb6eef23029b99af48e09
1c8ca07eb52a54efe327d024dc542e0a7f8849bfbChris Wren/*
2c8ca07eb52a54efe327d024dc542e0a7f8849bfbChris Wren * Copyright (C) 2012 The Android Open Source Project
3c8ca07eb52a54efe327d024dc542e0a7f8849bfbChris Wren *
4c8ca07eb52a54efe327d024dc542e0a7f8849bfbChris Wren * Licensed under the Apache License, Version 2.0 (the "License");
5c8ca07eb52a54efe327d024dc542e0a7f8849bfbChris Wren * you may not use this file except in compliance with the License.
6c8ca07eb52a54efe327d024dc542e0a7f8849bfbChris Wren * You may obtain a copy of the License at
7c8ca07eb52a54efe327d024dc542e0a7f8849bfbChris Wren *
8c8ca07eb52a54efe327d024dc542e0a7f8849bfbChris Wren *      http://www.apache.org/licenses/LICENSE-2.0
9c8ca07eb52a54efe327d024dc542e0a7f8849bfbChris Wren *
10c8ca07eb52a54efe327d024dc542e0a7f8849bfbChris Wren * Unless required by applicable law or agreed to in writing, software
11c8ca07eb52a54efe327d024dc542e0a7f8849bfbChris Wren * distributed under the License is distributed on an "AS IS" BASIS,
12c8ca07eb52a54efe327d024dc542e0a7f8849bfbChris Wren * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13c8ca07eb52a54efe327d024dc542e0a7f8849bfbChris Wren * See the License for the specific language governing permissions and
14c8ca07eb52a54efe327d024dc542e0a7f8849bfbChris Wren * limitations under the License.
15c8ca07eb52a54efe327d024dc542e0a7f8849bfbChris Wren */
16c8ca07eb52a54efe327d024dc542e0a7f8849bfbChris Wrenpackage com.android.dreams.phototable;
17c8ca07eb52a54efe327d024dc542e0a7f8849bfbChris Wren
18c8ca07eb52a54efe327d024dc542e0a7f8849bfbChris Wrenimport android.content.Context;
19d85f53c69dead1f1f6c0290b8104422143bc5166Chris Wrenimport android.content.SharedPreferences;
20c8ca07eb52a54efe327d024dc542e0a7f8849bfbChris Wrenimport android.database.Cursor;
21c8ca07eb52a54efe327d024dc542e0a7f8849bfbChris Wrenimport android.provider.MediaStore;
22c8ca07eb52a54efe327d024dc542e0a7f8849bfbChris Wren
23c8ca07eb52a54efe327d024dc542e0a7f8849bfbChris Wrenimport java.io.FileInputStream;
2483fee9012b6d5c5940de5b96fe8d98653ba14c0dChris Wrenimport java.io.InputStream;
2583fee9012b6d5c5940de5b96fe8d98653ba14c0dChris Wrenimport java.util.Collection;
26d85f53c69dead1f1f6c0290b8104422143bc5166Chris Wrenimport java.util.HashMap;
27c8ca07eb52a54efe327d024dc542e0a7f8849bfbChris Wrenimport java.util.LinkedList;
28d9b659aa5dfa4a3af96582ae49ba9ae145854a84Chris Wrenimport java.util.Set;
29c8ca07eb52a54efe327d024dc542e0a7f8849bfbChris Wren
30c8ca07eb52a54efe327d024dc542e0a7f8849bfbChris Wren/**
3183fee9012b6d5c5940de5b96fe8d98653ba14c0dChris Wren * Loads images from the local store.
32c8ca07eb52a54efe327d024dc542e0a7f8849bfbChris Wren */
3388d80f4471c900628e2cb6eef23029b99af48e09Chris Wrenpublic class LocalSource extends CursorPhotoSource {
34c8ca07eb52a54efe327d024dc542e0a7f8849bfbChris Wren    private static final String TAG = "PhotoTable.LocalSource";
35c8ca07eb52a54efe327d024dc542e0a7f8849bfbChris Wren
36e38c0c80e3e9b3b835e5c2e014ccf23e29663396Chris Wren    private final String mUnknownAlbumName;
37e38c0c80e3e9b3b835e5c2e014ccf23e29663396Chris Wren    private final String mLocalSourceName;
38d9b659aa5dfa4a3af96582ae49ba9ae145854a84Chris Wren    private Set<String> mFoundAlbumIds;
39bed703ef28f013639db3cd7a6b8a6e94d61075daChris Wren    private int mLastPosition;
40c8ca07eb52a54efe327d024dc542e0a7f8849bfbChris Wren
41d85f53c69dead1f1f6c0290b8104422143bc5166Chris Wren    public LocalSource(Context context, SharedPreferences settings) {
42d85f53c69dead1f1f6c0290b8104422143bc5166Chris Wren        super(context, settings);
43e38c0c80e3e9b3b835e5c2e014ccf23e29663396Chris Wren        mLocalSourceName = mResources.getString(R.string.local_source_name, "Photos on Device");
44e38c0c80e3e9b3b835e5c2e014ccf23e29663396Chris Wren        mUnknownAlbumName = mResources.getString(R.string.unknown_album_name, "Unknown");
4583fee9012b6d5c5940de5b96fe8d98653ba14c0dChris Wren        mSourceName = TAG;
46bed703ef28f013639db3cd7a6b8a6e94d61075daChris Wren        mLastPosition = INVALID;
47c8ca07eb52a54efe327d024dc542e0a7f8849bfbChris Wren        fillQueue();
48c8ca07eb52a54efe327d024dc542e0a7f8849bfbChris Wren    }
49c8ca07eb52a54efe327d024dc542e0a7f8849bfbChris Wren
50d9b659aa5dfa4a3af96582ae49ba9ae145854a84Chris Wren    private Set<String> getFoundAlbums() {
51d9b659aa5dfa4a3af96582ae49ba9ae145854a84Chris Wren        if (mFoundAlbumIds == null) {
52d9b659aa5dfa4a3af96582ae49ba9ae145854a84Chris Wren            findAlbums();
53d9b659aa5dfa4a3af96582ae49ba9ae145854a84Chris Wren        }
54d9b659aa5dfa4a3af96582ae49ba9ae145854a84Chris Wren        return mFoundAlbumIds;
55d9b659aa5dfa4a3af96582ae49ba9ae145854a84Chris Wren    }
56d9b659aa5dfa4a3af96582ae49ba9ae145854a84Chris Wren
5783fee9012b6d5c5940de5b96fe8d98653ba14c0dChris Wren    @Override
58d85f53c69dead1f1f6c0290b8104422143bc5166Chris Wren    public Collection<AlbumData> findAlbums() {
59d85f53c69dead1f1f6c0290b8104422143bc5166Chris Wren        log(TAG, "finding albums");
60d85f53c69dead1f1f6c0290b8104422143bc5166Chris Wren        HashMap<String, AlbumData> foundAlbums = new HashMap<String, AlbumData>();
61d85f53c69dead1f1f6c0290b8104422143bc5166Chris Wren
62d85f53c69dead1f1f6c0290b8104422143bc5166Chris Wren        String[] projection = {MediaStore.Images.Media.DATA, MediaStore.Images.Media.BUCKET_ID,
63d85f53c69dead1f1f6c0290b8104422143bc5166Chris Wren                MediaStore.Images.Media.BUCKET_DISPLAY_NAME, MediaStore.Images.Media.DATE_TAKEN};
64d85f53c69dead1f1f6c0290b8104422143bc5166Chris Wren        // This is a horrible hack that closes the where clause and injects a grouping clause.
65d85f53c69dead1f1f6c0290b8104422143bc5166Chris Wren        Cursor cursor = mResolver.query(MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
66d85f53c69dead1f1f6c0290b8104422143bc5166Chris Wren                projection, null, null, null);
67d85f53c69dead1f1f6c0290b8104422143bc5166Chris Wren        if (cursor != null) {
68bed703ef28f013639db3cd7a6b8a6e94d61075daChris Wren            cursor.moveToPosition(-1);
69d85f53c69dead1f1f6c0290b8104422143bc5166Chris Wren
70d85f53c69dead1f1f6c0290b8104422143bc5166Chris Wren            int dataIndex = cursor.getColumnIndex(MediaStore.Images.Media.DATA);
71d85f53c69dead1f1f6c0290b8104422143bc5166Chris Wren            int bucketIndex = cursor.getColumnIndex(MediaStore.Images.Media.BUCKET_ID);
72d85f53c69dead1f1f6c0290b8104422143bc5166Chris Wren            int nameIndex = cursor.getColumnIndex(MediaStore.Images.Media.BUCKET_DISPLAY_NAME);
73d85f53c69dead1f1f6c0290b8104422143bc5166Chris Wren            int updatedIndex = cursor.getColumnIndex(MediaStore.Images.Media.DATE_TAKEN);
74d85f53c69dead1f1f6c0290b8104422143bc5166Chris Wren
75d85f53c69dead1f1f6c0290b8104422143bc5166Chris Wren            if (bucketIndex < 0) {
76d85f53c69dead1f1f6c0290b8104422143bc5166Chris Wren                log(TAG, "can't find the ID column!");
77d85f53c69dead1f1f6c0290b8104422143bc5166Chris Wren            } else {
78bed703ef28f013639db3cd7a6b8a6e94d61075daChris Wren                while (cursor.moveToNext()) {
79d85f53c69dead1f1f6c0290b8104422143bc5166Chris Wren                    String id = TAG + ":" + cursor.getString(bucketIndex);
80d85f53c69dead1f1f6c0290b8104422143bc5166Chris Wren                    AlbumData data = foundAlbums.get(id);
81d85f53c69dead1f1f6c0290b8104422143bc5166Chris Wren                    if (foundAlbums.get(id) == null) {
82d85f53c69dead1f1f6c0290b8104422143bc5166Chris Wren                        data = new AlbumData();
83d85f53c69dead1f1f6c0290b8104422143bc5166Chris Wren                        data.id = id;
84e38c0c80e3e9b3b835e5c2e014ccf23e29663396Chris Wren                        data.account = mLocalSourceName;
85d85f53c69dead1f1f6c0290b8104422143bc5166Chris Wren
86d85f53c69dead1f1f6c0290b8104422143bc5166Chris Wren                        if (dataIndex >= 0) {
87d85f53c69dead1f1f6c0290b8104422143bc5166Chris Wren                            data.thumbnailUrl = cursor.getString(dataIndex);
88d85f53c69dead1f1f6c0290b8104422143bc5166Chris Wren                        }
89d85f53c69dead1f1f6c0290b8104422143bc5166Chris Wren
90d85f53c69dead1f1f6c0290b8104422143bc5166Chris Wren                        if (nameIndex >= 0) {
91d85f53c69dead1f1f6c0290b8104422143bc5166Chris Wren                            data.title = cursor.getString(nameIndex);
92d85f53c69dead1f1f6c0290b8104422143bc5166Chris Wren                        } else {
93e38c0c80e3e9b3b835e5c2e014ccf23e29663396Chris Wren                            data.title = mUnknownAlbumName;
94d85f53c69dead1f1f6c0290b8104422143bc5166Chris Wren                        }
95d85f53c69dead1f1f6c0290b8104422143bc5166Chris Wren
96d85f53c69dead1f1f6c0290b8104422143bc5166Chris Wren                        log(TAG, data.title + " found");
97d85f53c69dead1f1f6c0290b8104422143bc5166Chris Wren                        foundAlbums.put(id, data);
98d85f53c69dead1f1f6c0290b8104422143bc5166Chris Wren                    }
99d85f53c69dead1f1f6c0290b8104422143bc5166Chris Wren                    if (updatedIndex >= 0) {
100d85f53c69dead1f1f6c0290b8104422143bc5166Chris Wren                        long updated = cursor.getLong(updatedIndex);
101d85f53c69dead1f1f6c0290b8104422143bc5166Chris Wren                        data.updated = (data.updated == 0 ?
102d85f53c69dead1f1f6c0290b8104422143bc5166Chris Wren                                        updated :
103d85f53c69dead1f1f6c0290b8104422143bc5166Chris Wren                                        Math.min(data.updated, updated));
104d85f53c69dead1f1f6c0290b8104422143bc5166Chris Wren                    }
105d85f53c69dead1f1f6c0290b8104422143bc5166Chris Wren                }
106d85f53c69dead1f1f6c0290b8104422143bc5166Chris Wren            }
107d85f53c69dead1f1f6c0290b8104422143bc5166Chris Wren            cursor.close();
108d85f53c69dead1f1f6c0290b8104422143bc5166Chris Wren
109d85f53c69dead1f1f6c0290b8104422143bc5166Chris Wren        }
110d85f53c69dead1f1f6c0290b8104422143bc5166Chris Wren        log(TAG, "found " + foundAlbums.size() + " items.");
111d9b659aa5dfa4a3af96582ae49ba9ae145854a84Chris Wren        mFoundAlbumIds = foundAlbums.keySet();
112d85f53c69dead1f1f6c0290b8104422143bc5166Chris Wren        return foundAlbums.values();
113d85f53c69dead1f1f6c0290b8104422143bc5166Chris Wren    }
114d85f53c69dead1f1f6c0290b8104422143bc5166Chris Wren
115d85f53c69dead1f1f6c0290b8104422143bc5166Chris Wren    @Override
11688d80f4471c900628e2cb6eef23029b99af48e09Chris Wren    protected void openCursor(ImageData data) {
11788d80f4471c900628e2cb6eef23029b99af48e09Chris Wren        log(TAG, "opening single album");
11888d80f4471c900628e2cb6eef23029b99af48e09Chris Wren
11988d80f4471c900628e2cb6eef23029b99af48e09Chris Wren        String[] projection = {MediaStore.Images.Media.DATA, MediaStore.Images.Media.ORIENTATION,
12088d80f4471c900628e2cb6eef23029b99af48e09Chris Wren                MediaStore.Images.Media.BUCKET_ID, MediaStore.Images.Media.BUCKET_DISPLAY_NAME};
12188d80f4471c900628e2cb6eef23029b99af48e09Chris Wren        String selection = MediaStore.Images.Media.BUCKET_ID + " = '" + data.albumId + "'";
12288d80f4471c900628e2cb6eef23029b99af48e09Chris Wren
12388d80f4471c900628e2cb6eef23029b99af48e09Chris Wren        data.cursor = mResolver.query(MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
12488d80f4471c900628e2cb6eef23029b99af48e09Chris Wren                projection, selection, null, null);
12588d80f4471c900628e2cb6eef23029b99af48e09Chris Wren    }
12688d80f4471c900628e2cb6eef23029b99af48e09Chris Wren
12788d80f4471c900628e2cb6eef23029b99af48e09Chris Wren    @Override
12888d80f4471c900628e2cb6eef23029b99af48e09Chris Wren    protected void findPosition(ImageData data) {
12988d80f4471c900628e2cb6eef23029b99af48e09Chris Wren        if (data.position == -1) {
13088d80f4471c900628e2cb6eef23029b99af48e09Chris Wren            if (data.cursor == null) {
13188d80f4471c900628e2cb6eef23029b99af48e09Chris Wren                openCursor(data);
13288d80f4471c900628e2cb6eef23029b99af48e09Chris Wren            }
13388d80f4471c900628e2cb6eef23029b99af48e09Chris Wren            if (data.cursor != null) {
13488d80f4471c900628e2cb6eef23029b99af48e09Chris Wren                int dataIndex = data.cursor.getColumnIndex(MediaStore.Images.Media.DATA);
13588d80f4471c900628e2cb6eef23029b99af48e09Chris Wren                data.cursor.moveToPosition(-1);
13688d80f4471c900628e2cb6eef23029b99af48e09Chris Wren                while (data.position == -1 && data.cursor.moveToNext()) {
13788d80f4471c900628e2cb6eef23029b99af48e09Chris Wren                    String url = data.cursor.getString(dataIndex);
13888d80f4471c900628e2cb6eef23029b99af48e09Chris Wren                    if (url != null && url.equals(data.url)) {
13988d80f4471c900628e2cb6eef23029b99af48e09Chris Wren                        data.position = data.cursor.getPosition();
14088d80f4471c900628e2cb6eef23029b99af48e09Chris Wren                    }
14188d80f4471c900628e2cb6eef23029b99af48e09Chris Wren                }
14288d80f4471c900628e2cb6eef23029b99af48e09Chris Wren                if (data.position == -1) {
14388d80f4471c900628e2cb6eef23029b99af48e09Chris Wren                    // oops!  The image isn't in this album. How did we get here?
14488d80f4471c900628e2cb6eef23029b99af48e09Chris Wren                    data.position = INVALID;
14588d80f4471c900628e2cb6eef23029b99af48e09Chris Wren                }
14688d80f4471c900628e2cb6eef23029b99af48e09Chris Wren            }
14788d80f4471c900628e2cb6eef23029b99af48e09Chris Wren        }
14888d80f4471c900628e2cb6eef23029b99af48e09Chris Wren    }
14988d80f4471c900628e2cb6eef23029b99af48e09Chris Wren
15088d80f4471c900628e2cb6eef23029b99af48e09Chris Wren    @Override
15188d80f4471c900628e2cb6eef23029b99af48e09Chris Wren    protected ImageData unpackImageData(Cursor cursor, ImageData data) {
15288d80f4471c900628e2cb6eef23029b99af48e09Chris Wren        if (data == null) {
15388d80f4471c900628e2cb6eef23029b99af48e09Chris Wren            data = new ImageData();
15488d80f4471c900628e2cb6eef23029b99af48e09Chris Wren        }
15588d80f4471c900628e2cb6eef23029b99af48e09Chris Wren        int dataIndex = cursor.getColumnIndex(MediaStore.Images.Media.DATA);
15688d80f4471c900628e2cb6eef23029b99af48e09Chris Wren        int orientationIndex = cursor.getColumnIndex(MediaStore.Images.Media.ORIENTATION);
15788d80f4471c900628e2cb6eef23029b99af48e09Chris Wren        int bucketIndex = cursor.getColumnIndex(MediaStore.Images.Media.BUCKET_ID);
15888d80f4471c900628e2cb6eef23029b99af48e09Chris Wren
15988d80f4471c900628e2cb6eef23029b99af48e09Chris Wren        data.url = cursor.getString(dataIndex);
16088d80f4471c900628e2cb6eef23029b99af48e09Chris Wren        data.albumId = cursor.getString(bucketIndex);
16188d80f4471c900628e2cb6eef23029b99af48e09Chris Wren        data.position = UNINITIALIZED;
16288d80f4471c900628e2cb6eef23029b99af48e09Chris Wren        data.cursor = null;
16388d80f4471c900628e2cb6eef23029b99af48e09Chris Wren        data.orientation = cursor.getInt(orientationIndex);
16488d80f4471c900628e2cb6eef23029b99af48e09Chris Wren
16588d80f4471c900628e2cb6eef23029b99af48e09Chris Wren        return data;
16688d80f4471c900628e2cb6eef23029b99af48e09Chris Wren    }
16788d80f4471c900628e2cb6eef23029b99af48e09Chris Wren
16888d80f4471c900628e2cb6eef23029b99af48e09Chris Wren    @Override
16983fee9012b6d5c5940de5b96fe8d98653ba14c0dChris Wren    protected Collection<ImageData> findImages(int howMany) {
17083fee9012b6d5c5940de5b96fe8d98653ba14c0dChris Wren        log(TAG, "finding images");
17183fee9012b6d5c5940de5b96fe8d98653ba14c0dChris Wren        LinkedList<ImageData> foundImages = new LinkedList<ImageData>();
17283fee9012b6d5c5940de5b96fe8d98653ba14c0dChris Wren
17383fee9012b6d5c5940de5b96fe8d98653ba14c0dChris Wren        String[] projection = {MediaStore.Images.Media.DATA, MediaStore.Images.Media.ORIENTATION,
17483fee9012b6d5c5940de5b96fe8d98653ba14c0dChris Wren                MediaStore.Images.Media.BUCKET_ID, MediaStore.Images.Media.BUCKET_DISPLAY_NAME};
17583fee9012b6d5c5940de5b96fe8d98653ba14c0dChris Wren        String selection = "";
176d9b659aa5dfa4a3af96582ae49ba9ae145854a84Chris Wren        for (String id : getFoundAlbums()) {
177d9b659aa5dfa4a3af96582ae49ba9ae145854a84Chris Wren            if (mSettings.isAlbumEnabled(id)) {
178d85f53c69dead1f1f6c0290b8104422143bc5166Chris Wren                String[] parts = id.split(":");
179d85f53c69dead1f1f6c0290b8104422143bc5166Chris Wren                if (parts.length > 1) {
180d85f53c69dead1f1f6c0290b8104422143bc5166Chris Wren                    if (selection.length() > 0) {
181d85f53c69dead1f1f6c0290b8104422143bc5166Chris Wren                        selection += " OR ";
182d85f53c69dead1f1f6c0290b8104422143bc5166Chris Wren                    }
183d85f53c69dead1f1f6c0290b8104422143bc5166Chris Wren                    selection += MediaStore.Images.Media.BUCKET_ID + " = '" + parts[1] + "'";
184d85f53c69dead1f1f6c0290b8104422143bc5166Chris Wren                }
18583fee9012b6d5c5940de5b96fe8d98653ba14c0dChris Wren            }
18683fee9012b6d5c5940de5b96fe8d98653ba14c0dChris Wren        }
187d85f53c69dead1f1f6c0290b8104422143bc5166Chris Wren        if (selection.isEmpty()) {
188d85f53c69dead1f1f6c0290b8104422143bc5166Chris Wren            return foundImages;
189d85f53c69dead1f1f6c0290b8104422143bc5166Chris Wren        }
190d85f53c69dead1f1f6c0290b8104422143bc5166Chris Wren
191c8ca07eb52a54efe327d024dc542e0a7f8849bfbChris Wren        Cursor cursor = mResolver.query(MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
19283fee9012b6d5c5940de5b96fe8d98653ba14c0dChris Wren                projection, selection, null, null);
193c8ca07eb52a54efe327d024dc542e0a7f8849bfbChris Wren        if (cursor != null) {
19488d80f4471c900628e2cb6eef23029b99af48e09Chris Wren            int dataIndex = cursor.getColumnIndex(MediaStore.Images.Media.DATA);
19588d80f4471c900628e2cb6eef23029b99af48e09Chris Wren
196bed703ef28f013639db3cd7a6b8a6e94d61075daChris Wren            if (cursor.getCount() > howMany && mLastPosition == INVALID) {
197bed703ef28f013639db3cd7a6b8a6e94d61075daChris Wren                mLastPosition = pickRandomStart(cursor.getCount(), howMany);
198c8ca07eb52a54efe327d024dc542e0a7f8849bfbChris Wren            }
199bed703ef28f013639db3cd7a6b8a6e94d61075daChris Wren            cursor.moveToPosition(mLastPosition);
200c8ca07eb52a54efe327d024dc542e0a7f8849bfbChris Wren
201c8ca07eb52a54efe327d024dc542e0a7f8849bfbChris Wren            if (dataIndex < 0) {
20283fee9012b6d5c5940de5b96fe8d98653ba14c0dChris Wren                log(TAG, "can't find the DATA column!");
203c8ca07eb52a54efe327d024dc542e0a7f8849bfbChris Wren            } else {
204bed703ef28f013639db3cd7a6b8a6e94d61075daChris Wren                while (foundImages.size() < howMany && cursor.moveToNext()) {
20588d80f4471c900628e2cb6eef23029b99af48e09Chris Wren                    ImageData data = unpackImageData(cursor, null);
20683fee9012b6d5c5940de5b96fe8d98653ba14c0dChris Wren                    foundImages.offer(data);
207bed703ef28f013639db3cd7a6b8a6e94d61075daChris Wren                    mLastPosition = cursor.getPosition();
208c8ca07eb52a54efe327d024dc542e0a7f8849bfbChris Wren                }
209c8ca07eb52a54efe327d024dc542e0a7f8849bfbChris Wren                if (cursor.isAfterLast()) {
210bed703ef28f013639db3cd7a6b8a6e94d61075daChris Wren                    mLastPosition = -1;
211bed703ef28f013639db3cd7a6b8a6e94d61075daChris Wren                }
212bed703ef28f013639db3cd7a6b8a6e94d61075daChris Wren                if (cursor.isBeforeFirst()) {
213bed703ef28f013639db3cd7a6b8a6e94d61075daChris Wren                    mLastPosition = INVALID;
214c8ca07eb52a54efe327d024dc542e0a7f8849bfbChris Wren                }
215c8ca07eb52a54efe327d024dc542e0a7f8849bfbChris Wren            }
21683fee9012b6d5c5940de5b96fe8d98653ba14c0dChris Wren
217c8ca07eb52a54efe327d024dc542e0a7f8849bfbChris Wren            cursor.close();
218c8ca07eb52a54efe327d024dc542e0a7f8849bfbChris Wren        }
21983fee9012b6d5c5940de5b96fe8d98653ba14c0dChris Wren        log(TAG, "found " + foundImages.size() + " items.");
22083fee9012b6d5c5940de5b96fe8d98653ba14c0dChris Wren        return foundImages;
221c8ca07eb52a54efe327d024dc542e0a7f8849bfbChris Wren    }
222c8ca07eb52a54efe327d024dc542e0a7f8849bfbChris Wren
22383fee9012b6d5c5940de5b96fe8d98653ba14c0dChris Wren    @Override
224c6bebae5e07c0108294d05e33fbace209d2f9b0dChris Wren    protected InputStream getStream(ImageData data, int longSide) {
22583fee9012b6d5c5940de5b96fe8d98653ba14c0dChris Wren        FileInputStream fis = null;
22683fee9012b6d5c5940de5b96fe8d98653ba14c0dChris Wren        try {
22783fee9012b6d5c5940de5b96fe8d98653ba14c0dChris Wren            log(TAG, "opening:" + data.url);
22883fee9012b6d5c5940de5b96fe8d98653ba14c0dChris Wren            fis = new FileInputStream(data.url);
22983fee9012b6d5c5940de5b96fe8d98653ba14c0dChris Wren        } catch (Exception ex) {
23083fee9012b6d5c5940de5b96fe8d98653ba14c0dChris Wren            log(TAG, ex.toString());
23183fee9012b6d5c5940de5b96fe8d98653ba14c0dChris Wren            fis = null;
232c8ca07eb52a54efe327d024dc542e0a7f8849bfbChris Wren        }
233c8ca07eb52a54efe327d024dc542e0a7f8849bfbChris Wren
23483fee9012b6d5c5940de5b96fe8d98653ba14c0dChris Wren        return (InputStream) fis;
235c8ca07eb52a54efe327d024dc542e0a7f8849bfbChris Wren    }
236c8ca07eb52a54efe327d024dc542e0a7f8849bfbChris Wren}
23788d80f4471c900628e2cb6eef23029b99af48e09Chris Wren
238