/******************************************************************************* * Copyright 2011, 2012 Chris Banes. * * 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.videogo.widget.pulltorefresh; import android.annotation.TargetApi; import android.content.Context; import android.os.Build.VERSION; import android.os.Build.VERSION_CODES; import android.os.Bundle; import android.util.AttributeSet; import com.videogo.widget.WebViewEx; public class PullToRefreshWebView extends PullToRefreshBase { public PullToRefreshWebView(Context context) { super(context); } public PullToRefreshWebView(Context context, AttributeSet attrs) { super(context, attrs); } public PullToRefreshWebView(Context context, Mode mode) { super(context, mode); } @Override public final Orientation getPullToRefreshScrollDirection() { return Orientation.VERTICAL; } @Override protected WebViewEx createRefreshableView(Context context, AttributeSet attrs) { WebViewEx webView; if (VERSION.SDK_INT >= VERSION_CODES.GINGERBREAD) { webView = new InternalWebViewSDK9(context, attrs); } else { webView = new WebViewEx(context, attrs); } return webView; } @Override protected boolean isReadyForPullStart() { return mRefreshableView.getScrollY() == 0; } @Override protected boolean isReadyForPullEnd() { float exactContentHeight = (float)Math.floor(mRefreshableView.getContentHeight() * mRefreshableView.getScale()); return mRefreshableView.getScrollY() >= (exactContentHeight - mRefreshableView.getHeight()); } @Override protected void onPtrRestoreInstanceState(Bundle savedInstanceState) { super.onPtrRestoreInstanceState(savedInstanceState); mRefreshableView.restoreState(savedInstanceState); } @Override protected void onPtrSaveInstanceState(Bundle saveState) { super.onPtrSaveInstanceState(saveState); mRefreshableView.saveState(saveState); } @TargetApi(9) final class InternalWebViewSDK9 extends WebViewEx { // WebView doesn't always scroll back to it's edge so we add some // fuzziness static final int OVERSCROLL_FUZZY_THRESHOLD = 2; // WebView seems quite reluctant to overscroll so we use the scale // factor to scale it's value static final float OVERSCROLL_SCALE_FACTOR = 1.5f; public InternalWebViewSDK9(Context context, AttributeSet attrs) { super(context, attrs); } @Override protected boolean overScrollBy(int deltaX, int deltaY, int scrollX, int scrollY, int scrollRangeX, int scrollRangeY, int maxOverScrollX, int maxOverScrollY, boolean isTouchEvent) { final boolean returnValue = super.overScrollBy(deltaX, deltaY, scrollX, scrollY, scrollRangeX, scrollRangeY, maxOverScrollX, maxOverScrollY, isTouchEvent); // Does all of the hard work... OverscrollHelper.overScrollBy(PullToRefreshWebView.this, deltaX, scrollX, deltaY, scrollY, getScrollRange(), OVERSCROLL_FUZZY_THRESHOLD, OVERSCROLL_SCALE_FACTOR, isTouchEvent); return returnValue; } private int getScrollRange() { return (int) Math.max(0, Math.floor(mRefreshableView.getContentHeight() * mRefreshableView.getScale()) - (getHeight() - getPaddingBottom() - getPaddingTop())); } } }