1bafe58a83ade9cfa5c91e7033fae2d08a64603e8John Reck 2bafe58a83ade9cfa5c91e7033fae2d08a64603e8John Reck/* 3bafe58a83ade9cfa5c91e7033fae2d08a64603e8John Reck * Copyright (C) 2011 The Android Open Source Project 4bafe58a83ade9cfa5c91e7033fae2d08a64603e8John Reck * 5bafe58a83ade9cfa5c91e7033fae2d08a64603e8John Reck * Licensed under the Apache License, Version 2.0 (the "License"); 6bafe58a83ade9cfa5c91e7033fae2d08a64603e8John Reck * you may not use this file except in compliance with the License. 7bafe58a83ade9cfa5c91e7033fae2d08a64603e8John Reck * You may obtain a copy of the License at 8bafe58a83ade9cfa5c91e7033fae2d08a64603e8John Reck * 9bafe58a83ade9cfa5c91e7033fae2d08a64603e8John Reck * http://www.apache.org/licenses/LICENSE-2.0 10bafe58a83ade9cfa5c91e7033fae2d08a64603e8John Reck * 11bafe58a83ade9cfa5c91e7033fae2d08a64603e8John Reck * Unless required by applicable law or agreed to in writing, software 12bafe58a83ade9cfa5c91e7033fae2d08a64603e8John Reck * distributed under the License is distributed on an "AS IS" BASIS, 13bafe58a83ade9cfa5c91e7033fae2d08a64603e8John Reck * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14bafe58a83ade9cfa5c91e7033fae2d08a64603e8John Reck * See the License for the specific language governing permissions and 15bafe58a83ade9cfa5c91e7033fae2d08a64603e8John Reck * limitations under the License. 16bafe58a83ade9cfa5c91e7033fae2d08a64603e8John Reck */ 17bafe58a83ade9cfa5c91e7033fae2d08a64603e8John Reckpackage com.android.browser.homepages; 18bafe58a83ade9cfa5c91e7033fae2d08a64603e8John Reck 19bafe58a83ade9cfa5c91e7033fae2d08a64603e8John Reckimport android.content.ContentProvider; 20bafe58a83ade9cfa5c91e7033fae2d08a64603e8John Reckimport android.content.ContentValues; 21438bf46c98890b5fe1356e75b4bc759033c6fc57John Reckimport android.content.Context; 22bafe58a83ade9cfa5c91e7033fae2d08a64603e8John Reckimport android.content.res.AssetFileDescriptor; 23bafe58a83ade9cfa5c91e7033fae2d08a64603e8John Reckimport android.database.Cursor; 24bafe58a83ade9cfa5c91e7033fae2d08a64603e8John Reckimport android.net.Uri; 25bafe58a83ade9cfa5c91e7033fae2d08a64603e8John Reckimport android.os.ParcelFileDescriptor; 26bafe58a83ade9cfa5c91e7033fae2d08a64603e8John Reckimport android.util.Log; 27438bf46c98890b5fe1356e75b4bc759033c6fc57John Reckimport android.webkit.WebResourceResponse; 28bafe58a83ade9cfa5c91e7033fae2d08a64603e8John Reck 297287f80e144177895a5b17f7e0eb3488303b0d1cJohn Reckimport com.android.browser.BrowserSettings; 307287f80e144177895a5b17f7e0eb3488303b0d1cJohn Reck 317287f80e144177895a5b17f7e0eb3488303b0d1cJohn Reckimport java.io.File; 32bafe58a83ade9cfa5c91e7033fae2d08a64603e8John Reckimport java.io.IOException; 33438bf46c98890b5fe1356e75b4bc759033c6fc57John Reckimport java.io.InputStream; 347287f80e144177895a5b17f7e0eb3488303b0d1cJohn Reckimport java.io.PipedInputStream; 357287f80e144177895a5b17f7e0eb3488303b0d1cJohn Reckimport java.io.PipedOutputStream; 36bafe58a83ade9cfa5c91e7033fae2d08a64603e8John Reck 37bafe58a83ade9cfa5c91e7033fae2d08a64603e8John Reckpublic class HomeProvider extends ContentProvider { 38bafe58a83ade9cfa5c91e7033fae2d08a64603e8John Reck 39bafe58a83ade9cfa5c91e7033fae2d08a64603e8John Reck private static final String TAG = "HomeProvider"; 40bafe58a83ade9cfa5c91e7033fae2d08a64603e8John Reck public static final String AUTHORITY = "com.android.browser.home"; 41bafe58a83ade9cfa5c91e7033fae2d08a64603e8John Reck public static final String MOST_VISITED = "content://" + AUTHORITY + "/"; 42bafe58a83ade9cfa5c91e7033fae2d08a64603e8John Reck 43bafe58a83ade9cfa5c91e7033fae2d08a64603e8John Reck @Override 44bafe58a83ade9cfa5c91e7033fae2d08a64603e8John Reck public int delete(Uri uri, String selection, String[] selectionArgs) { 45bafe58a83ade9cfa5c91e7033fae2d08a64603e8John Reck return 0; 46bafe58a83ade9cfa5c91e7033fae2d08a64603e8John Reck } 47bafe58a83ade9cfa5c91e7033fae2d08a64603e8John Reck 48bafe58a83ade9cfa5c91e7033fae2d08a64603e8John Reck @Override 49bafe58a83ade9cfa5c91e7033fae2d08a64603e8John Reck public String getType(Uri uri) { 50bafe58a83ade9cfa5c91e7033fae2d08a64603e8John Reck return null; 51bafe58a83ade9cfa5c91e7033fae2d08a64603e8John Reck } 52bafe58a83ade9cfa5c91e7033fae2d08a64603e8John Reck 53bafe58a83ade9cfa5c91e7033fae2d08a64603e8John Reck @Override 54bafe58a83ade9cfa5c91e7033fae2d08a64603e8John Reck public Uri insert(Uri uri, ContentValues values) { 55bafe58a83ade9cfa5c91e7033fae2d08a64603e8John Reck return null; 56bafe58a83ade9cfa5c91e7033fae2d08a64603e8John Reck } 57bafe58a83ade9cfa5c91e7033fae2d08a64603e8John Reck 58bafe58a83ade9cfa5c91e7033fae2d08a64603e8John Reck @Override 59bafe58a83ade9cfa5c91e7033fae2d08a64603e8John Reck public boolean onCreate() { 60bafe58a83ade9cfa5c91e7033fae2d08a64603e8John Reck return false; 61bafe58a83ade9cfa5c91e7033fae2d08a64603e8John Reck } 62bafe58a83ade9cfa5c91e7033fae2d08a64603e8John Reck 63bafe58a83ade9cfa5c91e7033fae2d08a64603e8John Reck @Override 64bafe58a83ade9cfa5c91e7033fae2d08a64603e8John Reck public Cursor query(Uri uri, String[] projection, String selection, 65bafe58a83ade9cfa5c91e7033fae2d08a64603e8John Reck String[] selectionArgs, String sortOrder) { 66bafe58a83ade9cfa5c91e7033fae2d08a64603e8John Reck return null; 67bafe58a83ade9cfa5c91e7033fae2d08a64603e8John Reck } 68bafe58a83ade9cfa5c91e7033fae2d08a64603e8John Reck 69bafe58a83ade9cfa5c91e7033fae2d08a64603e8John Reck @Override 70bafe58a83ade9cfa5c91e7033fae2d08a64603e8John Reck public int update(Uri uri, ContentValues values, String selection, 71bafe58a83ade9cfa5c91e7033fae2d08a64603e8John Reck String[] selectionArgs) { 72bafe58a83ade9cfa5c91e7033fae2d08a64603e8John Reck return 0; 73bafe58a83ade9cfa5c91e7033fae2d08a64603e8John Reck } 74bafe58a83ade9cfa5c91e7033fae2d08a64603e8John Reck 75bafe58a83ade9cfa5c91e7033fae2d08a64603e8John Reck @Override 76bafe58a83ade9cfa5c91e7033fae2d08a64603e8John Reck public ParcelFileDescriptor openFile(Uri uri, String mode) { 77bafe58a83ade9cfa5c91e7033fae2d08a64603e8John Reck try { 78bafe58a83ade9cfa5c91e7033fae2d08a64603e8John Reck ParcelFileDescriptor[] pipes = ParcelFileDescriptor.createPipe(); 79bafe58a83ade9cfa5c91e7033fae2d08a64603e8John Reck final ParcelFileDescriptor write = pipes[1]; 80bafe58a83ade9cfa5c91e7033fae2d08a64603e8John Reck AssetFileDescriptor afd = new AssetFileDescriptor(write, 0, -1); 81bafe58a83ade9cfa5c91e7033fae2d08a64603e8John Reck new RequestHandler(getContext(), uri, afd.createOutputStream()).start(); 82bafe58a83ade9cfa5c91e7033fae2d08a64603e8John Reck return pipes[0]; 83bafe58a83ade9cfa5c91e7033fae2d08a64603e8John Reck } catch (IOException e) { 84bafe58a83ade9cfa5c91e7033fae2d08a64603e8John Reck Log.e(TAG, "Failed to handle request: " + uri, e); 85bafe58a83ade9cfa5c91e7033fae2d08a64603e8John Reck return null; 86bafe58a83ade9cfa5c91e7033fae2d08a64603e8John Reck } 87bafe58a83ade9cfa5c91e7033fae2d08a64603e8John Reck } 88bafe58a83ade9cfa5c91e7033fae2d08a64603e8John Reck 89438bf46c98890b5fe1356e75b4bc759033c6fc57John Reck public static WebResourceResponse shouldInterceptRequest(Context context, 90438bf46c98890b5fe1356e75b4bc759033c6fc57John Reck String url) { 91438bf46c98890b5fe1356e75b4bc759033c6fc57John Reck try { 92438bf46c98890b5fe1356e75b4bc759033c6fc57John Reck boolean useMostVisited = BrowserSettings.getInstance().useMostVisitedHomepage(); 93438bf46c98890b5fe1356e75b4bc759033c6fc57John Reck if (useMostVisited && url.startsWith("content://")) { 94438bf46c98890b5fe1356e75b4bc759033c6fc57John Reck Uri uri = Uri.parse(url); 95438bf46c98890b5fe1356e75b4bc759033c6fc57John Reck if (AUTHORITY.equals(uri.getAuthority())) { 96438bf46c98890b5fe1356e75b4bc759033c6fc57John Reck InputStream ins = context.getContentResolver() 97438bf46c98890b5fe1356e75b4bc759033c6fc57John Reck .openInputStream(uri); 98438bf46c98890b5fe1356e75b4bc759033c6fc57John Reck return new WebResourceResponse("text/html", "utf-8", ins); 99438bf46c98890b5fe1356e75b4bc759033c6fc57John Reck } 100438bf46c98890b5fe1356e75b4bc759033c6fc57John Reck } 1017287f80e144177895a5b17f7e0eb3488303b0d1cJohn Reck boolean listFiles = BrowserSettings.getInstance().isDebugEnabled(); 1027287f80e144177895a5b17f7e0eb3488303b0d1cJohn Reck if (listFiles && interceptFile(url)) { 1037287f80e144177895a5b17f7e0eb3488303b0d1cJohn Reck PipedInputStream ins = new PipedInputStream(); 1047287f80e144177895a5b17f7e0eb3488303b0d1cJohn Reck PipedOutputStream outs = new PipedOutputStream(ins); 1057287f80e144177895a5b17f7e0eb3488303b0d1cJohn Reck new RequestHandler(context, Uri.parse(url), outs).start(); 1067287f80e144177895a5b17f7e0eb3488303b0d1cJohn Reck return new WebResourceResponse("text/html", "utf-8", ins); 1077287f80e144177895a5b17f7e0eb3488303b0d1cJohn Reck } 108438bf46c98890b5fe1356e75b4bc759033c6fc57John Reck } catch (Exception e) {} 109438bf46c98890b5fe1356e75b4bc759033c6fc57John Reck return null; 110438bf46c98890b5fe1356e75b4bc759033c6fc57John Reck } 111438bf46c98890b5fe1356e75b4bc759033c6fc57John Reck 1127287f80e144177895a5b17f7e0eb3488303b0d1cJohn Reck private static boolean interceptFile(String url) { 1137287f80e144177895a5b17f7e0eb3488303b0d1cJohn Reck if (!url.startsWith("file:///")) { 1147287f80e144177895a5b17f7e0eb3488303b0d1cJohn Reck return false; 1157287f80e144177895a5b17f7e0eb3488303b0d1cJohn Reck } 1167287f80e144177895a5b17f7e0eb3488303b0d1cJohn Reck String fpath = url.substring(7); 1177287f80e144177895a5b17f7e0eb3488303b0d1cJohn Reck File f = new File(fpath); 1187287f80e144177895a5b17f7e0eb3488303b0d1cJohn Reck if (!f.isDirectory()) { 1197287f80e144177895a5b17f7e0eb3488303b0d1cJohn Reck return false; 1207287f80e144177895a5b17f7e0eb3488303b0d1cJohn Reck } 1217287f80e144177895a5b17f7e0eb3488303b0d1cJohn Reck return true; 1227287f80e144177895a5b17f7e0eb3488303b0d1cJohn Reck } 1237287f80e144177895a5b17f7e0eb3488303b0d1cJohn Reck 124bafe58a83ade9cfa5c91e7033fae2d08a64603e8John Reck} 125