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