1f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin/*
2f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin * Copyright (C) 2010 The Android Open Source Project
3f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin *
4f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin * Licensed under the Apache License, Version 2.0 (the "License");
5f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin * you may not use this file except in compliance with the License.
6f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin * You may obtain a copy of the License at
7f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin *
8f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin *      http://www.apache.org/licenses/LICENSE-2.0
9f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin *
10f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin * Unless required by applicable law or agreed to in writing, software
11f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin * distributed under the License is distributed on an "AS IS" BASIS,
12f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin * See the License for the specific language governing permissions and
14f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin * limitations under the License.
15f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin */
16f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
17f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linpackage com.android.gallery3d.data;
18f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
1921a412c93c9b0401b039f4eb86d4950752e5bb84Owen Linimport android.content.ContentResolver;
20f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport android.net.Uri;
2121a412c93c9b0401b039f4eb86d4950752e5bb84Owen Linimport android.webkit.MimeTypeMap;
22f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
232b3ee0ea07246b859a5b75d8a6102a7cce7ec838Owen Linimport com.android.gallery3d.app.GalleryApp;
242b3ee0ea07246b859a5b75d8a6102a7cce7ec838Owen Lin
2528cb4161da5fc3756933ca67d509b8af1c6275f1Owen Linimport java.io.UnsupportedEncodingException;
26f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport java.net.URLDecoder;
27f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport java.net.URLEncoder;
28f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
29f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linclass UriSource extends MediaSource {
30f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    @SuppressWarnings("unused")
31f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private static final String TAG = "UriSource";
32be6e69c8d57f63a96b14237b943ab5ae6343813eOwen Lin    private static final String IMAGE_TYPE_PREFIX = "image/";
33be6e69c8d57f63a96b14237b943ab5ae6343813eOwen Lin    private static final String IMAGE_TYPE_ANY = "image/*";
3428cb4161da5fc3756933ca67d509b8af1c6275f1Owen Lin    private static final String CHARSET_UTF_8 = "utf-8";
35f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
36f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private GalleryApp mApplication;
37f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
38f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    public UriSource(GalleryApp context) {
39f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        super("uri");
40f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mApplication = context;
41f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
42f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
43f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    @Override
44f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    public MediaObject createMediaObject(Path path) {
45f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        String segment[] = path.split();
4621a412c93c9b0401b039f4eb86d4950752e5bb84Owen Lin        if (segment.length != 3) {
47f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            throw new RuntimeException("bad path: " + path);
48f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        }
4928cb4161da5fc3756933ca67d509b8af1c6275f1Owen Lin        try {
5028cb4161da5fc3756933ca67d509b8af1c6275f1Owen Lin            String uri = URLDecoder.decode(segment[1], CHARSET_UTF_8);
5128cb4161da5fc3756933ca67d509b8af1c6275f1Owen Lin            String type = URLDecoder.decode(segment[2], CHARSET_UTF_8);
5228cb4161da5fc3756933ca67d509b8af1c6275f1Owen Lin            return new UriImage(mApplication, path, Uri.parse(uri), type);
5328cb4161da5fc3756933ca67d509b8af1c6275f1Owen Lin        } catch (UnsupportedEncodingException e) {
5428cb4161da5fc3756933ca67d509b8af1c6275f1Owen Lin            throw new AssertionError(e);
5528cb4161da5fc3756933ca67d509b8af1c6275f1Owen Lin        }
56f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
57f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
5821a412c93c9b0401b039f4eb86d4950752e5bb84Owen Lin    private String getMimeType(Uri uri) {
5921a412c93c9b0401b039f4eb86d4950752e5bb84Owen Lin        if (ContentResolver.SCHEME_FILE.equals(uri.getScheme())) {
6021a412c93c9b0401b039f4eb86d4950752e5bb84Owen Lin            String extension =
6121a412c93c9b0401b039f4eb86d4950752e5bb84Owen Lin                    MimeTypeMap.getFileExtensionFromUrl(uri.toString());
6221a412c93c9b0401b039f4eb86d4950752e5bb84Owen Lin            String type = MimeTypeMap.getSingleton()
6321a412c93c9b0401b039f4eb86d4950752e5bb84Owen Lin                    .getMimeTypeFromExtension(extension.toLowerCase());
6421a412c93c9b0401b039f4eb86d4950752e5bb84Owen Lin            if (type != null) return type;
6521a412c93c9b0401b039f4eb86d4950752e5bb84Owen Lin        }
66f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        // Assume the type is image if the type cannot be resolved
67f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        // This could happen for "http" URI.
6821a412c93c9b0401b039f4eb86d4950752e5bb84Owen Lin        String type = mApplication.getContentResolver().getType(uri);
6921a412c93c9b0401b039f4eb86d4950752e5bb84Owen Lin        if (type == null) type = "image/*";
7021a412c93c9b0401b039f4eb86d4950752e5bb84Owen Lin        return type;
7121a412c93c9b0401b039f4eb86d4950752e5bb84Owen Lin    }
7221a412c93c9b0401b039f4eb86d4950752e5bb84Owen Lin
7321a412c93c9b0401b039f4eb86d4950752e5bb84Owen Lin    @Override
7421a412c93c9b0401b039f4eb86d4950752e5bb84Owen Lin    public Path findPathByUri(Uri uri, String type) {
75be6e69c8d57f63a96b14237b943ab5ae6343813eOwen Lin        String mimeType = getMimeType(uri);
76be6e69c8d57f63a96b14237b943ab5ae6343813eOwen Lin
77be6e69c8d57f63a96b14237b943ab5ae6343813eOwen Lin        // Try to find a most specific type but it has to be started with "image/"
78be6e69c8d57f63a96b14237b943ab5ae6343813eOwen Lin        if ((type == null) || (IMAGE_TYPE_ANY.equals(type)
79be6e69c8d57f63a96b14237b943ab5ae6343813eOwen Lin                && mimeType.startsWith(IMAGE_TYPE_PREFIX))) {
80be6e69c8d57f63a96b14237b943ab5ae6343813eOwen Lin            type = mimeType;
81be6e69c8d57f63a96b14237b943ab5ae6343813eOwen Lin        }
82be6e69c8d57f63a96b14237b943ab5ae6343813eOwen Lin
83be6e69c8d57f63a96b14237b943ab5ae6343813eOwen Lin        if (type.startsWith(IMAGE_TYPE_PREFIX)) {
8428cb4161da5fc3756933ca67d509b8af1c6275f1Owen Lin            try {
8528cb4161da5fc3756933ca67d509b8af1c6275f1Owen Lin                return Path.fromString("/uri/"
8628cb4161da5fc3756933ca67d509b8af1c6275f1Owen Lin                        + URLEncoder.encode(uri.toString(), CHARSET_UTF_8)
8728cb4161da5fc3756933ca67d509b8af1c6275f1Owen Lin                        + "/" +URLEncoder.encode(type, CHARSET_UTF_8));
8828cb4161da5fc3756933ca67d509b8af1c6275f1Owen Lin            } catch (UnsupportedEncodingException e) {
8928cb4161da5fc3756933ca67d509b8af1c6275f1Owen Lin                throw new AssertionError(e);
9028cb4161da5fc3756933ca67d509b8af1c6275f1Owen Lin            }
91f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        }
92be6e69c8d57f63a96b14237b943ab5ae6343813eOwen Lin        // We have no clues that it is an image
93f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        return null;
94f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
95f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin}
96