/*
* Copyright (C) 2011 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.android.browser.homepages;
import android.content.ContentProvider;
import android.content.ContentValues;
import android.content.Context;
import android.content.res.AssetFileDescriptor;
import android.database.Cursor;
import android.net.Uri;
import android.os.ParcelFileDescriptor;
import android.util.Log;
import android.webkit.WebResourceResponse;
import com.android.browser.BrowserSettings;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.PipedInputStream;
import java.io.PipedOutputStream;
public class HomeProvider extends ContentProvider {
private static final String TAG = "HomeProvider";
public static final String AUTHORITY = "com.android.browser.home";
public static final String MOST_VISITED = "content://" + AUTHORITY + "/";
@Override
public int delete(Uri uri, String selection, String[] selectionArgs) {
return 0;
}
@Override
public String getType(Uri uri) {
return null;
}
@Override
public Uri insert(Uri uri, ContentValues values) {
return null;
}
@Override
public boolean onCreate() {
return false;
}
@Override
public Cursor query(Uri uri, String[] projection, String selection,
String[] selectionArgs, String sortOrder) {
return null;
}
@Override
public int update(Uri uri, ContentValues values, String selection,
String[] selectionArgs) {
return 0;
}
@Override
public ParcelFileDescriptor openFile(Uri uri, String mode) {
try {
ParcelFileDescriptor[] pipes = ParcelFileDescriptor.createPipe();
final ParcelFileDescriptor write = pipes[1];
AssetFileDescriptor afd = new AssetFileDescriptor(write, 0, -1);
new RequestHandler(getContext(), uri, afd.createOutputStream()).start();
return pipes[0];
} catch (IOException e) {
Log.e(TAG, "Failed to handle request: " + uri, e);
return null;
}
}
public static WebResourceResponse shouldInterceptRequest(Context context,
String url) {
try {
boolean useMostVisited = BrowserSettings.getInstance().useMostVisitedHomepage();
if (useMostVisited && url.startsWith("content://")) {
Uri uri = Uri.parse(url);
if (AUTHORITY.equals(uri.getAuthority())) {
InputStream ins = context.getContentResolver()
.openInputStream(uri);
return new WebResourceResponse("text/html", "utf-8", ins);
}
}
boolean listFiles = BrowserSettings.getInstance().isDebugEnabled();
if (listFiles && interceptFile(url)) {
PipedInputStream ins = new PipedInputStream();
PipedOutputStream outs = new PipedOutputStream(ins);
new RequestHandler(context, Uri.parse(url), outs).start();
return new WebResourceResponse("text/html", "utf-8", ins);
}
} catch (Exception e) {}
return null;
}
private static boolean interceptFile(String url) {
if (!url.startsWith("file:///")) {
return false;
}
String fpath = url.substring(7);
File f = new File(fpath);
if (!f.isDirectory()) {
return false;
}
return true;
}
}