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