| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166 |
- /*******************************************************************************
- * 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.handmark.pulltorefresh.library;
- 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 android.webkit.WebChromeClient;
- import android.webkit.WebView;
- public class PullToRefreshWebView extends PullToRefreshBase<WebView> {
- private static final OnRefreshListener<WebView> defaultOnRefreshListener = new OnRefreshListener<WebView>() {
- @Override
- public void onRefresh(PullToRefreshBase<WebView> refreshView) {
- refreshView.getRefreshableView().reload();
- }
- };
- private final WebChromeClient defaultWebChromeClient = new WebChromeClient() {
- @Override
- public void onProgressChanged(WebView view, int newProgress) {
- if (newProgress == 100) {
- onRefreshComplete();
- }
- }
- };
- public PullToRefreshWebView(Context context) {
- super(context);
- /**
- * Added so that by default, Pull-to-Refresh refreshes the page
- */
- setOnRefreshListener(defaultOnRefreshListener);
- mRefreshableView.setWebChromeClient(defaultWebChromeClient);
- }
- public PullToRefreshWebView(Context context, AttributeSet attrs) {
- super(context, attrs);
- /**
- * Added so that by default, Pull-to-Refresh refreshes the page
- */
- setOnRefreshListener(defaultOnRefreshListener);
- mRefreshableView.setWebChromeClient(defaultWebChromeClient);
- }
- public PullToRefreshWebView(Context context, Mode mode) {
- super(context, mode);
- /**
- * Added so that by default, Pull-to-Refresh refreshes the page
- */
- setOnRefreshListener(defaultOnRefreshListener);
- mRefreshableView.setWebChromeClient(defaultWebChromeClient);
- }
- public PullToRefreshWebView(Context context, Mode mode, AnimationStyle style) {
- super(context, mode, style);
- /**
- * Added so that by default, Pull-to-Refresh refreshes the page
- */
- setOnRefreshListener(defaultOnRefreshListener);
- mRefreshableView.setWebChromeClient(defaultWebChromeClient);
- }
- @Override
- public final Orientation getPullToRefreshScrollDirection() {
- return Orientation.VERTICAL;
- }
- @Override
- protected WebView createRefreshableView(Context context, AttributeSet attrs) {
- WebView webView;
- if (VERSION.SDK_INT >= VERSION_CODES.GINGERBREAD) {
- webView = new InternalWebViewSDK9(context, attrs);
- } else {
- webView = new WebView(context, attrs);
- }
- webView.setId(R.id.webview);
- return webView;
- }
- @Override
- protected boolean isReadyForPullStart() {
- return mRefreshableView.getScrollY() == 0;
- }
- @SuppressWarnings("deprecation")
- @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 WebView {
- // 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;
- }
- @SuppressWarnings("deprecation")
- private int getScrollRange() {
- return (int) Math.max(0, Math.floor(mRefreshableView.getContentHeight() * mRefreshableView.getScale())
- - (getHeight() - getPaddingBottom() - getPaddingTop()));
- }
- }
- }
|