/*
* Copyright 2011 - AndroidQuery.com (tinyeeliu@gmail.com)
*
* 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.external.androidquery.util;
import java.io.InputStream;
import android.content.Context;
import android.content.SharedPreferences;
import android.graphics.Picture;
import android.view.View;
import android.webkit.WebSettings;
import android.webkit.WebView;
import android.webkit.WebView.PictureListener;
import android.webkit.WebViewClient;
import com.external.androidquery.AQuery;
public class WebImage extends WebViewClient{
private Object progress;
private WebView wv;
private String url;
private boolean zoom;
private boolean control;
private int color;
private static String template;
private static String getSource(Context context){
if(template == null){
try{
InputStream is = context.getClassLoader().getResourceAsStream("com/androidquery/util/web_image.html");
template = new String(AQUtility.toBytes(is));
}catch(Exception e){
AQUtility.debug(e);
}
}
return template;
}
private static final String PREF_FILE = "WebViewSettings";
private static final String DOUBLE_TAP_TOAST_COUNT = "double_tap_toast_count";
private static void fixWebviewTip(Context context){
SharedPreferences prefs = context.getSharedPreferences(PREF_FILE, Context.MODE_PRIVATE);
if (prefs.getInt(DOUBLE_TAP_TOAST_COUNT, 1) > 0) {
prefs.edit().putInt(DOUBLE_TAP_TOAST_COUNT, 0).commit();
}
}
public WebImage(WebView wv, String url, Object progress, boolean zoom, boolean control, int color){
this.wv = wv;
this.url = url;
this.progress = progress;
this.zoom = zoom;
this.control = control;
this.color = color;
}
public void load(){
if(url.equals(wv.getTag(AQuery.TAG_URL))){
return;
}
wv.setTag(AQuery.TAG_URL, url);
if(android.os.Build.VERSION.SDK_INT <= 10){
wv.setDrawingCacheEnabled(true);
}
fixWebviewTip(wv.getContext());
WebSettings ws = wv.getSettings();
ws.setSupportZoom(zoom);
ws.setBuiltInZoomControls(zoom);
if(!control){
disableZoomControl(wv);
}
ws.setJavaScriptEnabled(true);
wv.setBackgroundColor(color);
if(progress != null){
//progress.setVisibility(View.VISIBLE);
Common.showProgress(progress, url, true);
}
if(wv.getWidth() > 0){
setup();
}else{
delaySetup();
}
}
private void delaySetup(){
wv.setPictureListener(new PictureListener() {
@Override
public void onNewPicture(WebView view, Picture picture) {
wv.setPictureListener(null);
setup();
}
});
//wv.setInitialScale(100);
wv.loadData("<html></html>", "text/html", "utf-8");
wv.setBackgroundColor(color);
}
private void setup(){
String source = getSource(wv.getContext());
String html = source.replace("@src", url).replace("@color", Integer.toHexString(color));
wv.setWebViewClient(this);
//wv.setInitialScale(100);
wv.loadDataWithBaseURL(null, html, "text/html", "utf-8", null);
wv.setBackgroundColor(color);
}
private void done(WebView view){
if(progress != null){
//progress.setVisibility(View.GONE);
view.setVisibility(View.VISIBLE);
Common.showProgress(progress, url, false);
}
view.setWebViewClient(null);
}
@Override
public void onPageFinished(WebView view, String url) {
done(view);
}
@Override
public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) {
done(view);
}
@Override
public void onScaleChanged(WebView view, float oldScale, float newScale) {
//AQUtility.debug("onScaleChanged", oldScale + ":" + newScale);
}
private static void disableZoomControl(WebView wv){
if(android.os.Build.VERSION.SDK_INT < 11) return;
WebSettings ws = wv.getSettings();
AQUtility.invokeHandler(ws, "setDisplayZoomControls", false, false, new Class[]{boolean.class}, false);
}
/*
public static void webImage(WebView wv, String url, final View progress){
if(url.equals(wv.getTag(AQuery.TAG_URL))){
return;
}
wv.setTag(AQuery.TAG_URL, url);
fixWebviewTip(wv.getContext());
wv.loadData("<html></html>", "text/html", "utf-8");
wv.setBackgroundColor(Color.parseColor("#000000"));
//state, "init", "fetch"
wv.setTag(AQuery.TAG_LAYOUT, "init");
wv.setPictureListener(new PictureListener() {
@Override
public void onNewPicture(WebView view, Picture picture) {
String url = (String) view.getTag(AQuery.TAG_URL);
String state = (String) view.getTag(AQuery.TAG_LAYOUT);
AQUtility.debug("pic fin", view.getTag(AQuery.TAG_LAYOUT));
AQUtility.debug("width", view.getWidth());
//int width = view.getWidth();
if("init".equals(state)){
view.setTag(AQuery.TAG_LAYOUT, "fetch");
//lastWidth = width;
setupWebview(view, url);
}else if("fetch".equals(state)){
view.setVisibility(View.VISIBLE);
view.setPictureListener(null);
}
}
});
if(progress != null){
progress.setVisibility(View.VISIBLE);
}
wv.setWebViewClient(new WebViewClient(){
@Override
public void onPageFinished(WebView view, String url) {
AQUtility.debug("fin", view.getTag(AQuery.TAG_LAYOUT));
if(("fetch".equals(view.getTag(AQuery.TAG_LAYOUT)))){
if(progress != null){
progress.setVisibility(View.GONE);
}
view.setWebViewClient(null);
}
}
@Override
public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) {
if(progress != null){
progress.setVisibility(View.GONE);
}
}
});
}
private static boolean setupWebview(WebView wv, String url){
int width = wv.getWidth();
int height = wv.getHeight();
wv.setInitialScale(100);
if(width <= 0 || height <= 0 || url == null) return false;
AQUtility.debug("webview", width + "x" + height);
View parent = (View) wv.getParent();
AQUtility.debug("parent", parent.getWidth() + "x" + parent.getHeight());
String html = getSource(wv.getContext());
html = html.replaceAll("@width", width + "").replaceAll("@height", height + "").replaceAll("@src", url);
String dim;
boolean landscape = width >= height;
if(!landscape){
dim = "width:" + width + "px;";
}else{
dim = "height:" + height + "px;";
}
html = html.replaceAll("@dim", dim).replaceAll("@scape", landscape + "");
//AQUtility.debug(html);
WebSettings ws = wv.getSettings();
ws.setSupportZoom(true);
ws.setBuiltInZoomControls(true);
//ws.setDisplayZoomControls(false);
ws.setJavaScriptEnabled(true);
wv.loadDataWithBaseURL(null, html, "text/html", "utf-8", null);
wv.setBackgroundColor(Color.parseColor("#000000"));
return true;
}
*/
}