package org.softeg.slartus.forpdaplus.classes; import android.annotation.TargetApi; import android.content.Context; import android.graphics.Point; import android.os.Build; import android.os.Bundle; import android.util.AttributeSet; import android.view.MotionEvent; import android.view.View; import android.webkit.WebSettings; import android.webkit.WebView; import org.softeg.slartus.forpdaplus.App; import org.softeg.slartus.forpdaplus.common.AppLog; import org.softeg.slartus.forpdaplus.prefs.Preferences; import java.util.Calendar; /** * User: slinkin * Date: 25.01.12 * Time: 10:00 */ public class AdvWebView extends WebView { private static final String TOPIC_BODY_KEY = "AdvWebView.TOPIC_BODY_KEY"; private int actionBarHeight = 56; public AdvWebView(Context context) { super(context); init(); } public AdvWebView(Context context, AttributeSet attributeSet) { super(context, attributeSet); init(); } private void init() { // gd = new GestureDetector(context, sogl); getSettings().setJavaScriptEnabled(true); getSettings().setJavaScriptCanOpenWindowsAutomatically(false); getSettings().setDomStorageEnabled(true); getSettings().setAllowFileAccess(true); getSettings().setCacheMode(WebSettings.LOAD_NO_CACHE); if (Build.VERSION.SDK_INT > 15) { getSettings().setAllowFileAccessFromFileURLs(true); //Maybe you don't need this rule getSettings().setAllowUniversalAccessFromFileURLs(true); } if (Build.VERSION.SDK_INT < 18) getSettings().setPluginState(WebSettings.PluginState.ON);// для воспроизведения видео if (Preferences.System.isShowWebViewScroll()) { setScrollBarStyle(View.SCROLLBARS_INSIDE_OVERLAY); setScrollbarFadingEnabled(true); } if(Preferences.System.getWebviewCompatMode()) this.setLayerType(LAYER_TYPE_SOFTWARE, null); /*if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { try { getSettings().setLayoutAlgorithm(WebSettings.LayoutAlgorithm.TEXT_AUTOSIZING); } catch (Throwable ignore) {} }*/ setBackgroundColor(App.getInstance().getThemeStyleWebViewBackground()); //loadData("<html><head></head></html>", "text/html", "UTF-8"); } private Point m_LastMotionEvent = null; public Point getLastMotionEvent() { return m_LastMotionEvent; } private OnScrollChangedCallback mOnScrollChangedCallback; public void setActionBarheight(int actionBarHeight) { this.actionBarHeight = Math.max(actionBarHeight, 72); } private int mRawY = 0; /** * @param l Current horizontal scroll origin * @param t Current vertical scroll origin. * @param oldl Previous horizontal scroll origin. * @param oldt Previous vertical scroll origin. */ @Override protected void onScrollChanged(final int l, final int t, final int oldl, final int oldt) { super.onScrollChanged(l, t, oldl, oldt); try { if (!m_ActionBarOnScrollEventsState) return; if (mOnScrollChangedCallback == null) return; int k = t - oldt; mRawY = Math.min(actionBarHeight, k + mRawY); mRawY = Math.max(-actionBarHeight, mRawY); mRawY = Math.min(getScrollY(), mRawY); if (mRawY == actionBarHeight) mOnScrollChangedCallback.onScrollDown(m_InTouch); else if (mRawY == -actionBarHeight || t <= actionBarHeight) mOnScrollChangedCallback.onScrollUp(m_InTouch); } catch (Throwable ex) { AppLog.e(getContext(), ex); } } public void setOnScrollChangedCallback(final OnScrollChangedCallback onScrollChangedCallback) { mOnScrollChangedCallback = onScrollChangedCallback; } private static final int MAX_CLICK_DURATION = 200; private static final int MAX_TOUCH__Y_DISTANCE = 30; private long startClickTime; private Boolean m_InTouch = false; private Point m_MotionDown = null; @Override public boolean onTouchEvent(android.view.MotionEvent event) { Boolean b = super.onTouchEvent(event); try { if (mOnScrollChangedCallback == null) return b; switch (event.getAction()) { case MotionEvent.ACTION_DOWN: { m_MotionDown = new Point((int) event.getX(), (int) event.getY()); m_InTouch = true; final WebView.HitTestResult hitTestResult = getHitTestResult(); if (hitTestResult == null) { startClickTime = Calendar.getInstance().getTimeInMillis(); } else switch (hitTestResult.getType()) { case WebView.HitTestResult.UNKNOWN_TYPE: case WebView.HitTestResult.EDIT_TEXT_TYPE: startClickTime = Calendar.getInstance().getTimeInMillis(); } break; } case MotionEvent.ACTION_UP: { m_InTouch = false; long clickDuration = Calendar.getInstance().getTimeInMillis() - startClickTime; if (clickDuration < MAX_CLICK_DURATION &&m_MotionDown!=null&& Math.abs(m_MotionDown.y - event.getY()) < MAX_TOUCH__Y_DISTANCE) { mOnScrollChangedCallback.onTouch(); } } } } catch (Throwable ex) { AppLog.e(getContext(), ex); }finally { m_LastMotionEvent = new Point((int) event.getX(), (int) event.getY()); } return b; } @Override public android.webkit.WebBackForwardList saveState(Bundle outState) { return super.saveState(outState); } @Override public android.webkit.WebBackForwardList restoreState(Bundle outState) { return super.restoreState(outState); } private Boolean m_ActionBarOnScrollEventsState = true; public void offActionBarOnScrollEvents() { m_ActionBarOnScrollEventsState = false; } public void onActionBarOnScrollEvents() { m_ActionBarOnScrollEventsState = true; } public void scrollTo(String fragment) { evalJs("scrollToElement('" + fragment + "');"); } /** * Impliment in the activity/fragment/view that you want to listen to the webview */ public static interface OnScrollChangedCallback { public void onScrollDown(Boolean inTouch); public void onScrollUp(Boolean inTouch); public void onTouch(); } @TargetApi(Build.VERSION_CODES.KITKAT) public void evalJs(String js) { try { if (Build.VERSION.SDK_INT >= 19 && Preferences.System.isEvaluateJavascriptEnabled()) { evaluateJavascript(js, null); } else { loadUrl("javascript:" + js); } } catch (IllegalStateException ex) { android.util.Log.e("AdvWebView", ex.toString()); Preferences.System.setEvaluateJavascriptEnabled(false); } catch (Throwable ex) { android.util.Log.e("AdvWebView", ex.toString()); } } }