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