1931fd3728855b03bcab825ce10475d7447e9097aThe Android Open Source Project/** 2931fd3728855b03bcab825ce10475d7447e9097aThe Android Open Source Project * Copyright (C) 2008 The Android Open Source Project 3931fd3728855b03bcab825ce10475d7447e9097aThe Android Open Source Project * 4931fd3728855b03bcab825ce10475d7447e9097aThe Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); you may not 5931fd3728855b03bcab825ce10475d7447e9097aThe Android Open Source Project * use this file except in compliance with the License. You may obtain a copy 6931fd3728855b03bcab825ce10475d7447e9097aThe Android Open Source Project * of the License at 7931fd3728855b03bcab825ce10475d7447e9097aThe Android Open Source Project * 8931fd3728855b03bcab825ce10475d7447e9097aThe Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 9931fd3728855b03bcab825ce10475d7447e9097aThe Android Open Source Project * 10931fd3728855b03bcab825ce10475d7447e9097aThe Android Open Source Project * Unless required by applicable law or agreed to in writing, software 11931fd3728855b03bcab825ce10475d7447e9097aThe Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT 12931fd3728855b03bcab825ce10475d7447e9097aThe Android Open Source Project * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the 13931fd3728855b03bcab825ce10475d7447e9097aThe Android Open Source Project * License for the specific language governing permissions and limitations 14931fd3728855b03bcab825ce10475d7447e9097aThe Android Open Source Project * under the License. 15931fd3728855b03bcab825ce10475d7447e9097aThe Android Open Source Project */ 16931fd3728855b03bcab825ce10475d7447e9097aThe Android Open Source Project 17931fd3728855b03bcab825ce10475d7447e9097aThe Android Open Source Projectpackage com.android.htmlviewer; 18931fd3728855b03bcab825ce10475d7447e9097aThe Android Open Source Project 19931fd3728855b03bcab825ce10475d7447e9097aThe Android Open Source Projectimport java.io.FileNotFoundException; 20931fd3728855b03bcab825ce10475d7447e9097aThe Android Open Source Projectimport java.io.File; 21931fd3728855b03bcab825ce10475d7447e9097aThe Android Open Source Projectimport java.lang.UnsupportedOperationException; 22931fd3728855b03bcab825ce10475d7447e9097aThe Android Open Source Project 23931fd3728855b03bcab825ce10475d7447e9097aThe Android Open Source Projectimport android.content.ContentProvider; 24931fd3728855b03bcab825ce10475d7447e9097aThe Android Open Source Projectimport android.content.ContentValues; 25931fd3728855b03bcab825ce10475d7447e9097aThe Android Open Source Projectimport android.database.Cursor; 26931fd3728855b03bcab825ce10475d7447e9097aThe Android Open Source Projectimport android.net.Uri; 274a52a6e550253c5e2648141fdec7918094a50dccPatrick Scottimport android.os.Binder; 28931fd3728855b03bcab825ce10475d7447e9097aThe Android Open Source Projectimport android.os.ParcelFileDescriptor; 294a52a6e550253c5e2648141fdec7918094a50dccPatrick Scottimport android.os.Process; 30931fd3728855b03bcab825ce10475d7447e9097aThe Android Open Source Project 31931fd3728855b03bcab825ce10475d7447e9097aThe Android Open Source Project/** 32931fd3728855b03bcab825ce10475d7447e9097aThe Android Open Source Project * WebView does not support file: loading. This class wraps a file load 337609f0f74a1b93ae5964d1d31a51fd25cca5d72bBen Murdoch * with a content provider. 34931fd3728855b03bcab825ce10475d7447e9097aThe Android Open Source Project * As HTMLViewer does not have internet access nor does it allow 35931fd3728855b03bcab825ce10475d7447e9097aThe Android Open Source Project * Javascript to be run, it is safe to load file based HTML content. 36931fd3728855b03bcab825ce10475d7447e9097aThe Android Open Source Project*/ 37931fd3728855b03bcab825ce10475d7447e9097aThe Android Open Source Projectpublic class FileContentProvider extends ContentProvider { 387609f0f74a1b93ae5964d1d31a51fd25cca5d72bBen Murdoch 397609f0f74a1b93ae5964d1d31a51fd25cca5d72bBen Murdoch public static final String BASE_URI = 40931fd3728855b03bcab825ce10475d7447e9097aThe Android Open Source Project "content://com.android.htmlfileprovider"; 41931fd3728855b03bcab825ce10475d7447e9097aThe Android Open Source Project 42931fd3728855b03bcab825ce10475d7447e9097aThe Android Open Source Project @Override 43931fd3728855b03bcab825ce10475d7447e9097aThe Android Open Source Project public String getType(Uri uri) { 44931fd3728855b03bcab825ce10475d7447e9097aThe Android Open Source Project // If the mimetype is not appended to the uri, then return an empty string 45931fd3728855b03bcab825ce10475d7447e9097aThe Android Open Source Project String mimetype = uri.getQuery(); 46931fd3728855b03bcab825ce10475d7447e9097aThe Android Open Source Project return mimetype == null ? "" : mimetype; 47931fd3728855b03bcab825ce10475d7447e9097aThe Android Open Source Project } 487609f0f74a1b93ae5964d1d31a51fd25cca5d72bBen Murdoch 49931fd3728855b03bcab825ce10475d7447e9097aThe Android Open Source Project @Override 50931fd3728855b03bcab825ce10475d7447e9097aThe Android Open Source Project public ParcelFileDescriptor openFile(Uri uri, String mode) throws FileNotFoundException { 514a52a6e550253c5e2648141fdec7918094a50dccPatrick Scott // android:exported="false" is broken in older releases so we have to 524a52a6e550253c5e2648141fdec7918094a50dccPatrick Scott // manually enforce the calling identity. 534a52a6e550253c5e2648141fdec7918094a50dccPatrick Scott if (Process.myUid() != Binder.getCallingUid()) { 544a52a6e550253c5e2648141fdec7918094a50dccPatrick Scott throw new SecurityException("Permission denied"); 554a52a6e550253c5e2648141fdec7918094a50dccPatrick Scott } 56931fd3728855b03bcab825ce10475d7447e9097aThe Android Open Source Project if (!"r".equals(mode)) { 57931fd3728855b03bcab825ce10475d7447e9097aThe Android Open Source Project throw new FileNotFoundException("Bad mode for " + uri + ": " + mode); 58931fd3728855b03bcab825ce10475d7447e9097aThe Android Open Source Project } 590207e4ae37eb72b77d79d6ebb2e1f2d612f33547Alex Hua String filename = uri.getPath(); 602e368f6d87eb82691f855e93f85599b75b489731Ben Murdoch File f = new File(filename); 612e368f6d87eb82691f855e93f85599b75b489731Ben Murdoch if (f.isDirectory()) { 622e368f6d87eb82691f855e93f85599b75b489731Ben Murdoch return null; 632e368f6d87eb82691f855e93f85599b75b489731Ben Murdoch } 642e368f6d87eb82691f855e93f85599b75b489731Ben Murdoch return ParcelFileDescriptor.open(f, ParcelFileDescriptor.MODE_READ_ONLY); 65931fd3728855b03bcab825ce10475d7447e9097aThe Android Open Source Project } 667609f0f74a1b93ae5964d1d31a51fd25cca5d72bBen Murdoch 67931fd3728855b03bcab825ce10475d7447e9097aThe Android Open Source Project @Override 68931fd3728855b03bcab825ce10475d7447e9097aThe Android Open Source Project public int delete(Uri uri, String selection, String[] selectionArgs) { 69931fd3728855b03bcab825ce10475d7447e9097aThe Android Open Source Project throw new UnsupportedOperationException(); 70931fd3728855b03bcab825ce10475d7447e9097aThe Android Open Source Project } 71931fd3728855b03bcab825ce10475d7447e9097aThe Android Open Source Project 72931fd3728855b03bcab825ce10475d7447e9097aThe Android Open Source Project @Override 73931fd3728855b03bcab825ce10475d7447e9097aThe Android Open Source Project public Uri insert(Uri uri, ContentValues values) { 74931fd3728855b03bcab825ce10475d7447e9097aThe Android Open Source Project throw new UnsupportedOperationException(); 75931fd3728855b03bcab825ce10475d7447e9097aThe Android Open Source Project } 76931fd3728855b03bcab825ce10475d7447e9097aThe Android Open Source Project 77931fd3728855b03bcab825ce10475d7447e9097aThe Android Open Source Project @Override 78931fd3728855b03bcab825ce10475d7447e9097aThe Android Open Source Project public boolean onCreate() { 79931fd3728855b03bcab825ce10475d7447e9097aThe Android Open Source Project return true; 80931fd3728855b03bcab825ce10475d7447e9097aThe Android Open Source Project } 81931fd3728855b03bcab825ce10475d7447e9097aThe Android Open Source Project 82931fd3728855b03bcab825ce10475d7447e9097aThe Android Open Source Project @Override 83931fd3728855b03bcab825ce10475d7447e9097aThe Android Open Source Project public Cursor query(Uri uri, String[] projection, String selection, 84931fd3728855b03bcab825ce10475d7447e9097aThe Android Open Source Project String[] selectionArgs, String sortOrder) { 85931fd3728855b03bcab825ce10475d7447e9097aThe Android Open Source Project throw new UnsupportedOperationException(); 86931fd3728855b03bcab825ce10475d7447e9097aThe Android Open Source Project } 87931fd3728855b03bcab825ce10475d7447e9097aThe Android Open Source Project 88931fd3728855b03bcab825ce10475d7447e9097aThe Android Open Source Project @Override 89931fd3728855b03bcab825ce10475d7447e9097aThe Android Open Source Project public int update(Uri uri, ContentValues values, String selection, 90931fd3728855b03bcab825ce10475d7447e9097aThe Android Open Source Project String[] selectionArgs) { 91931fd3728855b03bcab825ce10475d7447e9097aThe Android Open Source Project throw new UnsupportedOperationException(); 92931fd3728855b03bcab825ce10475d7447e9097aThe Android Open Source Project } 93931fd3728855b03bcab825ce10475d7447e9097aThe Android Open Source Project 94931fd3728855b03bcab825ce10475d7447e9097aThe Android Open Source Project} 95