From dd949f147543bf8fd66dd259437669c8ff6cd007 Mon Sep 17 00:00:00 2001 From: Chris Banes Date: Mon, 22 Oct 2012 13:10:03 +0100 Subject: [PATCH 001/120] [maven-release-plugin] prepare for next development iteration --- extras/PullToRefreshListFragment/pom.xml | 2 +- extras/pom.xml | 2 +- library/pom.xml | 2 +- pom.xml | 4 ++-- sample/pom.xml | 2 +- 5 files changed, 6 insertions(+), 6 deletions(-) diff --git a/extras/PullToRefreshListFragment/pom.xml b/extras/PullToRefreshListFragment/pom.xml index 34a9da93d..cec7434ff 100644 --- a/extras/PullToRefreshListFragment/pom.xml +++ b/extras/PullToRefreshListFragment/pom.xml @@ -10,7 +10,7 @@ com.github.chrisbanes.pulltorefresh extras - 1.4.2 + 1.4.3-SNAPSHOT diff --git a/extras/pom.xml b/extras/pom.xml index 483b3038f..277693fc9 100644 --- a/extras/pom.xml +++ b/extras/pom.xml @@ -10,7 +10,7 @@ com.github.chrisbanes.pulltorefresh parent - 1.4.2 + 1.4.3-SNAPSHOT diff --git a/library/pom.xml b/library/pom.xml index d2a628beb..69e1e875d 100644 --- a/library/pom.xml +++ b/library/pom.xml @@ -10,7 +10,7 @@ com.github.chrisbanes.pulltorefresh parent - 1.4.2 + 1.4.3-SNAPSHOT diff --git a/pom.xml b/pom.xml index 038b41cb4..c99873d06 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ com.github.chrisbanes.pulltorefresh parent pom - 1.4.2 + 1.4.3-SNAPSHOT Android-PullToRefresh Project Implementation of the Pull-to-Refresh UI Pattern for Android. https://github.com/chrisbanes/Android-PullToRefresh @@ -24,7 +24,7 @@ https://github.com/chrisbanes/Android-PullToRefresh scm:git:git://github.com/chrisbanes/Android-PullToRefresh.git scm:git:git@github.com:chrisbanes/Android-PullToRefresh.git - v1.4.2 + HEAD diff --git a/sample/pom.xml b/sample/pom.xml index 80b0ebcb9..83826524d 100644 --- a/sample/pom.xml +++ b/sample/pom.xml @@ -10,7 +10,7 @@ com.github.chrisbanes.pulltorefresh parent - 1.4.2 + 1.4.3-SNAPSHOT From c631843fce38449934369dae0d3f6115cf1ea219 Mon Sep 17 00:00:00 2001 From: Chris Banes Date: Tue, 23 Oct 2012 13:28:34 +0100 Subject: [PATCH 002/120] Fix #142 (Hopefully) --- .../library/PullToRefreshListView.java | 49 +++++++++---------- 1 file changed, 22 insertions(+), 27 deletions(-) diff --git a/library/src/com/handmark/pulltorefresh/library/PullToRefreshListView.java b/library/src/com/handmark/pulltorefresh/library/PullToRefreshListView.java index 7c2a0e5f8..bf21c5023 100644 --- a/library/src/com/handmark/pulltorefresh/library/PullToRefreshListView.java +++ b/library/src/com/handmark/pulltorefresh/library/PullToRefreshListView.java @@ -172,19 +172,9 @@ void onRefreshing(final boolean doScroll) { @Override void onReset() { - - // If we're not showing the Refreshing view, or the list is empty, then - // the header/footer views won't show so we use the - // normal method - ListAdapter adapter = mRefreshableView.getAdapter(); - if (!getShowViewWhileRefreshing() || null == adapter || adapter.isEmpty()) { - super.onReset(); - return; - } - - LoadingLayout originalLoadingLayout, listViewLoadingLayout; - int scrollToHeight, selection; - boolean scrollLvToEdge; + final LoadingLayout originalLoadingLayout, listViewLoadingLayout; + final int scrollToHeight, selection; + final boolean scrollLvToEdge; switch (getCurrentMode()) { case PULL_UP_TO_REFRESH: @@ -204,23 +194,28 @@ void onReset() { break; } - // Set our Original View to Visible - originalLoadingLayout.setVisibility(View.VISIBLE); + // If the ListView header loading layout is showing, then we need to + // flip so that the original one is showing instead + if (listViewLoadingLayout.getVisibility() == View.VISIBLE) { - /** - * Scroll so the View is at the same Y as the ListView header/footer, - * but only scroll if: we've pulled to refresh, it's positioned - * correctly, and we're currently showing the ListViewLoadingLayout - */ - if (scrollLvToEdge && getState() != State.MANUAL_REFRESHING - && listViewLoadingLayout.getVisibility() == View.VISIBLE) { - mRefreshableView.setSelection(selection); - setHeaderScroll(scrollToHeight); - } + // Set our Original View to Visible + originalLoadingLayout.setVisibility(View.VISIBLE); + + // Hide the ListView Header/Footer + listViewLoadingLayout.setVisibility(View.GONE); - // Hide the ListView Header/Footer - listViewLoadingLayout.setVisibility(View.GONE); + /** + * Scroll so the View is at the same Y as the ListView + * header/footer, but only scroll if: we've pulled to refresh, it's + * positioned correctly + */ + if (scrollLvToEdge && getState() != State.MANUAL_REFRESHING) { + mRefreshableView.setSelection(selection); + setHeaderScroll(scrollToHeight); + } + } + // Finally, call up to super super.onReset(); } From 728ff1af72e36dd22543cfd52ba063b5722ae6a5 Mon Sep 17 00:00:00 2001 From: Chris Banes Date: Fri, 26 Oct 2012 15:25:19 +0100 Subject: [PATCH 003/120] Fix #143. Caused by Samsung's crapped over scroll bouncing ListView implementation --- .../library/PullToRefreshListView.java | 24 +++++++++++++++---- 1 file changed, 20 insertions(+), 4 deletions(-) diff --git a/library/src/com/handmark/pulltorefresh/library/PullToRefreshListView.java b/library/src/com/handmark/pulltorefresh/library/PullToRefreshListView.java index bf21c5023..d44eefd28 100644 --- a/library/src/com/handmark/pulltorefresh/library/PullToRefreshListView.java +++ b/library/src/com/handmark/pulltorefresh/library/PullToRefreshListView.java @@ -24,6 +24,7 @@ import android.os.Build.VERSION_CODES; import android.util.AttributeSet; import android.view.ContextMenu.ContextMenuInfo; +import android.view.MotionEvent; import android.view.View; import android.widget.FrameLayout; import android.widget.ListAdapter; @@ -286,19 +287,34 @@ public InternalListView(Context context, AttributeSet attrs) { } @Override - public void draw(Canvas canvas) { + protected void dispatchDraw(Canvas canvas) { /** - * This is a bit hacky, but ListView has got a bug in it when using + * This is a bit hacky, but Samsung's ListView has got a bug in it when using * Header/Footer Views and the list is empty. This masks the issue * so that it doesn't cause an FC. See Issue #66. */ try { - super.draw(canvas); - } catch (Exception e) { + super.dispatchDraw(canvas); + } catch (IndexOutOfBoundsException e) { e.printStackTrace(); } } + @Override + public boolean dispatchTouchEvent(MotionEvent ev) { + /** + * This is a bit hacky, but Samsung's ListView has got a bug in it when using + * Header/Footer Views and the list is empty. This masks the issue + * so that it doesn't cause an FC. See Issue #66. + */ + try { + return super.dispatchTouchEvent(ev); + } catch (IndexOutOfBoundsException e) { + e.printStackTrace(); + return false; + } + } + public ContextMenuInfo getContextMenuInfo() { return super.getContextMenuInfo(); } From c937e03e6d44a73b5d750429f69edafe0f86bc8f Mon Sep 17 00:00:00 2001 From: Chris Banes Date: Wed, 31 Oct 2012 12:14:09 +0000 Subject: [PATCH 004/120] Use Hardware Acceleration on sample app. Rookie mistake number 1! --- sample/AndroidManifest.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/sample/AndroidManifest.xml b/sample/AndroidManifest.xml index 3eee0edee..c4a2864ee 100755 --- a/sample/AndroidManifest.xml +++ b/sample/AndroidManifest.xml @@ -9,6 +9,7 @@ android:targetSdkVersion="10" /> From 94e97b348cd1b6b09d354011ed35a83c30f5b6f4 Mon Sep 17 00:00:00 2001 From: Chris Banes Date: Thu, 1 Nov 2012 10:31:12 +0000 Subject: [PATCH 005/120] Fix #138. Better Tablet layout support. The headers are now pinned with a max width of 320dp, centred horizontally. --- library/res/values/dimens.xml | 1 + .../library/PullToRefreshBase.java | 2 ++ .../library/PullToRefreshListView.java | 34 ++++++++++++------- .../library/internal/LoadingLayout.java | 20 +++++++++++ 4 files changed, 45 insertions(+), 12 deletions(-) diff --git a/library/res/values/dimens.xml b/library/res/values/dimens.xml index 92031cac7..a24f4c887 100644 --- a/library/res/values/dimens.xml +++ b/library/res/values/dimens.xml @@ -7,5 +7,6 @@ 25dp 10dp 20dp + 320dp \ No newline at end of file diff --git a/library/src/com/handmark/pulltorefresh/library/PullToRefreshBase.java b/library/src/com/handmark/pulltorefresh/library/PullToRefreshBase.java index cb2fb897b..c191f7fb0 100644 --- a/library/src/com/handmark/pulltorefresh/library/PullToRefreshBase.java +++ b/library/src/com/handmark/pulltorefresh/library/PullToRefreshBase.java @@ -24,6 +24,7 @@ import android.os.Parcelable; import android.util.AttributeSet; import android.util.Log; +import android.view.Gravity; import android.view.MotionEvent; import android.view.View; import android.view.ViewConfiguration; @@ -818,6 +819,7 @@ private void addRefreshableView(Context context, T refreshableView) { @SuppressWarnings("deprecation") private void init(Context context, AttributeSet attrs) { setOrientation(LinearLayout.VERTICAL); + setGravity(Gravity.CENTER_HORIZONTAL); ViewConfiguration config = ViewConfiguration.get(context); mTouchSlop = config.getScaledTouchSlop(); diff --git a/library/src/com/handmark/pulltorefresh/library/PullToRefreshListView.java b/library/src/com/handmark/pulltorefresh/library/PullToRefreshListView.java index d44eefd28..a9a09d02b 100644 --- a/library/src/com/handmark/pulltorefresh/library/PullToRefreshListView.java +++ b/library/src/com/handmark/pulltorefresh/library/PullToRefreshListView.java @@ -24,8 +24,10 @@ import android.os.Build.VERSION_CODES; import android.util.AttributeSet; import android.view.ContextMenu.ContextMenuInfo; +import android.view.Gravity; import android.view.MotionEvent; import android.view.View; +import android.view.ViewGroup; import android.widget.FrameLayout; import android.widget.ListAdapter; import android.widget.ListView; @@ -153,7 +155,13 @@ void onRefreshing(final boolean doScroll) { // Hide our original Loading View originalLoadingLayout.setVisibility(View.INVISIBLE); - // Show the ListView Loading View and set it to refresh + // Show the ListView Loading View and set it to refresh. If it has a 0 + // height, then we need to set it to WRAP_CONTENT + if (listViewLoadingLayout.getHeight() == 0) { + ViewGroup.LayoutParams lp = listViewLoadingLayout.getLayoutParams(); + lp.height = ViewGroup.LayoutParams.WRAP_CONTENT; + listViewLoadingLayout.setLayoutParams(lp); + } listViewLoadingLayout.setVisibility(View.VISIBLE); listViewLoadingLayout.refreshing(); @@ -237,18 +245,20 @@ protected final ListView createRefreshableView(Context context, AttributeSet att // Get Styles from attrs TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.PullToRefresh); + // We use a 0 height (instead of View.GONE) for now so that it's still + // layed out + final FrameLayout.LayoutParams lp = new FrameLayout.LayoutParams(FrameLayout.LayoutParams.MATCH_PARENT, 0, + Gravity.CENTER_HORIZONTAL); + // Create Loading Views ready for use later FrameLayout frame = new FrameLayout(context); mHeaderLoadingView = createLoadingLayout(context, Mode.PULL_DOWN_TO_REFRESH, a); - frame.addView(mHeaderLoadingView, FrameLayout.LayoutParams.MATCH_PARENT, FrameLayout.LayoutParams.WRAP_CONTENT); - mHeaderLoadingView.setVisibility(View.GONE); + frame.addView(mHeaderLoadingView, lp); lv.addHeaderView(frame, null, false); mLvFooterLoadingFrame = new FrameLayout(context); mFooterLoadingView = createLoadingLayout(context, Mode.PULL_UP_TO_REFRESH, a); - mLvFooterLoadingFrame.addView(mFooterLoadingView, FrameLayout.LayoutParams.MATCH_PARENT, - FrameLayout.LayoutParams.WRAP_CONTENT); - mFooterLoadingView.setVisibility(View.GONE); + mLvFooterLoadingFrame.addView(mFooterLoadingView, lp); a.recycle(); @@ -289,9 +299,9 @@ public InternalListView(Context context, AttributeSet attrs) { @Override protected void dispatchDraw(Canvas canvas) { /** - * This is a bit hacky, but Samsung's ListView has got a bug in it when using - * Header/Footer Views and the list is empty. This masks the issue - * so that it doesn't cause an FC. See Issue #66. + * This is a bit hacky, but Samsung's ListView has got a bug in it + * when using Header/Footer Views and the list is empty. This masks + * the issue so that it doesn't cause an FC. See Issue #66. */ try { super.dispatchDraw(canvas); @@ -303,9 +313,9 @@ protected void dispatchDraw(Canvas canvas) { @Override public boolean dispatchTouchEvent(MotionEvent ev) { /** - * This is a bit hacky, but Samsung's ListView has got a bug in it when using - * Header/Footer Views and the list is empty. This masks the issue - * so that it doesn't cause an FC. See Issue #66. + * This is a bit hacky, but Samsung's ListView has got a bug in it + * when using Header/Footer Views and the list is empty. This masks + * the issue so that it doesn't cause an FC. See Issue #66. */ try { return super.dispatchTouchEvent(ev); diff --git a/library/src/com/handmark/pulltorefresh/library/internal/LoadingLayout.java b/library/src/com/handmark/pulltorefresh/library/internal/LoadingLayout.java index 8888a8a54..b371fcc28 100644 --- a/library/src/com/handmark/pulltorefresh/library/internal/LoadingLayout.java +++ b/library/src/com/handmark/pulltorefresh/library/internal/LoadingLayout.java @@ -15,6 +15,7 @@ *******************************************************************************/ package com.handmark.pulltorefresh.library.internal; +import android.annotation.SuppressLint; import android.content.Context; import android.content.res.ColorStateList; import android.content.res.TypedArray; @@ -26,6 +27,7 @@ import android.view.Gravity; import android.view.LayoutInflater; import android.view.View; +import android.view.ViewGroup; import android.view.animation.Interpolator; import android.view.animation.LinearInterpolator; import android.widget.ImageView; @@ -36,6 +38,7 @@ import com.handmark.pulltorefresh.library.PullToRefreshBase.Mode; import com.handmark.pulltorefresh.library.R; +@SuppressLint("ViewConstructor") public abstract class LoadingLayout extends LinearLayout { static final Interpolator ANIMATION_INTERPOLATOR = new LinearInterpolator(); @@ -52,6 +55,9 @@ public abstract class LoadingLayout extends LinearLayout { private CharSequence mRefreshingLabel; private CharSequence mReleaseLabel; + // Max Width that this can be + private int mMaxWidth; + public LoadingLayout(Context context, final Mode mode, TypedArray attrs) { super(context); @@ -61,6 +67,8 @@ public LoadingLayout(Context context, final Mode mode, TypedArray attrs) { final int lrPadding = getResources().getDimensionPixelSize(R.dimen.header_footer_left_right_padding); setPadding(lrPadding, tbPadding, lrPadding, tbPadding); + mMaxWidth = getResources().getDimensionPixelSize(R.dimen.header_footer_max_width); + LayoutInflater.from(context).inflate(R.layout.pull_to_refresh_header, this); mHeaderText = (TextView) findViewById(R.id.pull_to_refresh_text); mHeaderProgress = (ProgressBar) findViewById(R.id.pull_to_refresh_progress); @@ -190,6 +198,18 @@ public final void reset() { } } + @Override + protected void onSizeChanged(final int w, int h, int oldw, int oldh) { + super.onSizeChanged(w, h, oldw, oldh); + + // If we're bigger than the Max Width, resize us + if (w > mMaxWidth) { + ViewGroup.LayoutParams lp = getLayoutParams(); + lp.width = mMaxWidth; + setLayoutParams(lp); + } + } + public final void setLoadingDrawable(Drawable imageDrawable) { // Set Drawable mHeaderImage.setImageDrawable(imageDrawable); From c152b4351caae6cab4e7ef468d15452c2767407f Mon Sep 17 00:00:00 2001 From: Chris Banes Date: Thu, 15 Nov 2012 10:01:53 +0000 Subject: [PATCH 006/120] =?UTF-8?q?Remove=20the=20final=20modifier=20on=20?= =?UTF-8?q?createRefreshableView(=E2=80=A6)=20in=20the=20ListView=20classe?= =?UTF-8?q?s?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../pulltorefresh/library/PullToRefreshExpandableListView.java | 2 +- .../handmark/pulltorefresh/library/PullToRefreshListView.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/library/src/com/handmark/pulltorefresh/library/PullToRefreshExpandableListView.java b/library/src/com/handmark/pulltorefresh/library/PullToRefreshExpandableListView.java index ed42c0fe1..1c13a471a 100644 --- a/library/src/com/handmark/pulltorefresh/library/PullToRefreshExpandableListView.java +++ b/library/src/com/handmark/pulltorefresh/library/PullToRefreshExpandableListView.java @@ -46,7 +46,7 @@ public ContextMenuInfo getContextMenuInfo() { } @Override - protected final ExpandableListView createRefreshableView(Context context, AttributeSet attrs) { + protected ExpandableListView createRefreshableView(Context context, AttributeSet attrs) { final ExpandableListView lv; if (VERSION.SDK_INT >= VERSION_CODES.GINGERBREAD) { lv = new InternalExpandableListViewSDK9(context, attrs); diff --git a/library/src/com/handmark/pulltorefresh/library/PullToRefreshListView.java b/library/src/com/handmark/pulltorefresh/library/PullToRefreshListView.java index a9a09d02b..ea2e37e3d 100644 --- a/library/src/com/handmark/pulltorefresh/library/PullToRefreshListView.java +++ b/library/src/com/handmark/pulltorefresh/library/PullToRefreshListView.java @@ -239,7 +239,7 @@ protected ListView createListView(Context context, AttributeSet attrs) { } @Override - protected final ListView createRefreshableView(Context context, AttributeSet attrs) { + protected ListView createRefreshableView(Context context, AttributeSet attrs) { ListView lv = createListView(context, attrs); // Get Styles from attrs From d127e1b3b5d4e7b334fcf2b50ded3bde21edebe1 Mon Sep 17 00:00:00 2001 From: Chris Banes Date: Thu, 15 Nov 2012 11:30:30 +0000 Subject: [PATCH 007/120] Fix Issue #150 --- pom.xml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/pom.xml b/pom.xml index c99873d06..f222bee0d 100644 --- a/pom.xml +++ b/pom.xml @@ -65,6 +65,10 @@ org.apache.maven.plugins maven-compiler-plugin 2.3.2 + + @{java.version} + @{java.version} + org.apache.maven.plugins From a0af0fae25b8078f85ac5e9d0d3f063abb0ba97c Mon Sep 17 00:00:00 2001 From: Chris Banes Date: Thu, 15 Nov 2012 11:37:22 +0000 Subject: [PATCH 008/120] Fix #149 --- library/res/layout/pull_to_refresh_header.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/library/res/layout/pull_to_refresh_header.xml b/library/res/layout/pull_to_refresh_header.xml index efc0d4a02..7ab947774 100644 --- a/library/res/layout/pull_to_refresh_header.xml +++ b/library/res/layout/pull_to_refresh_header.xml @@ -29,7 +29,7 @@ Date: Mon, 19 Nov 2012 12:35:57 +0000 Subject: [PATCH 009/120] Code Tidy-ups. Rename some methods to make them more clear. --- .../library/OverscrollHelper.java | 4 +- .../library/PullToRefreshAdapterViewBase.java | 8 +- .../library/PullToRefreshBase.java | 100 +++++++++--------- .../library/PullToRefreshListView.java | 16 +-- 4 files changed, 65 insertions(+), 63 deletions(-) diff --git a/library/src/com/handmark/pulltorefresh/library/OverscrollHelper.java b/library/src/com/handmark/pulltorefresh/library/OverscrollHelper.java index 1c3d569a8..c3fd1bf84 100644 --- a/library/src/com/handmark/pulltorefresh/library/OverscrollHelper.java +++ b/library/src/com/handmark/pulltorefresh/library/OverscrollHelper.java @@ -119,13 +119,13 @@ static void overScrollBy(final PullToRefreshBase view, final int deltaY, fina if (newY < (0 - fuzzyThreshold)) { // Check the mode supports the overscroll direction, and // then move scroll - if (mode.canPullDown()) { + if (mode.showHeaderLoadingLayout()) { view.setHeaderScroll((int) (scaleFactor * (view.getScrollY() + newY))); } } else if (newY > (scrollRange + fuzzyThreshold)) { // Check the mode supports the overscroll direction, and // then move scroll - if (mode.canPullUp()) { + if (mode.showFooterLoadingLayout()) { view.setHeaderScroll((int) (scaleFactor * (view.getScrollY() + newY - scrollRange))); } } else if (Math.abs(newY) <= fuzzyThreshold || Math.abs(newY - scrollRange) <= fuzzyThreshold) { diff --git a/library/src/com/handmark/pulltorefresh/library/PullToRefreshAdapterViewBase.java b/library/src/com/handmark/pulltorefresh/library/PullToRefreshAdapterViewBase.java index 6797797d3..9542adaa7 100644 --- a/library/src/com/handmark/pulltorefresh/library/PullToRefreshAdapterViewBase.java +++ b/library/src/com/handmark/pulltorefresh/library/PullToRefreshAdapterViewBase.java @@ -313,7 +313,7 @@ private void addIndicatorViews() { Mode mode = getMode(); FrameLayout refreshableViewWrapper = getRefreshableViewWrapper(); - if (mode.canPullDown() && null == mIndicatorIvTop) { + if (mode.showHeaderLoadingLayout() && null == mIndicatorIvTop) { // If the mode can pull down, and we don't have one set already mIndicatorIvTop = new IndicatorLayout(getContext(), Mode.PULL_DOWN_TO_REFRESH); FrameLayout.LayoutParams params = new FrameLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, @@ -322,13 +322,13 @@ private void addIndicatorViews() { params.gravity = Gravity.TOP | Gravity.RIGHT; refreshableViewWrapper.addView(mIndicatorIvTop, params); - } else if (!mode.canPullDown() && null != mIndicatorIvTop) { + } else if (!mode.showHeaderLoadingLayout() && null != mIndicatorIvTop) { // If we can't pull down, but have a View then remove it refreshableViewWrapper.removeView(mIndicatorIvTop); mIndicatorIvTop = null; } - if (mode.canPullUp() && null == mIndicatorIvBottom) { + if (mode.showFooterLoadingLayout() && null == mIndicatorIvBottom) { // If the mode can pull down, and we don't have one set already mIndicatorIvBottom = new IndicatorLayout(getContext(), Mode.PULL_UP_TO_REFRESH); FrameLayout.LayoutParams params = new FrameLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, @@ -337,7 +337,7 @@ private void addIndicatorViews() { params.gravity = Gravity.BOTTOM | Gravity.RIGHT; refreshableViewWrapper.addView(mIndicatorIvBottom, params); - } else if (!mode.canPullUp() && null != mIndicatorIvBottom) { + } else if (!mode.showFooterLoadingLayout() && null != mIndicatorIvBottom) { // If we can't pull down, but have a View then remove it refreshableViewWrapper.removeView(mIndicatorIvBottom); mIndicatorIvBottom = null; diff --git a/library/src/com/handmark/pulltorefresh/library/PullToRefreshBase.java b/library/src/com/handmark/pulltorefresh/library/PullToRefreshBase.java index c191f7fb0..ffb504760 100644 --- a/library/src/com/handmark/pulltorefresh/library/PullToRefreshBase.java +++ b/library/src/com/handmark/pulltorefresh/library/PullToRefreshBase.java @@ -54,8 +54,6 @@ public abstract class PullToRefreshBase extends LinearLayout imp public static final int SMOOTH_SCROLL_DURATION_MS = 200; public static final int SMOOTH_SCROLL_LONG_DURATION_MS = 325; - static final Mode DEFAULT_MODE = Mode.PULL_DOWN_TO_REFRESH; - static final String STATE_STATE = "ptr_state"; static final String STATE_MODE = "ptr_mode"; static final String STATE_CURRENT_MODE = "ptr_current_mode"; @@ -74,7 +72,7 @@ public abstract class PullToRefreshBase extends LinearLayout imp private boolean mIsBeingDragged = false; private State mState = State.RESET; - private Mode mMode = DEFAULT_MODE; + private Mode mMode = Mode.getDefaultMode(); private Mode mCurrentMode; T mRefreshableView; @@ -226,13 +224,13 @@ public final boolean onInterceptTouchEvent(MotionEvent event) { final float xDiff = Math.abs(event.getX() - mLastMotionX); if (yDiff > mTouchSlop && (!mFilterTouchEvents || yDiff > xDiff)) { - if (mMode.canPullDown() && dy >= 1f && isReadyForPullDown()) { + if (mMode.showHeaderLoadingLayout() && dy >= 1f && isReadyForPullDown()) { mLastMotionY = y; mIsBeingDragged = true; if (mMode == Mode.BOTH) { mCurrentMode = Mode.PULL_DOWN_TO_REFRESH; } - } else if (mMode.canPullUp() && dy <= -1f && isReadyForPullUp()) { + } else if (mMode.showFooterLoadingLayout() && dy <= -1f && isReadyForPullUp()) { mLastMotionY = y; mIsBeingDragged = true; if (mMode == Mode.BOTH) { @@ -363,10 +361,10 @@ public void setLoadingDrawable(Drawable drawable) { @Override public void setLoadingDrawable(Drawable drawable, Mode mode) { - if (null != mHeaderLayout && mode.canPullDown()) { + if (null != mHeaderLayout && mode.showHeaderLoadingLayout()) { mHeaderLayout.setLoadingDrawable(drawable); } - if (null != mFooterLayout && mode.canPullUp()) { + if (null != mFooterLayout && mode.showFooterLoadingLayout()) { mFooterLayout.setLoadingDrawable(drawable); } @@ -413,10 +411,10 @@ public void setPullLabel(CharSequence pullLabel) { @Override public void setPullLabel(CharSequence pullLabel, Mode mode) { - if (null != mHeaderLayout && mode.canPullDown()) { + if (null != mHeaderLayout && mode.showHeaderLoadingLayout()) { mHeaderLayout.setPullLabel(pullLabel); } - if (null != mFooterLayout && mode.canPullUp()) { + if (null != mFooterLayout && mode.showFooterLoadingLayout()) { mFooterLayout.setPullLabel(pullLabel); } } @@ -429,7 +427,7 @@ public void setPullLabel(CharSequence pullLabel, Mode mode) { * Whether Pull-To-Refresh should be used */ public final void setPullToRefreshEnabled(boolean enable) { - setMode(enable ? DEFAULT_MODE : Mode.DISABLED); + setMode(enable ? Mode.getDefaultMode() : Mode.DISABLED); } @Override @@ -456,10 +454,10 @@ public void setRefreshingLabel(CharSequence refreshingLabel) { @Override public void setRefreshingLabel(CharSequence refreshingLabel, Mode mode) { - if (null != mHeaderLayout && mode.canPullDown()) { + if (null != mHeaderLayout && mode.showHeaderLoadingLayout()) { mHeaderLayout.setRefreshingLabel(refreshingLabel); } - if (null != mFooterLayout && mode.canPullUp()) { + if (null != mFooterLayout && mode.showFooterLoadingLayout()) { mFooterLayout.setRefreshingLabel(refreshingLabel); } } @@ -471,10 +469,10 @@ public void setReleaseLabel(CharSequence releaseLabel) { @Override public void setReleaseLabel(CharSequence releaseLabel, Mode mode) { - if (null != mHeaderLayout && mode.canPullDown()) { + if (null != mHeaderLayout && mode.showHeaderLoadingLayout()) { mHeaderLayout.setReleaseLabel(releaseLabel); } - if (null != mFooterLayout && mode.canPullUp()) { + if (null != mFooterLayout && mode.showFooterLoadingLayout()) { mFooterLayout.setReleaseLabel(releaseLabel); } } @@ -511,16 +509,24 @@ void onPullToRefresh() { * - Whether the UI should scroll for this event. */ void onRefreshing(final boolean doScroll) { - if (mMode.canPullDown()) { + if (mMode.showHeaderLoadingLayout()) { mHeaderLayout.refreshing(); } - if (mMode.canPullUp()) { + if (mMode.showFooterLoadingLayout()) { mFooterLayout.refreshing(); } if (doScroll) { if (mShowViewWhileRefreshing) { - smoothScrollTo(mCurrentMode == Mode.PULL_DOWN_TO_REFRESH ? -mHeaderHeight : mFooterHeight); + switch (mCurrentMode) { + case PULL_UP_TO_REFRESH: + smoothScrollTo(mFooterHeight); + break; + default: + case PULL_DOWN_TO_REFRESH: + smoothScrollTo(-mHeaderHeight); + break; + } } else { smoothScrollTo(0); } @@ -552,10 +558,10 @@ void onReleaseToRefresh() { void onReset() { mIsBeingDragged = false; - if (mMode.canPullDown()) { + if (mMode.showHeaderLoadingLayout()) { mHeaderLayout.reset(); } - if (mMode.canPullUp()) { + if (mMode.showFooterLoadingLayout()) { mFooterLayout.reset(); } @@ -787,7 +793,7 @@ protected void updateUIForMode() { if (this == mHeaderLayout.getParent()) { removeView(mHeaderLayout); } - if (mMode.canPullDown()) { + if (mMode.showHeaderLoadingLayout()) { addViewInternal(mHeaderLayout, 0, new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT)); } @@ -796,7 +802,7 @@ protected void updateUIForMode() { if (this == mFooterLayout.getParent()) { removeView(mFooterLayout); } - if (mMode.canPullUp()) { + if (mMode.showFooterLoadingLayout()) { addViewInternal(mFooterLayout, new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT)); } @@ -948,11 +954,11 @@ private void pullEvent() { private void refreshLoadingViewsHeight() { mHeaderHeight = mFooterHeight = 0; - if (mMode.canPullDown()) { + if (mMode.showHeaderLoadingLayout()) { measureView(mHeaderLayout); mHeaderHeight = mHeaderLayout.getMeasuredHeight(); } - if (mMode.canPullUp()) { + if (mMode.showFooterLoadingLayout()) { measureView(mFooterLayout); mFooterHeight = mFooterLayout.getMeasuredHeight(); } @@ -1102,18 +1108,19 @@ public static enum Mode { * @return Mode that modeInt maps to, or PULL_DOWN_TO_REFRESH by * default. */ - public static Mode mapIntToValue(int modeInt) { - switch (modeInt) { - case 0x0: - return DISABLED; - case 0x1: - default: - return PULL_DOWN_TO_REFRESH; - case 0x2: - return PULL_UP_TO_REFRESH; - case 0x3: - return BOTH; + public static Mode mapIntToValue(final int modeInt) { + for (Mode value : Mode.values()) { + if (modeInt == value.getIntValue()) { + return value; + } } + + // If not, return default + return getDefaultMode(); + } + + static Mode getDefaultMode() { + return Mode.PULL_DOWN_TO_REFRESH; } private int mIntValue; @@ -1126,14 +1133,14 @@ public static Mode mapIntToValue(int modeInt) { /** * @return true if this mode permits Pulling Down from the top */ - boolean canPullDown() { + boolean showHeaderLoadingLayout() { return this == PULL_DOWN_TO_REFRESH || this == BOTH; } /** * @return true if this mode permits Pulling Up from the bottom */ - boolean canPullUp() { + boolean showFooterLoadingLayout() { return this == PULL_UP_TO_REFRESH || this == BOTH; } @@ -1270,20 +1277,15 @@ public static enum State { * - int to map a State to * @return State that stateInt maps to */ - public static State mapIntToValue(int stateInt) { - switch (stateInt) { - default: - case 0x0: - return RESET; - case 0x1: - return PULL_TO_REFRESH; - case 0x2: - return RELEASE_TO_REFRESH; - case 0x8: - return REFRESHING; - case 0x9: - return MANUAL_REFRESHING; + public static State mapIntToValue(final int stateInt) { + for (State value : State.values()) { + if (stateInt == value.getIntValue()) { + return value; + } } + + // If not, return default + return RESET; } private int mIntValue; diff --git a/library/src/com/handmark/pulltorefresh/library/PullToRefreshListView.java b/library/src/com/handmark/pulltorefresh/library/PullToRefreshListView.java index ea2e37e3d..5c9613410 100644 --- a/library/src/com/handmark/pulltorefresh/library/PullToRefreshListView.java +++ b/library/src/com/handmark/pulltorefresh/library/PullToRefreshListView.java @@ -78,10 +78,10 @@ public void setLastUpdatedLabel(CharSequence label) { public void setLoadingDrawable(Drawable drawable, Mode mode) { super.setLoadingDrawable(drawable, mode); - if (null != mHeaderLoadingView && mode.canPullDown()) { + if (null != mHeaderLoadingView && mode.showHeaderLoadingLayout()) { mHeaderLoadingView.setLoadingDrawable(drawable); } - if (null != mFooterLoadingView && mode.canPullUp()) { + if (null != mFooterLoadingView && mode.showFooterLoadingLayout()) { mFooterLoadingView.setLoadingDrawable(drawable); } } @@ -89,10 +89,10 @@ public void setLoadingDrawable(Drawable drawable, Mode mode) { public void setPullLabel(CharSequence pullLabel, Mode mode) { super.setPullLabel(pullLabel, mode); - if (null != mHeaderLoadingView && mode.canPullDown()) { + if (null != mHeaderLoadingView && mode.showHeaderLoadingLayout()) { mHeaderLoadingView.setPullLabel(pullLabel); } - if (null != mFooterLoadingView && mode.canPullUp()) { + if (null != mFooterLoadingView && mode.showFooterLoadingLayout()) { mFooterLoadingView.setPullLabel(pullLabel); } } @@ -100,10 +100,10 @@ public void setPullLabel(CharSequence pullLabel, Mode mode) { public void setRefreshingLabel(CharSequence refreshingLabel, Mode mode) { super.setRefreshingLabel(refreshingLabel, mode); - if (null != mHeaderLoadingView && mode.canPullDown()) { + if (null != mHeaderLoadingView && mode.showHeaderLoadingLayout()) { mHeaderLoadingView.setRefreshingLabel(refreshingLabel); } - if (null != mFooterLoadingView && mode.canPullUp()) { + if (null != mFooterLoadingView && mode.showFooterLoadingLayout()) { mFooterLoadingView.setRefreshingLabel(refreshingLabel); } } @@ -111,10 +111,10 @@ public void setRefreshingLabel(CharSequence refreshingLabel, Mode mode) { public void setReleaseLabel(CharSequence releaseLabel, Mode mode) { super.setReleaseLabel(releaseLabel, mode); - if (null != mHeaderLoadingView && mode.canPullDown()) { + if (null != mHeaderLoadingView && mode.showHeaderLoadingLayout()) { mHeaderLoadingView.setReleaseLabel(releaseLabel); } - if (null != mFooterLoadingView && mode.canPullUp()) { + if (null != mFooterLoadingView && mode.showFooterLoadingLayout()) { mFooterLoadingView.setReleaseLabel(releaseLabel); } } From 96310ba337741b3fbe01f0a99ae35300134280c2 Mon Sep 17 00:00:00 2001 From: Chris Banes Date: Mon, 19 Nov 2012 15:39:21 +0000 Subject: [PATCH 010/120] Implement #154 --- library/res/values/attrs.xml | 1 + .../library/OverscrollHelper.java | 4 +- .../library/PullToRefreshBase.java | 40 ++++++++----------- .../library/PullToRefreshListView.java | 2 + 4 files changed, 22 insertions(+), 25 deletions(-) diff --git a/library/res/values/attrs.xml b/library/res/values/attrs.xml index fddbfaa85..7eb3307f5 100644 --- a/library/res/values/attrs.xml +++ b/library/res/values/attrs.xml @@ -11,6 +11,7 @@ + diff --git a/library/src/com/handmark/pulltorefresh/library/OverscrollHelper.java b/library/src/com/handmark/pulltorefresh/library/OverscrollHelper.java index c3fd1bf84..0a2506328 100644 --- a/library/src/com/handmark/pulltorefresh/library/OverscrollHelper.java +++ b/library/src/com/handmark/pulltorefresh/library/OverscrollHelper.java @@ -107,8 +107,8 @@ static void overScrollBy(final PullToRefreshBase view, final int deltaY, fina if (view.isPullToRefreshOverScrollEnabled()) { final Mode mode = view.getMode(); - // Check that we're not disabled, and the event isn't from touch - if (mode != Mode.DISABLED && !isTouchEvent && deltaY != 0) { + // Check that Pull-to-Refresh is enabled, and the event isn't from touch + if (mode.allowsPullsToRefresh() && !isTouchEvent && deltaY != 0) { final int newY = (deltaY + scrollY); if (PullToRefreshBase.DEBUG) { diff --git a/library/src/com/handmark/pulltorefresh/library/PullToRefreshBase.java b/library/src/com/handmark/pulltorefresh/library/PullToRefreshBase.java index ffb504760..a984d8644 100644 --- a/library/src/com/handmark/pulltorefresh/library/PullToRefreshBase.java +++ b/library/src/com/handmark/pulltorefresh/library/PullToRefreshBase.java @@ -178,7 +178,7 @@ public final boolean isDisableScrollingWhileRefreshing() { @Override public final boolean isPullToRefreshEnabled() { - return mMode != Mode.DISABLED; + return mMode.allowsPullsToRefresh(); } @Override @@ -519,6 +519,7 @@ void onRefreshing(final boolean doScroll) { if (doScroll) { if (mShowViewWhileRefreshing) { switch (mCurrentMode) { + case MANUAL_REFRESH_ONLY: case PULL_UP_TO_REFRESH: smoothScrollTo(mFooterHeight); break; @@ -963,21 +964,7 @@ private void refreshLoadingViewsHeight() { mFooterHeight = mFooterLayout.getMeasuredHeight(); } - // Hide Loading Views - switch (mMode) { - case DISABLED: - setPadding(0, 0, 0, 0); - case BOTH: - setPadding(0, -mHeaderHeight, 0, -mFooterHeight); - break; - case PULL_UP_TO_REFRESH: - setPadding(0, 0, 0, -mFooterHeight); - break; - case PULL_DOWN_TO_REFRESH: - default: - setPadding(0, -mHeaderHeight, 0, 0); - break; - } + setPadding(0, -mHeaderHeight, 0, -mFooterHeight); } private void setState(State state, final boolean... params) { @@ -1054,7 +1041,7 @@ public static enum AnimationStyle { * @return Mode that modeInt maps to, or PULL_DOWN_TO_REFRESH by * default. */ - public static AnimationStyle mapIntToValue(int modeInt) { + static AnimationStyle mapIntToValue(int modeInt) { switch (modeInt) { case 0x0: default: @@ -1064,7 +1051,7 @@ public static AnimationStyle mapIntToValue(int modeInt) { } } - public LoadingLayout createLoadingLayout(Context context, Mode mode, TypedArray attrs) { + LoadingLayout createLoadingLayout(Context context, Mode mode, TypedArray attrs) { switch (this) { case ROTATE: default: @@ -1096,7 +1083,10 @@ public static enum Mode { * Allow the user to both Pull Down from the top, and Pull Up from the * bottom to refresh. */ - BOTH(0x3); + BOTH(0x3), + + // TODO Add Javadoc + MANUAL_REFRESH_ONLY(0x4); /** * Maps an int to a specific mode. This is needed when saving state, or @@ -1108,7 +1098,7 @@ public static enum Mode { * @return Mode that modeInt maps to, or PULL_DOWN_TO_REFRESH by * default. */ - public static Mode mapIntToValue(final int modeInt) { + static Mode mapIntToValue(final int modeInt) { for (Mode value : Mode.values()) { if (modeInt == value.getIntValue()) { return value; @@ -1118,7 +1108,7 @@ public static Mode mapIntToValue(final int modeInt) { // If not, return default return getDefaultMode(); } - + static Mode getDefaultMode() { return Mode.PULL_DOWN_TO_REFRESH; } @@ -1141,7 +1131,11 @@ boolean showHeaderLoadingLayout() { * @return true if this mode permits Pulling Up from the bottom */ boolean showFooterLoadingLayout() { - return this == PULL_UP_TO_REFRESH || this == BOTH; + return this == PULL_UP_TO_REFRESH || this == BOTH || this == MANUAL_REFRESH_ONLY; + } + + boolean allowsPullsToRefresh() { + return !(this == DISABLED || this == MANUAL_REFRESH_ONLY); } int getIntValue() { @@ -1277,7 +1271,7 @@ public static enum State { * - int to map a State to * @return State that stateInt maps to */ - public static State mapIntToValue(final int stateInt) { + static State mapIntToValue(final int stateInt) { for (State value : State.values()) { if (stateInt == value.getIntValue()) { return value; diff --git a/library/src/com/handmark/pulltorefresh/library/PullToRefreshListView.java b/library/src/com/handmark/pulltorefresh/library/PullToRefreshListView.java index 5c9613410..0bd6849ea 100644 --- a/library/src/com/handmark/pulltorefresh/library/PullToRefreshListView.java +++ b/library/src/com/handmark/pulltorefresh/library/PullToRefreshListView.java @@ -137,6 +137,7 @@ void onRefreshing(final boolean doScroll) { final int selection, scrollToY; switch (getCurrentMode()) { + case MANUAL_REFRESH_ONLY: case PULL_UP_TO_REFRESH: originalLoadingLayout = getFooterLayout(); listViewLoadingLayout = mFooterLoadingView; @@ -186,6 +187,7 @@ void onReset() { final boolean scrollLvToEdge; switch (getCurrentMode()) { + case MANUAL_REFRESH_ONLY: case PULL_UP_TO_REFRESH: originalLoadingLayout = getFooterLayout(); listViewLoadingLayout = mFooterLoadingView; From 864cf1693e3127c62a3f65aea3da621562506c9f Mon Sep 17 00:00:00 2001 From: Chris Banes Date: Mon, 19 Nov 2012 15:48:39 +0000 Subject: [PATCH 011/120] Updated Javadoc for previous commit --- .../library/OverscrollHelper.java | 2 +- .../library/PullToRefreshBase.java | 25 ++++++++++++------- 2 files changed, 17 insertions(+), 10 deletions(-) diff --git a/library/src/com/handmark/pulltorefresh/library/OverscrollHelper.java b/library/src/com/handmark/pulltorefresh/library/OverscrollHelper.java index 0a2506328..dda6b1cb6 100644 --- a/library/src/com/handmark/pulltorefresh/library/OverscrollHelper.java +++ b/library/src/com/handmark/pulltorefresh/library/OverscrollHelper.java @@ -108,7 +108,7 @@ static void overScrollBy(final PullToRefreshBase view, final int deltaY, fina final Mode mode = view.getMode(); // Check that Pull-to-Refresh is enabled, and the event isn't from touch - if (mode.allowsPullsToRefresh() && !isTouchEvent && deltaY != 0) { + if (mode.permitsPullToRefresh() && !isTouchEvent && deltaY != 0) { final int newY = (deltaY + scrollY); if (PullToRefreshBase.DEBUG) { diff --git a/library/src/com/handmark/pulltorefresh/library/PullToRefreshBase.java b/library/src/com/handmark/pulltorefresh/library/PullToRefreshBase.java index a984d8644..8c5c0711e 100644 --- a/library/src/com/handmark/pulltorefresh/library/PullToRefreshBase.java +++ b/library/src/com/handmark/pulltorefresh/library/PullToRefreshBase.java @@ -178,7 +178,7 @@ public final boolean isDisableScrollingWhileRefreshing() { @Override public final boolean isPullToRefreshEnabled() { - return mMode.allowsPullsToRefresh(); + return mMode.permitsPullToRefresh(); } @Override @@ -1064,7 +1064,7 @@ LoadingLayout createLoadingLayout(Context context, Mode mode, TypedArray attrs) public static enum Mode { /** - * Disable all Pull-to-Refresh gesture handling + * Disable all Pull-to-Refresh gesture and Refreshing handling */ DISABLED(0x0), @@ -1085,7 +1085,11 @@ public static enum Mode { */ BOTH(0x3), - // TODO Add Javadoc + /** + * Disables Pull-to-Refresh gesture handling, but allows manually + * setting the Refresh state via + * {@link PullToRefreshBase#setRefreshing() setRefreshing()}. + */ MANUAL_REFRESH_ONLY(0x4); /** @@ -1121,23 +1125,26 @@ static Mode getDefaultMode() { } /** - * @return true if this mode permits Pulling Down from the top + * @return true if the mode permits Pull-to-Refresh + */ + boolean permitsPullToRefresh() { + return !(this == DISABLED || this == MANUAL_REFRESH_ONLY); + } + + /** + * @return true if this mode wants the Loading Layout Header to be shown */ boolean showHeaderLoadingLayout() { return this == PULL_DOWN_TO_REFRESH || this == BOTH; } /** - * @return true if this mode permits Pulling Up from the bottom + * @return true if this mode wants the Loading Layout Footer to be shown */ boolean showFooterLoadingLayout() { return this == PULL_UP_TO_REFRESH || this == BOTH || this == MANUAL_REFRESH_ONLY; } - boolean allowsPullsToRefresh() { - return !(this == DISABLED || this == MANUAL_REFRESH_ONLY); - } - int getIntValue() { return mIntValue; } From 42d34823c901ac03bc9051aed4add8fec92e5515 Mon Sep 17 00:00:00 2001 From: Chris Banes Date: Wed, 21 Nov 2012 09:25:17 +0000 Subject: [PATCH 012/120] Fix #156 --- .../pulltorefresh/library/internal/FlipLoadingLayout.java | 2 +- .../pulltorefresh/library/internal/LoadingLayout.java | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/library/src/com/handmark/pulltorefresh/library/internal/FlipLoadingLayout.java b/library/src/com/handmark/pulltorefresh/library/internal/FlipLoadingLayout.java index 83377269a..21cffa5ba 100644 --- a/library/src/com/handmark/pulltorefresh/library/internal/FlipLoadingLayout.java +++ b/library/src/com/handmark/pulltorefresh/library/internal/FlipLoadingLayout.java @@ -35,7 +35,7 @@ public class FlipLoadingLayout extends LoadingLayout { public FlipLoadingLayout(Context context, Mode mode, TypedArray attrs) { super(context, mode, attrs); - final int rotateAngle = mode == Mode.PULL_DOWN_TO_REFRESH ? 180 : -180; + final int rotateAngle = mode == Mode.PULL_DOWN_TO_REFRESH ? -180 : 180; mRotateAnimation = new RotateAnimation(0, rotateAngle, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f); diff --git a/library/src/com/handmark/pulltorefresh/library/internal/LoadingLayout.java b/library/src/com/handmark/pulltorefresh/library/internal/LoadingLayout.java index b371fcc28..fbc21a38c 100644 --- a/library/src/com/handmark/pulltorefresh/library/internal/LoadingLayout.java +++ b/library/src/com/handmark/pulltorefresh/library/internal/LoadingLayout.java @@ -135,9 +135,9 @@ public LoadingLayout(Context context, final Mode mode, TypedArray attrs) { // If we don't have a user defined drawable, load the default if (null == imageDrawable) { if (mode == Mode.PULL_DOWN_TO_REFRESH) { - imageDrawable = context.getResources().getDrawable(getDefaultBottomDrawableResId()); - } else { imageDrawable = context.getResources().getDrawable(getDefaultTopDrawableResId()); + } else { + imageDrawable = context.getResources().getDrawable(getDefaultBottomDrawableResId()); } } From 9692e5369f1f99dd94f840f31c88f9bdb7f01990 Mon Sep 17 00:00:00 2001 From: Chris Banes Date: Wed, 21 Nov 2012 10:15:41 +0000 Subject: [PATCH 013/120] Implement #147. Add demo() method so that the dev can programatically show the PtR function to the user. --- .../pulltorefresh/library/IPullToRefresh.java | 11 +++++ .../library/PullToRefreshBase.java | 49 +++++++++++++++++-- .../samples/PullToRefreshListActivity.java | 5 ++ 3 files changed, 62 insertions(+), 3 deletions(-) diff --git a/library/src/com/handmark/pulltorefresh/library/IPullToRefresh.java b/library/src/com/handmark/pulltorefresh/library/IPullToRefresh.java index 777af4528..5172f1768 100644 --- a/library/src/com/handmark/pulltorefresh/library/IPullToRefresh.java +++ b/library/src/com/handmark/pulltorefresh/library/IPullToRefresh.java @@ -27,6 +27,17 @@ public interface IPullToRefresh { + /** + * Demos the Pull-to-Refresh functionality to the user so that they are + * aware it is there. This could be useful when the user first opens your + * app, etc. The animation will only happen if the Refresh View (ListView, + * ScrollView, etc) is in a state where a Pull-to-Refresh could occur by a + * user's touch gesture (i.e. scrolled to the top/bottom). + * + * @return true - if the Demo has been started, false if not. + */ + public boolean demo(); + /** * Get the mode that this view is currently in. This is only really useful * when using Mode.BOTH. diff --git a/library/src/com/handmark/pulltorefresh/library/PullToRefreshBase.java b/library/src/com/handmark/pulltorefresh/library/PullToRefreshBase.java index 8c5c0711e..eb8fe1760 100644 --- a/library/src/com/handmark/pulltorefresh/library/PullToRefreshBase.java +++ b/library/src/com/handmark/pulltorefresh/library/PullToRefreshBase.java @@ -53,6 +53,7 @@ public abstract class PullToRefreshBase extends LinearLayout imp public static final int SMOOTH_SCROLL_DURATION_MS = 200; public static final int SMOOTH_SCROLL_LONG_DURATION_MS = 325; + static final int DEMO_SCROLL_INTERVAL = 225; static final String STATE_STATE = "ptr_state"; static final String STATE_MODE = "ptr_mode"; @@ -133,6 +134,19 @@ public void addView(View child, int index, ViewGroup.LayoutParams params) { } } + @Override + public final boolean demo() { + if (mMode.showHeaderLoadingLayout() && isReadyForPullDown()) { + smoothScrollToAndBack(-mHeaderHeight * 2); + return true; + } else if (mMode.showFooterLoadingLayout() && isReadyForPullUp()) { + smoothScrollToAndBack(mFooterHeight * 2); + return true; + } + + return false; + } + @Override public final Mode getCurrentMode() { return mCurrentMode; @@ -1004,6 +1018,10 @@ private void setState(State state, final boolean... params) { * - Duration of animation in milliseconds */ private final void smoothScrollTo(int y, long duration) { + smoothScrollTo(y, duration, 0, null); + } + + private final void smoothScrollTo(int y, long duration, long delayMillis, OnSmoothScrollFinishedListener listener) { if (null != mCurrentSmoothScrollRunnable) { mCurrentSmoothScrollRunnable.stop(); } @@ -1013,11 +1031,26 @@ private final void smoothScrollTo(int y, long duration) { // Default interpolator is a Decelerate Interpolator mScrollAnimationInterpolator = new DecelerateInterpolator(); } - mCurrentSmoothScrollRunnable = new SmoothScrollRunnable(getScrollY(), y, duration); - post(mCurrentSmoothScrollRunnable); + mCurrentSmoothScrollRunnable = new SmoothScrollRunnable(getScrollY(), y, duration, listener); + + if (delayMillis > 0) { + postDelayed(mCurrentSmoothScrollRunnable, delayMillis); + } else { + post(mCurrentSmoothScrollRunnable); + } } } + private final void smoothScrollToAndBack(int y) { + smoothScrollTo(y, SMOOTH_SCROLL_DURATION_MS, 0, new OnSmoothScrollFinishedListener() { + + @Override + public void onSmoothScrollFinished() { + smoothScrollTo(0, SMOOTH_SCROLL_DURATION_MS, DEMO_SCROLL_INTERVAL, null); + } + }); + } + public static enum AnimationStyle { /** * This is the default for Android-PullToRefresh. Allows you to use any @@ -1308,16 +1341,18 @@ final class SmoothScrollRunnable implements Runnable { private final int mScrollToY; private final int mScrollFromY; private final long mDuration; + private OnSmoothScrollFinishedListener mListener; private boolean mContinueRunning = true; private long mStartTime = -1; private int mCurrentY = -1; - public SmoothScrollRunnable(int fromY, int toY, long duration) { + public SmoothScrollRunnable(int fromY, int toY, long duration, OnSmoothScrollFinishedListener listener) { mScrollFromY = fromY; mScrollToY = toY; mInterpolator = mScrollAnimationInterpolator; mDuration = duration; + mListener = listener; } @Override @@ -1352,6 +1387,10 @@ public void run() { } else { postDelayed(this, ANIMATION_DELAY); } + } else { + if (null != mListener) { + mListener.onSmoothScrollFinished(); + } } } @@ -1361,4 +1400,8 @@ public void stop() { } } + static interface OnSmoothScrollFinishedListener { + void onSmoothScrollFinished(); + } + } diff --git a/sample/src/com/handmark/pulltorefresh/samples/PullToRefreshListActivity.java b/sample/src/com/handmark/pulltorefresh/samples/PullToRefreshListActivity.java index 57536084b..ef592c2eb 100755 --- a/sample/src/com/handmark/pulltorefresh/samples/PullToRefreshListActivity.java +++ b/sample/src/com/handmark/pulltorefresh/samples/PullToRefreshListActivity.java @@ -41,6 +41,7 @@ public final class PullToRefreshListActivity extends ListActivity { static final int MENU_MANUAL_REFRESH = 0; static final int MENU_DISABLE_SCROLL = 1; static final int MENU_SET_MODE = 2; + static final int MENU_DEMO = 3; private LinkedList mListItems; private PullToRefreshListView mPullRefreshListView; @@ -129,6 +130,7 @@ public boolean onCreateOptionsMenu(Menu menu) { : "Disable Scrolling while Refreshing"); menu.add(0, MENU_SET_MODE, 0, mPullRefreshListView.getMode() == Mode.BOTH ? "Change to MODE_PULL_DOWN" : "Change to MODE_PULL_BOTH"); + menu.add(0, MENU_DEMO, 0, "Demo"); return super.onCreateOptionsMenu(menu); } @@ -162,6 +164,9 @@ public boolean onOptionsItemSelected(MenuItem item) { mPullRefreshListView.setMode(mPullRefreshListView.getMode() == Mode.BOTH ? Mode.PULL_DOWN_TO_REFRESH : Mode.BOTH); break; + case MENU_DEMO: + mPullRefreshListView.demo(); + break; } return super.onOptionsItemSelected(item); From 9866985bc2afdaf50662ad9b6c017c4378afc9ad Mon Sep 17 00:00:00 2001 From: Chris Banes Date: Fri, 23 Nov 2012 11:25:35 +0000 Subject: [PATCH 014/120] Include appropriate LICENSE file --- LICENSE.txt => LICENSE | 0 extras/PullToRefreshListFragment/LICENSE | 202 +++++++++++++++++++++++ library/LICENSE | 202 +++++++++++++++++++++++ sample/LICENSE | 202 +++++++++++++++++++++++ 4 files changed, 606 insertions(+) rename LICENSE.txt => LICENSE (100%) create mode 100644 extras/PullToRefreshListFragment/LICENSE create mode 100644 library/LICENSE create mode 100644 sample/LICENSE diff --git a/LICENSE.txt b/LICENSE similarity index 100% rename from LICENSE.txt rename to LICENSE diff --git a/extras/PullToRefreshListFragment/LICENSE b/extras/PullToRefreshListFragment/LICENSE new file mode 100644 index 000000000..d64569567 --- /dev/null +++ b/extras/PullToRefreshListFragment/LICENSE @@ -0,0 +1,202 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + 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. diff --git a/library/LICENSE b/library/LICENSE new file mode 100644 index 000000000..d64569567 --- /dev/null +++ b/library/LICENSE @@ -0,0 +1,202 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + 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. diff --git a/sample/LICENSE b/sample/LICENSE new file mode 100644 index 000000000..d64569567 --- /dev/null +++ b/sample/LICENSE @@ -0,0 +1,202 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + 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. From 582e1c640cbb1c6c70936ae1fa81d6920e55672c Mon Sep 17 00:00:00 2001 From: Chris Banes Date: Thu, 29 Nov 2012 14:49:25 +0000 Subject: [PATCH 015/120] Start of moving towards horizontal support. Lots to go! --- .../pull_to_refresh_header_horizontal.xml | 24 +++++ ...ml => pull_to_refresh_header_vertical.xml} | 0 .../library/PullToRefreshAdapterViewBase.java | 8 +- .../library/PullToRefreshBase.java | 49 +++++---- .../PullToRefreshExpandableListView.java | 5 + .../library/PullToRefreshGridView.java | 5 + .../PullToRefreshHorizontalScrollView.java | 101 ++++++++++++++++++ .../library/PullToRefreshListView.java | 5 + .../library/PullToRefreshScrollView.java | 9 +- .../library/PullToRefreshWebView.java | 9 +- .../library/extras/PullToRefreshWebView2.java | 4 +- .../library/internal/FlipLoadingLayout.java | 10 +- .../library/internal/LoadingLayout.java | 84 +++++++++++---- .../library/internal/RotateLoadingLayout.java | 4 +- 14 files changed, 257 insertions(+), 60 deletions(-) create mode 100644 library/res/layout/pull_to_refresh_header_horizontal.xml rename library/res/layout/{pull_to_refresh_header.xml => pull_to_refresh_header_vertical.xml} (100%) create mode 100644 library/src/com/handmark/pulltorefresh/library/PullToRefreshHorizontalScrollView.java diff --git a/library/res/layout/pull_to_refresh_header_horizontal.xml b/library/res/layout/pull_to_refresh_header_horizontal.xml new file mode 100644 index 000000000..da1006d7d --- /dev/null +++ b/library/res/layout/pull_to_refresh_header_horizontal.xml @@ -0,0 +1,24 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/library/res/layout/pull_to_refresh_header.xml b/library/res/layout/pull_to_refresh_header_vertical.xml similarity index 100% rename from library/res/layout/pull_to_refresh_header.xml rename to library/res/layout/pull_to_refresh_header_vertical.xml diff --git a/library/src/com/handmark/pulltorefresh/library/PullToRefreshAdapterViewBase.java b/library/src/com/handmark/pulltorefresh/library/PullToRefreshAdapterViewBase.java index 9542adaa7..06bab8758 100644 --- a/library/src/com/handmark/pulltorefresh/library/PullToRefreshAdapterViewBase.java +++ b/library/src/com/handmark/pulltorefresh/library/PullToRefreshAdapterViewBase.java @@ -281,11 +281,11 @@ protected void handleStyledAttributes(TypedArray a) { mShowIndicator = a.getBoolean(R.styleable.PullToRefresh_ptrShowIndicator, !isPullToRefreshOverScrollEnabled()); } - protected boolean isReadyForPullDown() { + protected boolean isReadyForPullStart() { return isFirstItemVisible(); } - protected boolean isReadyForPullUp() { + protected boolean isReadyForPullEnd() { return isLastItemVisible(); } @@ -427,7 +427,7 @@ private void removeIndicatorViews() { private void updateIndicatorViewsVisibility() { if (null != mIndicatorIvTop) { - if (!isRefreshing() && isReadyForPullDown()) { + if (!isRefreshing() && isReadyForPullStart()) { if (!mIndicatorIvTop.isVisible()) { mIndicatorIvTop.show(); } @@ -439,7 +439,7 @@ private void updateIndicatorViewsVisibility() { } if (null != mIndicatorIvBottom) { - if (!isRefreshing() && isReadyForPullUp()) { + if (!isRefreshing() && isReadyForPullEnd()) { if (!mIndicatorIvBottom.isVisible()) { mIndicatorIvBottom.show(); } diff --git a/library/src/com/handmark/pulltorefresh/library/PullToRefreshBase.java b/library/src/com/handmark/pulltorefresh/library/PullToRefreshBase.java index eb8fe1760..028b73d75 100644 --- a/library/src/com/handmark/pulltorefresh/library/PullToRefreshBase.java +++ b/library/src/com/handmark/pulltorefresh/library/PullToRefreshBase.java @@ -47,6 +47,9 @@ public abstract class PullToRefreshBase extends LinearLayout imp static final boolean DEBUG = false; + public static final int VERTICAL_SCROLL = LinearLayout.VERTICAL; + public static final int HORIZONTAL_SCROLL = LinearLayout.HORIZONTAL; + static final String LOG_TAG = "PullToRefresh"; static final float FRICTION = 2.0f; @@ -136,14 +139,14 @@ public void addView(View child, int index, ViewGroup.LayoutParams params) { @Override public final boolean demo() { - if (mMode.showHeaderLoadingLayout() && isReadyForPullDown()) { + if (mMode.showHeaderLoadingLayout() && isReadyForPullStart()) { smoothScrollToAndBack(-mHeaderHeight * 2); return true; - } else if (mMode.showFooterLoadingLayout() && isReadyForPullUp()) { + } else if (mMode.showFooterLoadingLayout() && isReadyForPullEnd()) { smoothScrollToAndBack(mFooterHeight * 2); return true; } - + return false; } @@ -238,13 +241,13 @@ public final boolean onInterceptTouchEvent(MotionEvent event) { final float xDiff = Math.abs(event.getX() - mLastMotionX); if (yDiff > mTouchSlop && (!mFilterTouchEvents || yDiff > xDiff)) { - if (mMode.showHeaderLoadingLayout() && dy >= 1f && isReadyForPullDown()) { + if (mMode.showHeaderLoadingLayout() && dy >= 1f && isReadyForPullStart()) { mLastMotionY = y; mIsBeingDragged = true; if (mMode == Mode.BOTH) { mCurrentMode = Mode.PULL_DOWN_TO_REFRESH; } - } else if (mMode.showFooterLoadingLayout() && dy <= -1f && isReadyForPullUp()) { + } else if (mMode.showFooterLoadingLayout() && dy <= -1f && isReadyForPullEnd()) { mLastMotionY = y; mIsBeingDragged = true; if (mMode == Mode.BOTH) { @@ -603,7 +606,7 @@ protected final void addViewInternal(View child, ViewGroup.LayoutParams params) } protected LoadingLayout createLoadingLayout(Context context, Mode mode, TypedArray attrs) { - return mLoadingAnimationStyle.createLoadingLayout(context, mode, attrs); + return mLoadingAnimationStyle.createLoadingLayout(context, mode, getPullToRefreshScrollDirection(), attrs); } /** @@ -652,6 +655,12 @@ protected FrameLayout getRefreshableViewWrapper() { return mRefreshableViewWrapper; } + /** + * @return Either {@link #VERTICAL_SCROLL} or {@link #HORIZONTAL_SCROLL} + * depending on the scroll direction. + */ + protected abstract int getPullToRefreshScrollDirection(); + /** * Allows Derivative classes to handle the XML Attrs without creating a * TypedArray themsevles @@ -663,22 +672,22 @@ protected void handleStyledAttributes(TypedArray a) { } /** - * Implemented by derived class to return whether the View is in a mState - * where the user can Pull to Refresh by scrolling down. + * Implemented by derived class to return whether the View is in a state + * where the user can Pull to Refresh by scrolling from the start. * - * @return true if the View is currently the correct mState (for example, + * @return true if the View is currently the correct state (for example, * top of a ListView) */ - protected abstract boolean isReadyForPullDown(); + protected abstract boolean isReadyForPullStart(); /** - * Implemented by derived class to return whether the View is in a mState - * where the user can Pull to Refresh by scrolling up. + * Implemented by derived class to return whether the View is in a state + * where the user can Pull to Refresh by scrolling from the end. * - * @return true if the View is currently in the correct mState (for example, + * @return true if the View is currently in the correct state (for example, * bottom of a ListView) */ - protected abstract boolean isReadyForPullUp(); + protected abstract boolean isReadyForPullEnd(); /** * Called by {@link #onRestoreInstanceState(Parcelable)} so that derivative @@ -893,11 +902,11 @@ private void init(Context context, AttributeSet attrs) { private boolean isReadyForPull() { switch (mMode) { case PULL_DOWN_TO_REFRESH: - return isReadyForPullDown(); + return isReadyForPullStart(); case PULL_UP_TO_REFRESH: - return isReadyForPullUp(); + return isReadyForPullEnd(); case BOTH: - return isReadyForPullUp() || isReadyForPullDown(); + return isReadyForPullEnd() || isReadyForPullStart(); } return false; } @@ -1084,13 +1093,13 @@ static AnimationStyle mapIntToValue(int modeInt) { } } - LoadingLayout createLoadingLayout(Context context, Mode mode, TypedArray attrs) { + LoadingLayout createLoadingLayout(Context context, Mode mode, int scrollDirection, TypedArray attrs) { switch (this) { case ROTATE: default: - return new RotateLoadingLayout(context, mode, attrs); + return new RotateLoadingLayout(context, mode, scrollDirection, attrs); case FLIP: - return new FlipLoadingLayout(context, mode, attrs); + return new FlipLoadingLayout(context, mode, scrollDirection, attrs); } } } diff --git a/library/src/com/handmark/pulltorefresh/library/PullToRefreshExpandableListView.java b/library/src/com/handmark/pulltorefresh/library/PullToRefreshExpandableListView.java index 1c13a471a..f97ee4961 100644 --- a/library/src/com/handmark/pulltorefresh/library/PullToRefreshExpandableListView.java +++ b/library/src/com/handmark/pulltorefresh/library/PullToRefreshExpandableListView.java @@ -58,6 +58,11 @@ protected ExpandableListView createRefreshableView(Context context, AttributeSet lv.setId(android.R.id.list); return lv; } + + @Override + protected int getPullToRefreshScrollDirection() { + return VERTICAL_SCROLL; + } class InternalExpandableListView extends ExpandableListView implements EmptyViewMethodAccessor { diff --git a/library/src/com/handmark/pulltorefresh/library/PullToRefreshGridView.java b/library/src/com/handmark/pulltorefresh/library/PullToRefreshGridView.java index 59e7525c4..e6c6b7cf5 100644 --- a/library/src/com/handmark/pulltorefresh/library/PullToRefreshGridView.java +++ b/library/src/com/handmark/pulltorefresh/library/PullToRefreshGridView.java @@ -58,6 +58,11 @@ protected final GridView createRefreshableView(Context context, AttributeSet att gv.setId(R.id.gridview); return gv; } + + @Override + protected int getPullToRefreshScrollDirection() { + return VERTICAL_SCROLL; + } class InternalGridView extends GridView implements EmptyViewMethodAccessor { diff --git a/library/src/com/handmark/pulltorefresh/library/PullToRefreshHorizontalScrollView.java b/library/src/com/handmark/pulltorefresh/library/PullToRefreshHorizontalScrollView.java new file mode 100644 index 000000000..7638744ce --- /dev/null +++ b/library/src/com/handmark/pulltorefresh/library/PullToRefreshHorizontalScrollView.java @@ -0,0 +1,101 @@ +/******************************************************************************* + * 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.util.AttributeSet; +import android.view.View; +import android.widget.HorizontalScrollView; +import android.widget.ScrollView; + +public class PullToRefreshHorizontalScrollView extends PullToRefreshBase { + + public PullToRefreshHorizontalScrollView(Context context, AttributeSet attrs) { + super(context, attrs); + } + + @Override + protected HorizontalScrollView createRefreshableView(Context context, AttributeSet attrs) { + HorizontalScrollView scrollView; + + // FIXME Need to fix Overscroll for Horizontal + + // if (VERSION.SDK_INT >= VERSION_CODES.GINGERBREAD) { + // scrollView = new InternalHorizontalScrollViewSDK9(context, attrs); + // } else { + scrollView = new HorizontalScrollView(context, attrs); + // } + + scrollView.setId(R.id.scrollview); + return scrollView; + } + + @Override + protected int getPullToRefreshScrollDirection() { + return HORIZONTAL_SCROLL; + } + + @Override + protected boolean isReadyForPullStart() { + return mRefreshableView.getScrollY() == 0; + } + + @Override + protected boolean isReadyForPullEnd() { + View scrollViewChild = mRefreshableView.getChildAt(0); + if (null != scrollViewChild) { + return mRefreshableView.getScrollY() >= (scrollViewChild.getHeight() - getHeight()); + } + return false; + } + + @TargetApi(9) + final class InternalHorizontalScrollViewSDK9 extends HorizontalScrollView { + + public InternalHorizontalScrollViewSDK9(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(PullToRefreshHorizontalScrollView.this, deltaY, scrollY, getScrollRange(), + isTouchEvent); + + return returnValue; + } + + /** + * Taken from the AOSP ScrollView source + */ + private int getScrollRange() { + int scrollRange = 0; + if (getChildCount() > 0) { + View child = getChildAt(0); + scrollRange = Math.max(0, child.getHeight() - (getHeight() - getPaddingBottom() - getPaddingTop())); + } + return scrollRange; + } + } +} diff --git a/library/src/com/handmark/pulltorefresh/library/PullToRefreshListView.java b/library/src/com/handmark/pulltorefresh/library/PullToRefreshListView.java index 0bd6849ea..3a560d416 100644 --- a/library/src/com/handmark/pulltorefresh/library/PullToRefreshListView.java +++ b/library/src/com/handmark/pulltorefresh/library/PullToRefreshListView.java @@ -268,6 +268,11 @@ protected ListView createRefreshableView(Context context, AttributeSet attrs) { lv.setId(android.R.id.list); return lv; } + + @Override + protected int getPullToRefreshScrollDirection() { + return VERTICAL_SCROLL; + } @TargetApi(9) final class InternalListViewSDK9 extends InternalListView { diff --git a/library/src/com/handmark/pulltorefresh/library/PullToRefreshScrollView.java b/library/src/com/handmark/pulltorefresh/library/PullToRefreshScrollView.java index 4fa88e267..caab27a29 100644 --- a/library/src/com/handmark/pulltorefresh/library/PullToRefreshScrollView.java +++ b/library/src/com/handmark/pulltorefresh/library/PullToRefreshScrollView.java @@ -41,14 +41,19 @@ protected ScrollView createRefreshableView(Context context, AttributeSet attrs) scrollView.setId(R.id.scrollview); return scrollView; } + + @Override + protected int getPullToRefreshScrollDirection() { + return VERTICAL_SCROLL; + } @Override - protected boolean isReadyForPullDown() { + protected boolean isReadyForPullStart() { return mRefreshableView.getScrollY() == 0; } @Override - protected boolean isReadyForPullUp() { + protected boolean isReadyForPullEnd() { View scrollViewChild = mRefreshableView.getChildAt(0); if (null != scrollViewChild) { return mRefreshableView.getScrollY() >= (scrollViewChild.getHeight() - getHeight()); diff --git a/library/src/com/handmark/pulltorefresh/library/PullToRefreshWebView.java b/library/src/com/handmark/pulltorefresh/library/PullToRefreshWebView.java index 304042540..730077008 100644 --- a/library/src/com/handmark/pulltorefresh/library/PullToRefreshWebView.java +++ b/library/src/com/handmark/pulltorefresh/library/PullToRefreshWebView.java @@ -91,12 +91,17 @@ protected WebView createRefreshableView(Context context, AttributeSet attrs) { } @Override - protected boolean isReadyForPullDown() { + protected int getPullToRefreshScrollDirection() { + return VERTICAL_SCROLL; + } + + @Override + protected boolean isReadyForPullStart() { return mRefreshableView.getScrollY() == 0; } @Override - protected boolean isReadyForPullUp() { + protected boolean isReadyForPullEnd() { float exactContentHeight = FloatMath.floor(mRefreshableView.getContentHeight() * mRefreshableView.getScale()); return mRefreshableView.getScrollY() >= (exactContentHeight - mRefreshableView.getHeight()); } diff --git a/library/src/com/handmark/pulltorefresh/library/extras/PullToRefreshWebView2.java b/library/src/com/handmark/pulltorefresh/library/extras/PullToRefreshWebView2.java index 70348a4fd..adc249b7f 100644 --- a/library/src/com/handmark/pulltorefresh/library/extras/PullToRefreshWebView2.java +++ b/library/src/com/handmark/pulltorefresh/library/extras/PullToRefreshWebView2.java @@ -92,7 +92,7 @@ protected WebView createRefreshableView(Context context, AttributeSet attrs) { } @Override - protected boolean isReadyForPullDown() { + protected boolean isReadyForPullStart() { // Call Javascript... getRefreshableView().loadUrl(DEF_JS_READY_PULL_DOWN_CALL); @@ -103,7 +103,7 @@ protected boolean isReadyForPullDown() { } @Override - protected boolean isReadyForPullUp() { + protected boolean isReadyForPullEnd() { // Call Javascript... getRefreshableView().loadUrl(DEF_JS_READY_PULL_UP_CALL); diff --git a/library/src/com/handmark/pulltorefresh/library/internal/FlipLoadingLayout.java b/library/src/com/handmark/pulltorefresh/library/internal/FlipLoadingLayout.java index 21cffa5ba..3a35d5180 100644 --- a/library/src/com/handmark/pulltorefresh/library/internal/FlipLoadingLayout.java +++ b/library/src/com/handmark/pulltorefresh/library/internal/FlipLoadingLayout.java @@ -32,13 +32,13 @@ public class FlipLoadingLayout extends LoadingLayout { private final Animation mRotateAnimation, mResetRotateAnimation; - public FlipLoadingLayout(Context context, Mode mode, TypedArray attrs) { - super(context, mode, attrs); - + public FlipLoadingLayout(Context context, Mode mode, int scrollDirection, TypedArray attrs) { + super(context, mode, scrollDirection, attrs); + final int rotateAngle = mode == Mode.PULL_DOWN_TO_REFRESH ? -180 : 180; - mRotateAnimation = new RotateAnimation(0, rotateAngle, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, - 0.5f); + mRotateAnimation = new RotateAnimation(0, rotateAngle, Animation.RELATIVE_TO_SELF, 0.5f, + Animation.RELATIVE_TO_SELF, 0.5f); mRotateAnimation.setInterpolator(ANIMATION_INTERPOLATOR); mRotateAnimation.setDuration(FLIP_ANIMATION_DURATION); mRotateAnimation.setFillAfter(true); diff --git a/library/src/com/handmark/pulltorefresh/library/internal/LoadingLayout.java b/library/src/com/handmark/pulltorefresh/library/internal/LoadingLayout.java index fbc21a38c..8378d4627 100644 --- a/library/src/com/handmark/pulltorefresh/library/internal/LoadingLayout.java +++ b/library/src/com/handmark/pulltorefresh/library/internal/LoadingLayout.java @@ -36,6 +36,7 @@ import android.widget.TextView; import com.handmark.pulltorefresh.library.PullToRefreshBase.Mode; +import com.handmark.pulltorefresh.library.PullToRefreshBase; import com.handmark.pulltorefresh.library.R; @SuppressLint("ViewConstructor") @@ -58,7 +59,7 @@ public abstract class LoadingLayout extends LinearLayout { // Max Width that this can be private int mMaxWidth; - public LoadingLayout(Context context, final Mode mode, TypedArray attrs) { + public LoadingLayout(Context context, final Mode mode, final int scrollDirection, TypedArray attrs) { super(context); setGravity(Gravity.CENTER_VERTICAL); @@ -67,9 +68,20 @@ public LoadingLayout(Context context, final Mode mode, TypedArray attrs) { final int lrPadding = getResources().getDimensionPixelSize(R.dimen.header_footer_left_right_padding); setPadding(lrPadding, tbPadding, lrPadding, tbPadding); - mMaxWidth = getResources().getDimensionPixelSize(R.dimen.header_footer_max_width); + switch (scrollDirection) { + case PullToRefreshBase.HORIZONTAL_SCROLL: + LayoutInflater.from(context).inflate(R.layout.pull_to_refresh_header_horizontal, this); + mMaxWidth = getResources().getDimensionPixelSize(R.dimen.header_footer_max_width); + break; + + case PullToRefreshBase.VERTICAL_SCROLL: + default: + LayoutInflater.from(context).inflate(R.layout.pull_to_refresh_header_vertical, this); + mMaxWidth = getResources().getDimensionPixelSize(R.dimen.header_footer_max_width); + break; + + } - LayoutInflater.from(context).inflate(R.layout.pull_to_refresh_header, this); mHeaderText = (TextView) findViewById(R.id.pull_to_refresh_text); mHeaderProgress = (ProgressBar) findViewById(R.id.pull_to_refresh_progress); mSubHeaderText = (TextView) findViewById(R.id.pull_to_refresh_sub_text); @@ -154,14 +166,18 @@ public final void onPullY(float scaleOfHeight) { } public final void pullToRefresh() { - mHeaderText.setText(mPullLabel); + if (null != mHeaderText) { + mHeaderText.setText(mPullLabel); + } // Now call the callback pullToRefreshImpl(); } public final void refreshing() { - mHeaderText.setText(mRefreshingLabel); + if (null != mHeaderText) { + mHeaderText.setText(mRefreshingLabel); + } if (mUseIntrinisicAnimation) { ((AnimationDrawable) mHeaderImage.getDrawable()).start(); @@ -170,18 +186,24 @@ public final void refreshing() { refreshingImpl(); } - mSubHeaderText.setVisibility(View.GONE); + if (null != mSubHeaderText) { + mSubHeaderText.setVisibility(View.GONE); + } } public final void releaseToRefresh() { - mHeaderText.setText(mReleaseLabel); + if (null != mHeaderText) { + mHeaderText.setText(mReleaseLabel); + } // Now call the callback releaseToRefreshImpl(); } public final void reset() { - mHeaderText.setText(mPullLabel); + if (null != mHeaderText) { + mHeaderText.setText(mPullLabel); + } mHeaderImage.setVisibility(View.VISIBLE); if (mUseIntrinisicAnimation) { @@ -191,10 +213,12 @@ public final void reset() { resetImpl(); } - if (TextUtils.isEmpty(mSubHeaderText.getText())) { - mSubHeaderText.setVisibility(View.GONE); - } else { - mSubHeaderText.setVisibility(View.VISIBLE); + if (null != mSubHeaderText) { + if (TextUtils.isEmpty(mSubHeaderText.getText())) { + mSubHeaderText.setVisibility(View.GONE); + } else { + mSubHeaderText.setVisibility(View.VISIBLE); + } } } @@ -232,20 +256,26 @@ public void setReleaseLabel(CharSequence releaseLabel) { } public void setSubHeaderText(CharSequence label) { - if (TextUtils.isEmpty(label)) { - mSubHeaderText.setVisibility(View.GONE); - } else { - mSubHeaderText.setText(label); - mSubHeaderText.setVisibility(View.VISIBLE); + if (null != mSubHeaderText) { + if (TextUtils.isEmpty(label)) { + mSubHeaderText.setVisibility(View.GONE); + } else { + mSubHeaderText.setText(label); + mSubHeaderText.setVisibility(View.VISIBLE); + } } } public void setSubTextAppearance(int value) { - mSubHeaderText.setTextAppearance(getContext(), value); + if (null != mSubHeaderText) { + mSubHeaderText.setTextAppearance(getContext(), value); + } } public void setSubTextColor(ColorStateList color) { - mSubHeaderText.setTextColor(color); + if (null != mSubHeaderText) { + mSubHeaderText.setTextColor(color); + } } public void setSubTextColor(int color) { @@ -253,13 +283,21 @@ public void setSubTextColor(int color) { } public void setTextAppearance(int value) { - mHeaderText.setTextAppearance(getContext(), value); - mSubHeaderText.setTextAppearance(getContext(), value); + if (null != mHeaderText) { + mHeaderText.setTextAppearance(getContext(), value); + } + if (null != mSubHeaderText) { + mSubHeaderText.setTextAppearance(getContext(), value); + } } public void setTextColor(ColorStateList color) { - mHeaderText.setTextColor(color); - mSubHeaderText.setTextColor(color); + if (null != mHeaderText) { + mHeaderText.setTextColor(color); + } + if (null != mSubHeaderText) { + mSubHeaderText.setTextColor(color); + } } public void setTextColor(int color) { diff --git a/library/src/com/handmark/pulltorefresh/library/internal/RotateLoadingLayout.java b/library/src/com/handmark/pulltorefresh/library/internal/RotateLoadingLayout.java index 71d3499e4..a3683d5f5 100644 --- a/library/src/com/handmark/pulltorefresh/library/internal/RotateLoadingLayout.java +++ b/library/src/com/handmark/pulltorefresh/library/internal/RotateLoadingLayout.java @@ -35,8 +35,8 @@ public class RotateLoadingLayout extends LoadingLayout { private float mRotationPivotX, mRotationPivotY; - public RotateLoadingLayout(Context context, Mode mode, TypedArray attrs) { - super(context, mode, attrs); + public RotateLoadingLayout(Context context, Mode mode, int scrollDirection, TypedArray attrs) { + super(context, mode, scrollDirection, attrs); mHeaderImage.setScaleType(ScaleType.MATRIX); mHeaderImageMatrix = new Matrix(); From 88452fbbf3879f5d8862f1119c039c51ecde72c1 Mon Sep 17 00:00:00 2001 From: Chris Banes Date: Thu, 29 Nov 2012 14:52:25 +0000 Subject: [PATCH 016/120] Horizontal ScrollView should just 'work' when the rest is complete now. --- .../library/PullToRefreshHorizontalScrollView.java | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/library/src/com/handmark/pulltorefresh/library/PullToRefreshHorizontalScrollView.java b/library/src/com/handmark/pulltorefresh/library/PullToRefreshHorizontalScrollView.java index 7638744ce..bf0c00478 100644 --- a/library/src/com/handmark/pulltorefresh/library/PullToRefreshHorizontalScrollView.java +++ b/library/src/com/handmark/pulltorefresh/library/PullToRefreshHorizontalScrollView.java @@ -17,12 +17,9 @@ import android.annotation.TargetApi; import android.content.Context; -import android.os.Build.VERSION; -import android.os.Build.VERSION_CODES; import android.util.AttributeSet; import android.view.View; import android.widget.HorizontalScrollView; -import android.widget.ScrollView; public class PullToRefreshHorizontalScrollView extends PullToRefreshBase { @@ -53,14 +50,14 @@ protected int getPullToRefreshScrollDirection() { @Override protected boolean isReadyForPullStart() { - return mRefreshableView.getScrollY() == 0; + return mRefreshableView.getScrollX() == 0; } @Override protected boolean isReadyForPullEnd() { View scrollViewChild = mRefreshableView.getChildAt(0); if (null != scrollViewChild) { - return mRefreshableView.getScrollY() >= (scrollViewChild.getHeight() - getHeight()); + return mRefreshableView.getScrollX() >= (scrollViewChild.getWidth() - getWidth()); } return false; } @@ -93,7 +90,7 @@ private int getScrollRange() { int scrollRange = 0; if (getChildCount() > 0) { View child = getChildAt(0); - scrollRange = Math.max(0, child.getHeight() - (getHeight() - getPaddingBottom() - getPaddingTop())); + scrollRange = Math.max(0, child.getWidth() - (getWidth() - getPaddingLeft() - getPaddingRight())); } return scrollRange; } From 41a75241670191a2b52bcc0638307aeba73bf835 Mon Sep 17 00:00:00 2001 From: Chris Banes Date: Thu, 29 Nov 2012 15:44:29 +0000 Subject: [PATCH 017/120] Add Sample Horizontal ScrollView Activity --- sample/AndroidManifest.xml | 4 + .../activity_ptr_horizontalscrollview.xml | 25 +++++++ .../samples/LauncherActivity.java | 9 ++- ...ToRefreshHorizontalScrollViewActivity.java | 73 +++++++++++++++++++ 4 files changed, 109 insertions(+), 2 deletions(-) create mode 100755 sample/res/layout/activity_ptr_horizontalscrollview.xml create mode 100644 sample/src/com/handmark/pulltorefresh/samples/PullToRefreshHorizontalScrollViewActivity.java diff --git a/sample/AndroidManifest.xml b/sample/AndroidManifest.xml index c4a2864ee..f693d209e 100755 --- a/sample/AndroidManifest.xml +++ b/sample/AndroidManifest.xml @@ -46,6 +46,10 @@ android:name=".PullToRefreshScrollViewActivity" android:label="PtR ScrollView" > + + diff --git a/sample/res/layout/activity_ptr_horizontalscrollview.xml b/sample/res/layout/activity_ptr_horizontalscrollview.xml new file mode 100755 index 000000000..5ada8ea2a --- /dev/null +++ b/sample/res/layout/activity_ptr_horizontalscrollview.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/sample/src/com/handmark/pulltorefresh/samples/LauncherActivity.java b/sample/src/com/handmark/pulltorefresh/samples/LauncherActivity.java index 7a3a299f7..0e9dc3dd7 100644 --- a/sample/src/com/handmark/pulltorefresh/samples/LauncherActivity.java +++ b/sample/src/com/handmark/pulltorefresh/samples/LauncherActivity.java @@ -15,6 +15,8 @@ *******************************************************************************/ package com.handmark.pulltorefresh.samples; +import com.handmark.pulltorefresh.library.PullToRefreshHorizontalScrollView; + import android.app.ListActivity; import android.content.Intent; import android.os.Bundle; @@ -25,7 +27,7 @@ public class LauncherActivity extends ListActivity { public static final String[] options = { "ListView", "ExpandableListView", "GridView", "WebView", "ScrollView", - "ListView Fragment", "WebView Advanced" }; + "Horizontal ScrollView", "ListView Fragment", "WebView Advanced" }; @Override protected void onCreate(Bundle savedInstanceState) { @@ -55,9 +57,12 @@ protected void onListItemClick(ListView l, View v, int position, long id) { intent = new Intent(this, PullToRefreshScrollViewActivity.class); break; case 5: - intent = new Intent(this, PullToRefreshListFragmentActivity.class); + intent = new Intent(this, PullToRefreshHorizontalScrollViewActivity.class); break; case 6: + intent = new Intent(this, PullToRefreshListFragmentActivity.class); + break; + case 7: intent = new Intent(this, PullToRefreshWebView2Activity.class); break; } diff --git a/sample/src/com/handmark/pulltorefresh/samples/PullToRefreshHorizontalScrollViewActivity.java b/sample/src/com/handmark/pulltorefresh/samples/PullToRefreshHorizontalScrollViewActivity.java new file mode 100644 index 000000000..81e21652d --- /dev/null +++ b/sample/src/com/handmark/pulltorefresh/samples/PullToRefreshHorizontalScrollViewActivity.java @@ -0,0 +1,73 @@ +/******************************************************************************* + * 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.samples; + +import android.app.Activity; +import android.os.AsyncTask; +import android.os.Bundle; +import android.widget.HorizontalScrollView; + +import com.handmark.pulltorefresh.library.PullToRefreshBase; +import com.handmark.pulltorefresh.library.PullToRefreshBase.OnRefreshListener; +import com.handmark.pulltorefresh.library.PullToRefreshHorizontalScrollView; + +public final class PullToRefreshHorizontalScrollViewActivity extends Activity { + + PullToRefreshHorizontalScrollView mPullRefreshScrollView; + HorizontalScrollView mScrollView; + + /** Called when the activity is first created. */ + @Override + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_ptr_horizontalscrollview); + + mPullRefreshScrollView = (PullToRefreshHorizontalScrollView) findViewById(R.id.pull_refresh_horizontalscrollview); + mPullRefreshScrollView.setOnRefreshListener(new OnRefreshListener() { + + @Override + public void onRefresh(PullToRefreshBase refreshView) { + new GetDataTask().execute(); + } + }); + + mScrollView = mPullRefreshScrollView.getRefreshableView(); + } + + private class GetDataTask extends AsyncTask { + + @Override + protected String[] doInBackground(Void... params) { + // Simulates a background job. + try { + Thread.sleep(4000); + } catch (InterruptedException e) { + } + return null; + } + + @Override + protected void onPostExecute(String[] result) { + // Do some stuff here + + // Call onRefreshComplete when the list has been refreshed. + mPullRefreshScrollView.onRefreshComplete(); + + super.onPostExecute(result); + } + } + +} From 1b5a26eb8f0517d876fab36713aa67f0f4d4690e Mon Sep 17 00:00:00 2001 From: Chris Banes Date: Thu, 29 Nov 2012 16:20:07 +0000 Subject: [PATCH 018/120] Horizontal Scrolling working! Still needs some tweaks but it's getting there. --- .../library/PullToRefreshBase.java | 246 +++++++++++++----- 1 file changed, 177 insertions(+), 69 deletions(-) diff --git a/library/src/com/handmark/pulltorefresh/library/PullToRefreshBase.java b/library/src/com/handmark/pulltorefresh/library/PullToRefreshBase.java index 028b73d75..131b8f8b8 100644 --- a/library/src/com/handmark/pulltorefresh/library/PullToRefreshBase.java +++ b/library/src/com/handmark/pulltorefresh/library/PullToRefreshBase.java @@ -70,9 +70,8 @@ public abstract class PullToRefreshBase extends LinearLayout imp // =========================================================== private int mTouchSlop; - private float mLastMotionX; - private float mLastMotionY; - private float mInitialMotionY; + private float mLastMotionX, mLastMotionY; + private float mInitialMotionX, mInitialMotionY; private boolean mIsBeingDragged = false; private State mState = State.RESET; @@ -93,8 +92,8 @@ public abstract class PullToRefreshBase extends LinearLayout imp private LoadingLayout mHeaderLayout; private LoadingLayout mFooterLayout; - private int mHeaderHeight; - private int mFooterHeight; + private int mHeaderDimension; + private int mFooterDimension; private OnRefreshListener mOnRefreshListener; private OnRefreshListener2 mOnRefreshListener2; @@ -140,10 +139,10 @@ public void addView(View child, int index, ViewGroup.LayoutParams params) { @Override public final boolean demo() { if (mMode.showHeaderLoadingLayout() && isReadyForPullStart()) { - smoothScrollToAndBack(-mHeaderHeight * 2); + smoothScrollToAndBack(-mHeaderDimension * 2); return true; } else if (mMode.showFooterLoadingLayout() && isReadyForPullEnd()) { - smoothScrollToAndBack(mFooterHeight * 2); + smoothScrollToAndBack(mFooterDimension * 2); return true; } @@ -235,20 +234,35 @@ public final boolean onInterceptTouchEvent(MotionEvent event) { } if (isReadyForPull()) { - final float y = event.getY(); - final float dy = y - mLastMotionY; - final float yDiff = Math.abs(dy); - final float xDiff = Math.abs(event.getX() - mLastMotionX); + final float y = event.getY(), x = event.getX(); + final float diff, oppositeDiff, absDiff; + + // We need to use the correct values, based on scroll + // direction + switch (getPullToRefreshScrollDirection()) { + case HORIZONTAL_SCROLL: + diff = x - mLastMotionX; + oppositeDiff = y - mLastMotionY; + break; + case VERTICAL_SCROLL: + default: + diff = y - mLastMotionY; + oppositeDiff = x - mLastMotionX; + break; + } + absDiff = Math.abs(diff); - if (yDiff > mTouchSlop && (!mFilterTouchEvents || yDiff > xDiff)) { - if (mMode.showHeaderLoadingLayout() && dy >= 1f && isReadyForPullStart()) { + if (absDiff > mTouchSlop && (!mFilterTouchEvents || absDiff > Math.abs(oppositeDiff))) { + if (mMode.showHeaderLoadingLayout() && diff >= 1f && isReadyForPullStart()) { mLastMotionY = y; + mLastMotionX = x; mIsBeingDragged = true; if (mMode == Mode.BOTH) { mCurrentMode = Mode.PULL_DOWN_TO_REFRESH; } - } else if (mMode.showFooterLoadingLayout() && dy <= -1f && isReadyForPullEnd()) { + } else if (mMode.showFooterLoadingLayout() && diff <= -1f && isReadyForPullEnd()) { mLastMotionY = y; + mLastMotionX = x; mIsBeingDragged = true; if (mMode == Mode.BOTH) { mCurrentMode = Mode.PULL_UP_TO_REFRESH; @@ -261,7 +275,7 @@ public final boolean onInterceptTouchEvent(MotionEvent event) { case MotionEvent.ACTION_DOWN: { if (isReadyForPull()) { mLastMotionY = mInitialMotionY = event.getY(); - mLastMotionX = event.getX(); + mLastMotionX = mInitialMotionX = event.getX(); mIsBeingDragged = false; } break; @@ -298,6 +312,7 @@ public final boolean onTouchEvent(MotionEvent event) { case MotionEvent.ACTION_MOVE: { if (mIsBeingDragged) { mLastMotionY = event.getY(); + mLastMotionX = event.getX(); pullEvent(); return true; } @@ -307,6 +322,7 @@ public final boolean onTouchEvent(MotionEvent event) { case MotionEvent.ACTION_DOWN: { if (isReadyForPull()) { mLastMotionY = mInitialMotionY = event.getY(); + mLastMotionX = mInitialMotionX = event.getX(); return true; } break; @@ -368,7 +384,7 @@ public void setLastUpdatedLabel(CharSequence label) { } // Refresh Height as it may have changed - refreshLoadingViewsHeight(); + refreshLoadingViewsSize(); } @Override @@ -386,7 +402,7 @@ public void setLoadingDrawable(Drawable drawable, Mode mode) { } // The Loading Height may have changed, so refresh - refreshLoadingViewsHeight(); + refreshLoadingViewsSize(); } @Override @@ -538,11 +554,11 @@ void onRefreshing(final boolean doScroll) { switch (mCurrentMode) { case MANUAL_REFRESH_ONLY: case PULL_UP_TO_REFRESH: - smoothScrollTo(mFooterHeight); + smoothScrollTo(mFooterDimension); break; default: case PULL_DOWN_TO_REFRESH: - smoothScrollTo(-mHeaderHeight); + smoothScrollTo(-mHeaderDimension); break; } } else { @@ -628,7 +644,7 @@ protected LoadingLayout createLoadingLayout(Context context, Mode mode, TypedArr protected abstract T createRefreshableView(Context context, AttributeSet attrs); protected final int getFooterHeight() { - return mFooterHeight; + return mFooterDimension; } protected final LoadingLayout getFooterLayout() { @@ -636,7 +652,7 @@ protected final LoadingLayout getFooterLayout() { } protected final int getHeaderHeight() { - return mHeaderHeight; + return mHeaderDimension; } protected final LoadingLayout getHeaderLayout() { @@ -675,8 +691,8 @@ protected void handleStyledAttributes(TypedArray a) { * Implemented by derived class to return whether the View is in a state * where the user can Pull to Refresh by scrolling from the start. * - * @return true if the View is currently the correct state (for example, - * top of a ListView) + * @return true if the View is currently the correct state (for example, top + * of a ListView) */ protected abstract boolean isReadyForPullStart(); @@ -766,12 +782,21 @@ protected void resetHeader() { } /** - * Helper method which just calls scrollTo() but with a zero x value. + * Helper method which just calls scrollTo() in the correct scrolling + * direction. * - * @param y + * @param value + * - New Scroll value */ - protected final void setHeaderScroll(int y) { - scrollTo(0, y); + protected final void setHeaderScroll(final int value) { + switch (getPullToRefreshScrollDirection()) { + case VERTICAL_SCROLL: + scrollTo(0, value); + break; + case HORIZONTAL_SCROLL: + scrollTo(value, 0); + break; + } } /** @@ -787,25 +812,25 @@ protected void setRefreshingInternal(final boolean doScroll) { } /** - * Smooth Scroll to Y position using the default duration of + * Smooth Scroll to position using the default duration of * {@value #SMOOTH_SCROLL_DURATION_MS} ms. * - * @param y - * - Y position to scroll to + * @param scrollValue + * - Position to scroll to */ - protected final void smoothScrollTo(int y) { - smoothScrollTo(y, getPullToRefreshScrollDuration()); + protected final void smoothScrollTo(int scrollValue) { + smoothScrollTo(scrollValue, getPullToRefreshScrollDuration()); } /** - * Smooth Scroll to Y position using the longer default duration of + * Smooth Scroll to position using the longer default duration of * {@value #SMOOTH_SCROLL_LONG_DURATION_MS} ms. * - * @param y - * - Y position to scroll to + * @param scrollValue + * - Position to scroll to */ - protected final void smoothScrollToLonger(int y) { - smoothScrollTo(y, getPullToRefreshScrollDurationLonger()); + protected final void smoothScrollToLonger(int scrollValue) { + smoothScrollTo(scrollValue, getPullToRefreshScrollDurationLonger()); } /** @@ -813,13 +838,27 @@ protected final void smoothScrollToLonger(int y) { * checking that the mode is different to current state so always updates. */ protected void updateUIForMode() { + // We need to use the correct LayoutParam values, based on scroll + // direction + final LinearLayout.LayoutParams lp; + switch (getPullToRefreshScrollDirection()) { + case HORIZONTAL_SCROLL: + lp = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, + LinearLayout.LayoutParams.MATCH_PARENT); + break; + case VERTICAL_SCROLL: + default: + lp = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, + LinearLayout.LayoutParams.WRAP_CONTENT); + break; + } + // Remove Header, and then add Header Loading View again if needed if (this == mHeaderLayout.getParent()) { removeView(mHeaderLayout); } if (mMode.showHeaderLoadingLayout()) { - addViewInternal(mHeaderLayout, 0, new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, - ViewGroup.LayoutParams.WRAP_CONTENT)); + addViewInternal(mHeaderLayout, 0, lp); } // Remove Footer, and then add Footer Loading View again if needed @@ -827,12 +866,11 @@ protected void updateUIForMode() { removeView(mFooterLayout); } if (mMode.showFooterLoadingLayout()) { - addViewInternal(mFooterLayout, new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, - ViewGroup.LayoutParams.WRAP_CONTENT)); + addViewInternal(mFooterLayout, lp); } // Hide Loading Views - refreshLoadingViewsHeight(); + refreshLoadingViewsSize(); // If we're not using Mode.BOTH, set mCurrentMode to mMode, otherwise // set it to pull down @@ -843,13 +881,33 @@ private void addRefreshableView(Context context, T refreshableView) { mRefreshableViewWrapper = new FrameLayout(context); mRefreshableViewWrapper.addView(refreshableView, ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT); - addViewInternal(mRefreshableViewWrapper, new LinearLayout.LayoutParams(LayoutParams.MATCH_PARENT, 0, 1.0f)); + + switch (getPullToRefreshScrollDirection()) { + case HORIZONTAL_SCROLL: + addViewInternal(mRefreshableViewWrapper, new LinearLayout.LayoutParams(0, LayoutParams.MATCH_PARENT, + 1.0f)); + break; + case VERTICAL_SCROLL: + default: + addViewInternal(mRefreshableViewWrapper, new LinearLayout.LayoutParams(LayoutParams.MATCH_PARENT, 0, + 1.0f)); + break; + } } @SuppressWarnings("deprecation") private void init(Context context, AttributeSet attrs) { - setOrientation(LinearLayout.VERTICAL); - setGravity(Gravity.CENTER_HORIZONTAL); + switch (getPullToRefreshScrollDirection()) { + case HORIZONTAL_SCROLL: + setOrientation(LinearLayout.HORIZONTAL); + break; + case VERTICAL_SCROLL: + default: + setOrientation(LinearLayout.VERTICAL); + break; + } + + setGravity(Gravity.CENTER); ViewConfiguration config = ViewConfiguration.get(context); mTouchSlop = config.getScaledTouchSlop(); @@ -935,25 +993,38 @@ private void measureView(View child) { * change */ private void pullEvent() { - final int newScrollY; - final int itemHeight; + final int newScrollValue; + final int itemDimension; + final float initialMotionValue, lastMotionValue; + + switch (getPullToRefreshScrollDirection()) { + case HORIZONTAL_SCROLL: + initialMotionValue = mInitialMotionX; + lastMotionValue = mLastMotionX; + break; + case VERTICAL_SCROLL: + default: + initialMotionValue = mInitialMotionY; + lastMotionValue = mLastMotionY; + break; + } switch (mCurrentMode) { case PULL_UP_TO_REFRESH: - newScrollY = Math.round(Math.max(mInitialMotionY - mLastMotionY, 0) / FRICTION); - itemHeight = mFooterHeight; + newScrollValue = Math.round(Math.max(initialMotionValue - lastMotionValue, 0) / FRICTION); + itemDimension = mFooterDimension; break; case PULL_DOWN_TO_REFRESH: default: - newScrollY = Math.round(Math.min(mInitialMotionY - mLastMotionY, 0) / FRICTION); - itemHeight = mHeaderHeight; + newScrollValue = Math.round(Math.min(initialMotionValue - lastMotionValue, 0) / FRICTION); + itemDimension = mHeaderDimension; break; } - setHeaderScroll(newScrollY); + setHeaderScroll(newScrollValue); - if (newScrollY != 0) { - float scale = Math.abs(newScrollY) / (float) itemHeight; + if (newScrollValue != 0) { + float scale = Math.abs(newScrollValue) / (float) itemDimension; switch (mCurrentMode) { case PULL_UP_TO_REFRESH: mFooterLayout.onPullY(scale); @@ -963,9 +1034,9 @@ private void pullEvent() { break; } - if (mState != State.PULL_TO_REFRESH && itemHeight >= Math.abs(newScrollY)) { + if (mState != State.PULL_TO_REFRESH && itemDimension >= Math.abs(newScrollValue)) { setState(State.PULL_TO_REFRESH); - } else if (mState == State.PULL_TO_REFRESH && itemHeight < Math.abs(newScrollY)) { + } else if (mState == State.PULL_TO_REFRESH && itemDimension < Math.abs(newScrollValue)) { setState(State.RELEASE_TO_REFRESH); } } @@ -975,19 +1046,44 @@ private void pullEvent() { * Re-measure the Loading Views height, and adjust internal padding as * necessary */ - private void refreshLoadingViewsHeight() { - mHeaderHeight = mFooterHeight = 0; + private void refreshLoadingViewsSize() { + mHeaderDimension = mFooterDimension = 0; + + int pLeft, pTop, pRight, pBottom; + pLeft = pTop = pRight = pBottom = 0; if (mMode.showHeaderLoadingLayout()) { measureView(mHeaderLayout); - mHeaderHeight = mHeaderLayout.getMeasuredHeight(); + + switch (getPullToRefreshScrollDirection()) { + case HORIZONTAL_SCROLL: + mHeaderDimension = mHeaderLayout.getMeasuredWidth(); + pLeft = -mHeaderDimension; + break; + case VERTICAL_SCROLL: + default: + mHeaderDimension = mHeaderLayout.getMeasuredHeight(); + pTop = -mHeaderDimension; + break; + } } if (mMode.showFooterLoadingLayout()) { measureView(mFooterLayout); - mFooterHeight = mFooterLayout.getMeasuredHeight(); + + switch (getPullToRefreshScrollDirection()) { + case HORIZONTAL_SCROLL: + mFooterDimension = mFooterLayout.getMeasuredWidth(); + pRight = -mFooterDimension; + break; + case VERTICAL_SCROLL: + default: + mFooterDimension = mFooterLayout.getMeasuredHeight(); + pBottom = -mFooterDimension; + break; + } } - setPadding(0, -mHeaderHeight, 0, -mFooterHeight); + setPadding(pLeft, pTop, pRight, pBottom); } private void setState(State state, final boolean... params) { @@ -1019,28 +1115,40 @@ private void setState(State state, final boolean... params) { } /** - * Smooth Scroll to Y position using the specific duration + * Smooth Scroll to position using the specific duration * - * @param y - * - Y position to scroll to + * @param scrollValue + * - Position to scroll to * @param duration * - Duration of animation in milliseconds */ - private final void smoothScrollTo(int y, long duration) { - smoothScrollTo(y, duration, 0, null); + private final void smoothScrollTo(int scrollValue, long duration) { + smoothScrollTo(scrollValue, duration, 0, null); } - private final void smoothScrollTo(int y, long duration, long delayMillis, OnSmoothScrollFinishedListener listener) { + private final void smoothScrollTo(int newScrollValue, long duration, long delayMillis, + OnSmoothScrollFinishedListener listener) { if (null != mCurrentSmoothScrollRunnable) { mCurrentSmoothScrollRunnable.stop(); } - if (getScrollY() != y) { + final int oldScrollValue; + switch (getPullToRefreshScrollDirection()) { + case HORIZONTAL_SCROLL: + oldScrollValue = getScrollX(); + break; + case VERTICAL_SCROLL: + default: + oldScrollValue = getScrollY(); + break; + } + + if (oldScrollValue != newScrollValue) { if (null == mScrollAnimationInterpolator) { // Default interpolator is a Decelerate Interpolator mScrollAnimationInterpolator = new DecelerateInterpolator(); } - mCurrentSmoothScrollRunnable = new SmoothScrollRunnable(getScrollY(), y, duration, listener); + mCurrentSmoothScrollRunnable = new SmoothScrollRunnable(oldScrollValue, newScrollValue, duration, listener); if (delayMillis > 0) { postDelayed(mCurrentSmoothScrollRunnable, delayMillis); From c4eea623ca6d39628921ce3569e6796ecaa35a80 Mon Sep 17 00:00:00 2001 From: Chris Banes Date: Thu, 29 Nov 2012 16:43:36 +0000 Subject: [PATCH 019/120] Tidy up and rename some enum values based on logical names (START/END) rather than TOP/BOTTOM. --- library/res/values/attrs.xml | 9 +- .../library/PullToRefreshAdapterViewBase.java | 12 +-- .../library/PullToRefreshBase.java | 102 ++++++++++-------- .../library/PullToRefreshListView.java | 12 +-- .../library/internal/FlipLoadingLayout.java | 2 +- .../library/internal/IndicatorLayout.java | 4 +- .../library/internal/LoadingLayout.java | 12 +-- .../samples/PullToRefreshGridActivity.java | 4 +- .../samples/PullToRefreshListActivity.java | 4 +- 9 files changed, 88 insertions(+), 73 deletions(-) diff --git a/library/res/values/attrs.xml b/library/res/values/attrs.xml index 7eb3307f5..a808c6ead 100644 --- a/library/res/values/attrs.xml +++ b/library/res/values/attrs.xml @@ -8,10 +8,13 @@ - - + + + + + @@ -26,4 +29,4 @@ - + \ No newline at end of file diff --git a/library/src/com/handmark/pulltorefresh/library/PullToRefreshAdapterViewBase.java b/library/src/com/handmark/pulltorefresh/library/PullToRefreshAdapterViewBase.java index 06bab8758..bffaebe39 100644 --- a/library/src/com/handmark/pulltorefresh/library/PullToRefreshAdapterViewBase.java +++ b/library/src/com/handmark/pulltorefresh/library/PullToRefreshAdapterViewBase.java @@ -232,10 +232,10 @@ void onPullToRefresh() { if (getShowIndicatorInternal()) { switch (getCurrentMode()) { - case PULL_UP_TO_REFRESH: + case PULL_FROM_END: mIndicatorIvBottom.pullToRefresh(); break; - case PULL_DOWN_TO_REFRESH: + case PULL_FROM_START: mIndicatorIvTop.pullToRefresh(); break; } @@ -256,10 +256,10 @@ void onReleaseToRefresh() { if (getShowIndicatorInternal()) { switch (getCurrentMode()) { - case PULL_UP_TO_REFRESH: + case PULL_FROM_END: mIndicatorIvBottom.releaseToRefresh(); break; - case PULL_DOWN_TO_REFRESH: + case PULL_FROM_START: mIndicatorIvTop.releaseToRefresh(); break; } @@ -315,7 +315,7 @@ private void addIndicatorViews() { if (mode.showHeaderLoadingLayout() && null == mIndicatorIvTop) { // If the mode can pull down, and we don't have one set already - mIndicatorIvTop = new IndicatorLayout(getContext(), Mode.PULL_DOWN_TO_REFRESH); + mIndicatorIvTop = new IndicatorLayout(getContext(), Mode.PULL_FROM_START); FrameLayout.LayoutParams params = new FrameLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT); params.rightMargin = getResources().getDimensionPixelSize(R.dimen.indicator_right_padding); @@ -330,7 +330,7 @@ private void addIndicatorViews() { if (mode.showFooterLoadingLayout() && null == mIndicatorIvBottom) { // If the mode can pull down, and we don't have one set already - mIndicatorIvBottom = new IndicatorLayout(getContext(), Mode.PULL_UP_TO_REFRESH); + mIndicatorIvBottom = new IndicatorLayout(getContext(), Mode.PULL_FROM_END); FrameLayout.LayoutParams params = new FrameLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT); params.rightMargin = getResources().getDimensionPixelSize(R.dimen.indicator_right_padding); diff --git a/library/src/com/handmark/pulltorefresh/library/PullToRefreshBase.java b/library/src/com/handmark/pulltorefresh/library/PullToRefreshBase.java index 131b8f8b8..06219efa9 100644 --- a/library/src/com/handmark/pulltorefresh/library/PullToRefreshBase.java +++ b/library/src/com/handmark/pulltorefresh/library/PullToRefreshBase.java @@ -181,10 +181,10 @@ public final State getState() { /** * @deprecated Use the value from getCurrentMode() instead - * @return true if the current mode is Mode.PULL_DOWN_TO_REFRESH + * @return true if the current mode is Mode.PULL_FROM_START */ public final boolean hasPullFromTop() { - return mCurrentMode == Mode.PULL_DOWN_TO_REFRESH; + return mCurrentMode == Mode.PULL_FROM_START; } @Override @@ -258,14 +258,14 @@ public final boolean onInterceptTouchEvent(MotionEvent event) { mLastMotionX = x; mIsBeingDragged = true; if (mMode == Mode.BOTH) { - mCurrentMode = Mode.PULL_DOWN_TO_REFRESH; + mCurrentMode = Mode.PULL_FROM_START; } } else if (mMode.showFooterLoadingLayout() && diff <= -1f && isReadyForPullEnd()) { mLastMotionY = y; mLastMotionX = x; mIsBeingDragged = true; if (mMode == Mode.BOTH) { - mCurrentMode = Mode.PULL_UP_TO_REFRESH; + mCurrentMode = Mode.PULL_FROM_END; } } } @@ -342,9 +342,9 @@ public final boolean onTouchEvent(MotionEvent event) { } else if (null != mOnRefreshListener2) { setState(State.REFRESHING, true); - if (mCurrentMode == Mode.PULL_DOWN_TO_REFRESH) { + if (mCurrentMode == Mode.PULL_FROM_START) { mOnRefreshListener2.onPullDownToRefresh(this); - } else if (mCurrentMode == Mode.PULL_UP_TO_REFRESH) { + } else if (mCurrentMode == Mode.PULL_FROM_END) { mOnRefreshListener2.onPullUpToRefresh(this); } return true; @@ -525,10 +525,10 @@ public final void setShowViewWhileRefreshing(boolean showView) { */ void onPullToRefresh() { switch (mCurrentMode) { - case PULL_UP_TO_REFRESH: + case PULL_FROM_END: mFooterLayout.pullToRefresh(); break; - case PULL_DOWN_TO_REFRESH: + case PULL_FROM_START: mHeaderLayout.pullToRefresh(); break; } @@ -553,11 +553,11 @@ void onRefreshing(final boolean doScroll) { if (mShowViewWhileRefreshing) { switch (mCurrentMode) { case MANUAL_REFRESH_ONLY: - case PULL_UP_TO_REFRESH: + case PULL_FROM_END: smoothScrollTo(mFooterDimension); break; default: - case PULL_DOWN_TO_REFRESH: + case PULL_FROM_START: smoothScrollTo(-mHeaderDimension); break; } @@ -576,10 +576,10 @@ void onRefreshing(final boolean doScroll) { */ void onReleaseToRefresh() { switch (mCurrentMode) { - case PULL_UP_TO_REFRESH: + case PULL_FROM_END: mFooterLayout.releaseToRefresh(); break; - case PULL_DOWN_TO_REFRESH: + case PULL_FROM_START: mHeaderLayout.releaseToRefresh(); break; } @@ -874,7 +874,7 @@ protected void updateUIForMode() { // If we're not using Mode.BOTH, set mCurrentMode to mMode, otherwise // set it to pull down - mCurrentMode = (mMode != Mode.BOTH) ? mMode : Mode.PULL_DOWN_TO_REFRESH; + mCurrentMode = (mMode != Mode.BOTH) ? mMode : Mode.PULL_FROM_START; } private void addRefreshableView(Context context, T refreshableView) { @@ -928,8 +928,8 @@ private void init(Context context, AttributeSet attrs) { addRefreshableView(context, mRefreshableView); // We need to create now layouts now - mHeaderLayout = createLoadingLayout(context, Mode.PULL_DOWN_TO_REFRESH, a); - mFooterLayout = createLoadingLayout(context, Mode.PULL_UP_TO_REFRESH, a); + mHeaderLayout = createLoadingLayout(context, Mode.PULL_FROM_START, a); + mFooterLayout = createLoadingLayout(context, Mode.PULL_FROM_END, a); // Styleables from XML if (a.hasValue(R.styleable.PullToRefresh_ptrHeaderBackground)) { @@ -959,9 +959,9 @@ private void init(Context context, AttributeSet attrs) { private boolean isReadyForPull() { switch (mMode) { - case PULL_DOWN_TO_REFRESH: + case PULL_FROM_START: return isReadyForPullStart(); - case PULL_UP_TO_REFRESH: + case PULL_FROM_END: return isReadyForPullEnd(); case BOTH: return isReadyForPullEnd() || isReadyForPullStart(); @@ -1010,11 +1010,11 @@ private void pullEvent() { } switch (mCurrentMode) { - case PULL_UP_TO_REFRESH: + case PULL_FROM_END: newScrollValue = Math.round(Math.max(initialMotionValue - lastMotionValue, 0) / FRICTION); itemDimension = mFooterDimension; break; - case PULL_DOWN_TO_REFRESH: + case PULL_FROM_START: default: newScrollValue = Math.round(Math.min(initialMotionValue - lastMotionValue, 0) / FRICTION); itemDimension = mHeaderDimension; @@ -1026,10 +1026,10 @@ private void pullEvent() { if (newScrollValue != 0) { float scale = Math.abs(newScrollValue) / (float) itemDimension; switch (mCurrentMode) { - case PULL_UP_TO_REFRESH: + case PULL_FROM_END: mFooterLayout.onPullY(scale); break; - case PULL_DOWN_TO_REFRESH: + case PULL_FROM_START: mHeaderLayout.onPullY(scale); break; } @@ -1188,8 +1188,7 @@ public static enum AnimationStyle { * * @param modeInt * - int to map a Mode to - * @return Mode that modeInt maps to, or PULL_DOWN_TO_REFRESH by - * default. + * @return Mode that modeInt maps to, or ROTATE by default. */ static AnimationStyle mapIntToValue(int modeInt) { switch (modeInt) { @@ -1213,25 +1212,28 @@ LoadingLayout createLoadingLayout(Context context, Mode mode, int scrollDirectio } public static enum Mode { + /** * Disable all Pull-to-Refresh gesture and Refreshing handling */ DISABLED(0x0), /** - * Only allow the user to Pull Down from the top to refresh, this is the - * default. + * Only allow the user to Pull from the start of the Refreshable View to + * refresh. The start is either the Top or Left, depending on the + * scrolling direction. */ - PULL_DOWN_TO_REFRESH(0x1), + PULL_FROM_START(0x1), /** - * Only allow the user to Pull Up from the bottom to refresh. + * Only allow the user to Pull from the end of the Refreshable View to + * refresh. The start is either the Bottom or Right, depending on the + * scrolling direction. */ - PULL_UP_TO_REFRESH(0x2), + PULL_FROM_END(0x2), /** - * Allow the user to both Pull Down from the top, and Pull Up from the - * bottom to refresh. + * Allow the user to both Pull from the start, from the end to refresh. */ BOTH(0x3), @@ -1242,6 +1244,16 @@ public static enum Mode { */ MANUAL_REFRESH_ONLY(0x4); + /** + * @deprecated Use {@link #PULL_FROM_START} from now on. + */ + public static Mode PULL_DOWN_TO_REFRESH = Mode.PULL_FROM_START; + + /** + * @deprecated Use {@link #PULL_FROM_END} from now on. + */ + public static Mode PULL_UP_TO_REFRESH = Mode.PULL_FROM_END; + /** * Maps an int to a specific mode. This is needed when saving state, or * inflating the view from XML where the mode is given through a attr @@ -1249,8 +1261,7 @@ public static enum Mode { * * @param modeInt * - int to map a Mode to - * @return Mode that modeInt maps to, or PULL_DOWN_TO_REFRESH by - * default. + * @return Mode that modeInt maps to, or PULL_FROM_START by default. */ static Mode mapIntToValue(final int modeInt) { for (Mode value : Mode.values()) { @@ -1264,7 +1275,7 @@ static Mode mapIntToValue(final int modeInt) { } static Mode getDefaultMode() { - return Mode.PULL_DOWN_TO_REFRESH; + return Mode.PULL_FROM_START; } private int mIntValue; @@ -1285,14 +1296,14 @@ boolean permitsPullToRefresh() { * @return true if this mode wants the Loading Layout Header to be shown */ boolean showHeaderLoadingLayout() { - return this == PULL_DOWN_TO_REFRESH || this == BOTH; + return this == PULL_FROM_START || this == BOTH; } /** * @return true if this mode wants the Loading Layout Footer to be shown */ boolean showFooterLoadingLayout() { - return this == PULL_UP_TO_REFRESH || this == BOTH || this == MANUAL_REFRESH_ONLY; + return this == PULL_FROM_END || this == BOTH || this == MANUAL_REFRESH_ONLY; } int getIntValue() { @@ -1342,10 +1353,10 @@ public static interface OnPullEventListener { * @param state * - The new state of View. * @param direction - * - One of {@link Mode#PULL_UP_TO_REFRESH} or - * {@link Mode#PULL_UP_TO_REFRESH} depending on which - * direction the user is pulling. Only useful when - * state is {@link State#PULL_TO_REFRESH} or + * - One of {@link Mode#PULL_FROM_START} or + * {@link Mode#PULL_FROM_END} depending on which direction + * the user is pulling. Only useful when state is + * {@link State#PULL_TO_REFRESH} or * {@link State#RELEASE_TO_REFRESH}. */ public void onPullEvent(final PullToRefreshBase refreshView, State state, Mode direction); @@ -1360,8 +1371,8 @@ public static interface OnPullEventListener { public static interface OnRefreshListener { /** - * onRefresh will be called for both Pull Down from top, and Pull Up - * from Bottom + * onRefresh will be called for both a Pull from start, and Pull from + * end */ public void onRefresh(final PullToRefreshBase refreshView); @@ -1375,16 +1386,17 @@ public static interface OnRefreshListener { * @author Chris Banes */ public static interface OnRefreshListener2 { + // TODO These methods need renaming to START/END rather than DOWN/UP /** - * onPullDownToRefresh will be called only when the user has Pulled Down - * from the top, and released. + * onPullDownToRefresh will be called only when the user has Pulled from + * the start, and released. */ public void onPullDownToRefresh(final PullToRefreshBase refreshView); /** - * onPullUpToRefresh will be called only when the user has Pulled Up - * from the bottom, and released. + * onPullUpToRefresh will be called only when the user has Pulled from + * the end, and released. */ public void onPullUpToRefresh(final PullToRefreshBase refreshView); diff --git a/library/src/com/handmark/pulltorefresh/library/PullToRefreshListView.java b/library/src/com/handmark/pulltorefresh/library/PullToRefreshListView.java index 3a560d416..f3ec0178f 100644 --- a/library/src/com/handmark/pulltorefresh/library/PullToRefreshListView.java +++ b/library/src/com/handmark/pulltorefresh/library/PullToRefreshListView.java @@ -138,13 +138,13 @@ void onRefreshing(final boolean doScroll) { switch (getCurrentMode()) { case MANUAL_REFRESH_ONLY: - case PULL_UP_TO_REFRESH: + case PULL_FROM_END: originalLoadingLayout = getFooterLayout(); listViewLoadingLayout = mFooterLoadingView; selection = mRefreshableView.getCount() - 1; scrollToY = getScrollY() - getFooterHeight(); break; - case PULL_DOWN_TO_REFRESH: + case PULL_FROM_START: default: originalLoadingLayout = getHeaderLayout(); listViewLoadingLayout = mHeaderLoadingView; @@ -188,14 +188,14 @@ void onReset() { switch (getCurrentMode()) { case MANUAL_REFRESH_ONLY: - case PULL_UP_TO_REFRESH: + case PULL_FROM_END: originalLoadingLayout = getFooterLayout(); listViewLoadingLayout = mFooterLoadingView; selection = mRefreshableView.getCount() - 1; scrollToHeight = getFooterHeight(); scrollLvToEdge = Math.abs(mRefreshableView.getLastVisiblePosition() - selection) <= 1; break; - case PULL_DOWN_TO_REFRESH: + case PULL_FROM_START: default: originalLoadingLayout = getHeaderLayout(); listViewLoadingLayout = mHeaderLoadingView; @@ -254,12 +254,12 @@ protected ListView createRefreshableView(Context context, AttributeSet attrs) { // Create Loading Views ready for use later FrameLayout frame = new FrameLayout(context); - mHeaderLoadingView = createLoadingLayout(context, Mode.PULL_DOWN_TO_REFRESH, a); + mHeaderLoadingView = createLoadingLayout(context, Mode.PULL_FROM_START, a); frame.addView(mHeaderLoadingView, lp); lv.addHeaderView(frame, null, false); mLvFooterLoadingFrame = new FrameLayout(context); - mFooterLoadingView = createLoadingLayout(context, Mode.PULL_UP_TO_REFRESH, a); + mFooterLoadingView = createLoadingLayout(context, Mode.PULL_FROM_END, a); mLvFooterLoadingFrame.addView(mFooterLoadingView, lp); a.recycle(); diff --git a/library/src/com/handmark/pulltorefresh/library/internal/FlipLoadingLayout.java b/library/src/com/handmark/pulltorefresh/library/internal/FlipLoadingLayout.java index 3a35d5180..4f80c33a4 100644 --- a/library/src/com/handmark/pulltorefresh/library/internal/FlipLoadingLayout.java +++ b/library/src/com/handmark/pulltorefresh/library/internal/FlipLoadingLayout.java @@ -35,7 +35,7 @@ public class FlipLoadingLayout extends LoadingLayout { public FlipLoadingLayout(Context context, Mode mode, int scrollDirection, TypedArray attrs) { super(context, mode, scrollDirection, attrs); - final int rotateAngle = mode == Mode.PULL_DOWN_TO_REFRESH ? -180 : 180; + final int rotateAngle = mode == Mode.PULL_FROM_START ? -180 : 180; mRotateAnimation = new RotateAnimation(0, rotateAngle, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f); diff --git a/library/src/com/handmark/pulltorefresh/library/internal/IndicatorLayout.java b/library/src/com/handmark/pulltorefresh/library/internal/IndicatorLayout.java index 401c0a3d7..d6aef5a6e 100644 --- a/library/src/com/handmark/pulltorefresh/library/internal/IndicatorLayout.java +++ b/library/src/com/handmark/pulltorefresh/library/internal/IndicatorLayout.java @@ -48,14 +48,14 @@ public IndicatorLayout(Context context, PullToRefreshBase.Mode mode) { int inAnimResId, outAnimResId; switch (mode) { - case PULL_UP_TO_REFRESH: + case PULL_FROM_END: inAnimResId = R.anim.slide_in_from_bottom; outAnimResId = R.anim.slide_out_to_bottom; setBackgroundResource(R.drawable.indicator_bg_bottom); mArrowImageView.setImageResource(R.drawable.arrow_up); break; default: - case PULL_DOWN_TO_REFRESH: + case PULL_FROM_START: inAnimResId = R.anim.slide_in_from_top; outAnimResId = R.anim.slide_out_to_top; setBackgroundResource(R.drawable.indicator_bg_top); diff --git a/library/src/com/handmark/pulltorefresh/library/internal/LoadingLayout.java b/library/src/com/handmark/pulltorefresh/library/internal/LoadingLayout.java index 8378d4627..93d1f561e 100644 --- a/library/src/com/handmark/pulltorefresh/library/internal/LoadingLayout.java +++ b/library/src/com/handmark/pulltorefresh/library/internal/LoadingLayout.java @@ -35,8 +35,8 @@ import android.widget.ProgressBar; import android.widget.TextView; -import com.handmark.pulltorefresh.library.PullToRefreshBase.Mode; import com.handmark.pulltorefresh.library.PullToRefreshBase; +import com.handmark.pulltorefresh.library.PullToRefreshBase.Mode; import com.handmark.pulltorefresh.library.R; @SuppressLint("ViewConstructor") @@ -88,14 +88,14 @@ public LoadingLayout(Context context, final Mode mode, final int scrollDirection mHeaderImage = (ImageView) findViewById(R.id.pull_to_refresh_image); switch (mode) { - case PULL_UP_TO_REFRESH: + case PULL_FROM_END: // Load in labels mPullLabel = context.getString(R.string.pull_to_refresh_from_bottom_pull_label); mRefreshingLabel = context.getString(R.string.pull_to_refresh_from_bottom_refreshing_label); mReleaseLabel = context.getString(R.string.pull_to_refresh_from_bottom_release_label); break; - case PULL_DOWN_TO_REFRESH: + case PULL_FROM_START: default: // Load in labels mPullLabel = context.getString(R.string.pull_to_refresh_pull_label); @@ -138,15 +138,15 @@ public LoadingLayout(Context context, final Mode mode, final int scrollDirection // Check Specific Drawable from Attrs, these overrite the generic // drawable attr above - if (attrs.hasValue(R.styleable.PullToRefresh_ptrDrawableTop) && mode == Mode.PULL_DOWN_TO_REFRESH) { + if (attrs.hasValue(R.styleable.PullToRefresh_ptrDrawableTop) && mode == Mode.PULL_FROM_START) { imageDrawable = attrs.getDrawable(R.styleable.PullToRefresh_ptrDrawableTop); - } else if (attrs.hasValue(R.styleable.PullToRefresh_ptrDrawableBottom) && mode == Mode.PULL_UP_TO_REFRESH) { + } else if (attrs.hasValue(R.styleable.PullToRefresh_ptrDrawableBottom) && mode == Mode.PULL_FROM_END) { imageDrawable = attrs.getDrawable(R.styleable.PullToRefresh_ptrDrawableTop); } // If we don't have a user defined drawable, load the default if (null == imageDrawable) { - if (mode == Mode.PULL_DOWN_TO_REFRESH) { + if (mode == Mode.PULL_FROM_START) { imageDrawable = context.getResources().getDrawable(getDefaultTopDrawableResId()); } else { imageDrawable = context.getResources().getDrawable(getDefaultBottomDrawableResId()); diff --git a/sample/src/com/handmark/pulltorefresh/samples/PullToRefreshGridActivity.java b/sample/src/com/handmark/pulltorefresh/samples/PullToRefreshGridActivity.java index 69c2d2512..9d87e357c 100644 --- a/sample/src/com/handmark/pulltorefresh/samples/PullToRefreshGridActivity.java +++ b/sample/src/com/handmark/pulltorefresh/samples/PullToRefreshGridActivity.java @@ -116,7 +116,7 @@ public boolean onCreateOptionsMenu(Menu menu) { @Override public boolean onPrepareOptionsMenu(Menu menu) { MenuItem setModeItem = menu.findItem(MENU_SET_MODE); - setModeItem.setTitle(mPullRefreshGridView.getMode() == Mode.BOTH ? "Change to MODE_PULL_DOWN" + setModeItem.setTitle(mPullRefreshGridView.getMode() == Mode.BOTH ? "Change to MODE_PULL_FROM_START" : "Change to MODE_PULL_BOTH"); return super.onPrepareOptionsMenu(menu); @@ -127,7 +127,7 @@ public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case MENU_SET_MODE: mPullRefreshGridView - .setMode(mPullRefreshGridView.getMode() == Mode.BOTH ? Mode.PULL_DOWN_TO_REFRESH + .setMode(mPullRefreshGridView.getMode() == Mode.BOTH ? Mode.PULL_FROM_START : Mode.BOTH); break; } diff --git a/sample/src/com/handmark/pulltorefresh/samples/PullToRefreshListActivity.java b/sample/src/com/handmark/pulltorefresh/samples/PullToRefreshListActivity.java index ef592c2eb..a2fafbd7c 100755 --- a/sample/src/com/handmark/pulltorefresh/samples/PullToRefreshListActivity.java +++ b/sample/src/com/handmark/pulltorefresh/samples/PullToRefreshListActivity.java @@ -142,7 +142,7 @@ public boolean onPrepareOptionsMenu(Menu menu) { : "Disable Scrolling while Refreshing"); MenuItem setModeItem = menu.findItem(MENU_SET_MODE); - setModeItem.setTitle(mPullRefreshListView.getMode() == Mode.BOTH ? "Change to MODE_PULL_DOWN" + setModeItem.setTitle(mPullRefreshListView.getMode() == Mode.BOTH ? "Change to MODE_FROM_START" : "Change to MODE_PULL_BOTH"); return super.onPrepareOptionsMenu(menu); @@ -161,7 +161,7 @@ public boolean onOptionsItemSelected(MenuItem item) { .isDisableScrollingWhileRefreshing()); break; case MENU_SET_MODE: - mPullRefreshListView.setMode(mPullRefreshListView.getMode() == Mode.BOTH ? Mode.PULL_DOWN_TO_REFRESH + mPullRefreshListView.setMode(mPullRefreshListView.getMode() == Mode.BOTH ? Mode.PULL_FROM_START : Mode.BOTH); break; case MENU_DEMO: From 910818a6cf8abf3d00c272899bd84010132ee5be Mon Sep 17 00:00:00 2001 From: Chris Banes Date: Thu, 29 Nov 2012 17:00:47 +0000 Subject: [PATCH 020/120] Fix Horizontal Scroll OverScroll --- .../library/OverscrollHelper.java | 71 ++++++++++++++----- .../library/PullToRefreshBase.java | 12 ++-- .../PullToRefreshExpandableListView.java | 13 ++-- .../library/PullToRefreshGridView.java | 14 ++-- .../PullToRefreshHorizontalScrollView.java | 28 ++++---- .../library/PullToRefreshListView.java | 12 ++-- .../library/PullToRefreshScrollView.java | 14 ++-- .../library/PullToRefreshWebView.java | 14 ++-- 8 files changed, 107 insertions(+), 71 deletions(-) diff --git a/library/src/com/handmark/pulltorefresh/library/OverscrollHelper.java b/library/src/com/handmark/pulltorefresh/library/OverscrollHelper.java index dda6b1cb6..d329832c8 100644 --- a/library/src/com/handmark/pulltorefresh/library/OverscrollHelper.java +++ b/library/src/com/handmark/pulltorefresh/library/OverscrollHelper.java @@ -37,6 +37,12 @@ final class OverscrollHelper { * * @param view * - PullToRefreshView that is calling this. + * @param deltaX + * - Change in X in pixels, passed through from from overScrollBy + * call + * @param scrollX + * - Current X scroll value in pixels before applying deltaY, + * passed through from from overScrollBy call * @param deltaY * - Change in Y in pixels, passed through from from overScrollBy * call @@ -47,9 +53,9 @@ final class OverscrollHelper { * - true if this scroll operation is the result of a touch * event, passed through from from overScrollBy call */ - static void overScrollBy(final PullToRefreshBase view, final int deltaY, final int scrollY, - final boolean isTouchEvent) { - overScrollBy(view, deltaY, scrollY, 0, isTouchEvent); + static void overScrollBy(final PullToRefreshBase view, final int deltaX, final int scrollX, final int deltaY, + final int scrollY, final boolean isTouchEvent) { + overScrollBy(view, deltaX, scrollX, deltaY, scrollY, 0, isTouchEvent); } /** @@ -59,6 +65,12 @@ static void overScrollBy(final PullToRefreshBase view, final int deltaY, fina * * @param view * - PullToRefreshView that is calling this. + * @param deltaX + * - Change in X in pixels, passed through from from overScrollBy + * call + * @param scrollX + * - Current X scroll value in pixels before applying deltaY, + * passed through from from overScrollBy call * @param deltaY * - Change in Y in pixels, passed through from from overScrollBy * call @@ -71,9 +83,9 @@ static void overScrollBy(final PullToRefreshBase view, final int deltaY, fina * - true if this scroll operation is the result of a touch * event, passed through from from overScrollBy call */ - static void overScrollBy(final PullToRefreshBase view, final int deltaY, final int scrollY, - final int scrollRange, final boolean isTouchEvent) { - overScrollBy(view, deltaY, scrollY, scrollRange, 0, DEFAULT_OVERSCROLL_SCALE, isTouchEvent); + static void overScrollBy(final PullToRefreshBase view, final int deltaX, final int scrollX, final int deltaY, + final int scrollY, final int scrollRange, final boolean isTouchEvent) { + overScrollBy(view, deltaX, scrollX, deltaY, scrollY, scrollRange, 0, DEFAULT_OVERSCROLL_SCALE, isTouchEvent); } /** @@ -82,6 +94,12 @@ static void overScrollBy(final PullToRefreshBase view, final int deltaY, fina * * @param view * - PullToRefreshView that is calling this. + * @param deltaX + * - Change in X in pixels, passed through from from overScrollBy + * call + * @param scrollX + * - Current X scroll value in pixels before applying deltaY, + * passed through from from overScrollBy call * @param deltaY * - Change in Y in pixels, passed through from from overScrollBy * call @@ -100,35 +118,52 @@ static void overScrollBy(final PullToRefreshBase view, final int deltaY, fina * - true if this scroll operation is the result of a touch * event, passed through from from overScrollBy call */ - static void overScrollBy(final PullToRefreshBase view, final int deltaY, final int scrollY, - final int scrollRange, final int fuzzyThreshold, final float scaleFactor, final boolean isTouchEvent) { + static void overScrollBy(final PullToRefreshBase view, final int deltaX, final int scrollX, final int deltaY, + final int scrollY, final int scrollRange, final int fuzzyThreshold, final float scaleFactor, + final boolean isTouchEvent) { + + final int deltaValue, currentScrollValue, scrollValue; + switch (view.getPullToRefreshScrollDirection()) { + case PullToRefreshBase.HORIZONTAL_SCROLL: + deltaValue = deltaX; + scrollValue = scrollX; + currentScrollValue = view.getScrollX(); + break; + case PullToRefreshBase.VERTICAL_SCROLL: + default: + deltaValue = deltaY; + scrollValue = scrollY; + currentScrollValue = view.getScrollY(); + break; + } // Check that OverScroll is enabled if (view.isPullToRefreshOverScrollEnabled()) { final Mode mode = view.getMode(); - // Check that Pull-to-Refresh is enabled, and the event isn't from touch - if (mode.permitsPullToRefresh() && !isTouchEvent && deltaY != 0) { - final int newY = (deltaY + scrollY); + // Check that Pull-to-Refresh is enabled, and the event isn't from + // touch + if (mode.permitsPullToRefresh() && !isTouchEvent && deltaValue != 0) { + final int newScrollValue = (deltaValue + scrollValue); if (PullToRefreshBase.DEBUG) { - Log.d(LOG_TAG, "OverScroll. DeltaY: " + deltaY + ", ScrollY: " + scrollY + ", NewY: " + newY - + ", ScrollRange: " + scrollRange); + Log.d(LOG_TAG, "OverScroll. DeltaX: " + deltaX + ", ScrollX: " + scrollX + ", DeltaY: " + deltaY + + ", ScrollY: " + scrollY + ", NewY: " + newScrollValue + ", ScrollRange: " + scrollRange + ", CurrentScroll: " + currentScrollValue); } - if (newY < (0 - fuzzyThreshold)) { + if (newScrollValue < (0 - fuzzyThreshold)) { // Check the mode supports the overscroll direction, and // then move scroll if (mode.showHeaderLoadingLayout()) { - view.setHeaderScroll((int) (scaleFactor * (view.getScrollY() + newY))); + view.setHeaderScroll((int) (scaleFactor * (currentScrollValue + newScrollValue))); } - } else if (newY > (scrollRange + fuzzyThreshold)) { + } else if (newScrollValue > (scrollRange + fuzzyThreshold)) { // Check the mode supports the overscroll direction, and // then move scroll if (mode.showFooterLoadingLayout()) { - view.setHeaderScroll((int) (scaleFactor * (view.getScrollY() + newY - scrollRange))); + view.setHeaderScroll((int) (scaleFactor * (currentScrollValue + newScrollValue - scrollRange))); } - } else if (Math.abs(newY) <= fuzzyThreshold || Math.abs(newY - scrollRange) <= fuzzyThreshold) { + } else if (Math.abs(newScrollValue) <= fuzzyThreshold || Math.abs(newScrollValue - scrollRange) <= fuzzyThreshold) { // Means we've stopped overscrolling, so scroll back to 0 view.smoothScrollToLonger(0); } diff --git a/library/src/com/handmark/pulltorefresh/library/PullToRefreshBase.java b/library/src/com/handmark/pulltorefresh/library/PullToRefreshBase.java index 06219efa9..7ec10b890 100644 --- a/library/src/com/handmark/pulltorefresh/library/PullToRefreshBase.java +++ b/library/src/com/handmark/pulltorefresh/library/PullToRefreshBase.java @@ -518,6 +518,12 @@ public void setScrollAnimationInterpolator(Interpolator interpolator) { public final void setShowViewWhileRefreshing(boolean showView) { mShowViewWhileRefreshing = showView; } + + /** + * @return Either {@link #VERTICAL_SCROLL} or {@link #HORIZONTAL_SCROLL} + * depending on the scroll direction. + */ + abstract int getPullToRefreshScrollDirection(); /** * Called when the UI has been to be updated to be in the @@ -671,12 +677,6 @@ protected FrameLayout getRefreshableViewWrapper() { return mRefreshableViewWrapper; } - /** - * @return Either {@link #VERTICAL_SCROLL} or {@link #HORIZONTAL_SCROLL} - * depending on the scroll direction. - */ - protected abstract int getPullToRefreshScrollDirection(); - /** * Allows Derivative classes to handle the XML Attrs without creating a * TypedArray themsevles diff --git a/library/src/com/handmark/pulltorefresh/library/PullToRefreshExpandableListView.java b/library/src/com/handmark/pulltorefresh/library/PullToRefreshExpandableListView.java index f97ee4961..e098a2576 100644 --- a/library/src/com/handmark/pulltorefresh/library/PullToRefreshExpandableListView.java +++ b/library/src/com/handmark/pulltorefresh/library/PullToRefreshExpandableListView.java @@ -45,6 +45,11 @@ public ContextMenuInfo getContextMenuInfo() { return ((InternalExpandableListView) getRefreshableView()).getContextMenuInfo(); } + @Override + final int getPullToRefreshScrollDirection() { + return VERTICAL_SCROLL; + } + @Override protected ExpandableListView createRefreshableView(Context context, AttributeSet attrs) { final ExpandableListView lv; @@ -58,11 +63,6 @@ protected ExpandableListView createRefreshableView(Context context, AttributeSet lv.setId(android.R.id.list); return lv; } - - @Override - protected int getPullToRefreshScrollDirection() { - return VERTICAL_SCROLL; - } class InternalExpandableListView extends ExpandableListView implements EmptyViewMethodAccessor { @@ -100,7 +100,8 @@ protected boolean overScrollBy(int deltaX, int deltaY, int scrollX, int scrollY, scrollRangeY, maxOverScrollX, maxOverScrollY, isTouchEvent); // Does all of the hard work... - OverscrollHelper.overScrollBy(PullToRefreshExpandableListView.this, deltaY, scrollY, isTouchEvent); + OverscrollHelper.overScrollBy(PullToRefreshExpandableListView.this, deltaX, scrollX, deltaY, scrollY, + isTouchEvent); return returnValue; } diff --git a/library/src/com/handmark/pulltorefresh/library/PullToRefreshGridView.java b/library/src/com/handmark/pulltorefresh/library/PullToRefreshGridView.java index e6c6b7cf5..06b4bb563 100644 --- a/library/src/com/handmark/pulltorefresh/library/PullToRefreshGridView.java +++ b/library/src/com/handmark/pulltorefresh/library/PullToRefreshGridView.java @@ -45,6 +45,11 @@ public ContextMenuInfo getContextMenuInfo() { return ((InternalGridView) getRefreshableView()).getContextMenuInfo(); } + @Override + final int getPullToRefreshScrollDirection() { + return VERTICAL_SCROLL; + } + @Override protected final GridView createRefreshableView(Context context, AttributeSet attrs) { final GridView gv; @@ -58,11 +63,6 @@ protected final GridView createRefreshableView(Context context, AttributeSet att gv.setId(R.id.gridview); return gv; } - - @Override - protected int getPullToRefreshScrollDirection() { - return VERTICAL_SCROLL; - } class InternalGridView extends GridView implements EmptyViewMethodAccessor { @@ -85,7 +85,7 @@ public void setEmptyViewInternal(View emptyView) { super.setEmptyView(emptyView); } } - + @TargetApi(9) final class InternalGridViewSDK9 extends InternalGridView { @@ -101,7 +101,7 @@ protected boolean overScrollBy(int deltaX, int deltaY, int scrollX, int scrollY, scrollRangeY, maxOverScrollX, maxOverScrollY, isTouchEvent); // Does all of the hard work... - OverscrollHelper.overScrollBy(PullToRefreshGridView.this, deltaY, scrollY, isTouchEvent); + OverscrollHelper.overScrollBy(PullToRefreshGridView.this, deltaX, scrollX, deltaY, scrollY, isTouchEvent); return returnValue; } diff --git a/library/src/com/handmark/pulltorefresh/library/PullToRefreshHorizontalScrollView.java b/library/src/com/handmark/pulltorefresh/library/PullToRefreshHorizontalScrollView.java index bf0c00478..74a1b0f44 100644 --- a/library/src/com/handmark/pulltorefresh/library/PullToRefreshHorizontalScrollView.java +++ b/library/src/com/handmark/pulltorefresh/library/PullToRefreshHorizontalScrollView.java @@ -17,6 +17,8 @@ import android.annotation.TargetApi; import android.content.Context; +import android.os.Build.VERSION; +import android.os.Build.VERSION_CODES; import android.util.AttributeSet; import android.view.View; import android.widget.HorizontalScrollView; @@ -27,27 +29,25 @@ public PullToRefreshHorizontalScrollView(Context context, AttributeSet attrs) { super(context, attrs); } + @Override + final int getPullToRefreshScrollDirection() { + return HORIZONTAL_SCROLL; + } + @Override protected HorizontalScrollView createRefreshableView(Context context, AttributeSet attrs) { HorizontalScrollView scrollView; - // FIXME Need to fix Overscroll for Horizontal - - // if (VERSION.SDK_INT >= VERSION_CODES.GINGERBREAD) { - // scrollView = new InternalHorizontalScrollViewSDK9(context, attrs); - // } else { - scrollView = new HorizontalScrollView(context, attrs); - // } + if (VERSION.SDK_INT >= VERSION_CODES.GINGERBREAD) { + scrollView = new InternalHorizontalScrollViewSDK9(context, attrs); + } else { + scrollView = new HorizontalScrollView(context, attrs); + } scrollView.setId(R.id.scrollview); return scrollView; } - @Override - protected int getPullToRefreshScrollDirection() { - return HORIZONTAL_SCROLL; - } - @Override protected boolean isReadyForPullStart() { return mRefreshableView.getScrollX() == 0; @@ -77,8 +77,8 @@ protected boolean overScrollBy(int deltaX, int deltaY, int scrollX, int scrollY, scrollRangeY, maxOverScrollX, maxOverScrollY, isTouchEvent); // Does all of the hard work... - OverscrollHelper.overScrollBy(PullToRefreshHorizontalScrollView.this, deltaY, scrollY, getScrollRange(), - isTouchEvent); + OverscrollHelper.overScrollBy(PullToRefreshHorizontalScrollView.this, deltaX, scrollX, deltaY, scrollY, + getScrollRange(), isTouchEvent); return returnValue; } diff --git a/library/src/com/handmark/pulltorefresh/library/PullToRefreshListView.java b/library/src/com/handmark/pulltorefresh/library/PullToRefreshListView.java index f3ec0178f..da521d320 100644 --- a/library/src/com/handmark/pulltorefresh/library/PullToRefreshListView.java +++ b/library/src/com/handmark/pulltorefresh/library/PullToRefreshListView.java @@ -119,6 +119,11 @@ public void setReleaseLabel(CharSequence releaseLabel, Mode mode) { } } + @Override + final int getPullToRefreshScrollDirection() { + return VERTICAL_SCROLL; + } + @Override void onRefreshing(final boolean doScroll) { @@ -268,11 +273,6 @@ protected ListView createRefreshableView(Context context, AttributeSet attrs) { lv.setId(android.R.id.list); return lv; } - - @Override - protected int getPullToRefreshScrollDirection() { - return VERTICAL_SCROLL; - } @TargetApi(9) final class InternalListViewSDK9 extends InternalListView { @@ -289,7 +289,7 @@ protected boolean overScrollBy(int deltaX, int deltaY, int scrollX, int scrollY, scrollRangeY, maxOverScrollX, maxOverScrollY, isTouchEvent); // Does all of the hard work... - OverscrollHelper.overScrollBy(PullToRefreshListView.this, deltaY, scrollY, isTouchEvent); + OverscrollHelper.overScrollBy(PullToRefreshListView.this, deltaX, scrollX, deltaY, scrollY, isTouchEvent); return returnValue; } diff --git a/library/src/com/handmark/pulltorefresh/library/PullToRefreshScrollView.java b/library/src/com/handmark/pulltorefresh/library/PullToRefreshScrollView.java index caab27a29..bb170be01 100644 --- a/library/src/com/handmark/pulltorefresh/library/PullToRefreshScrollView.java +++ b/library/src/com/handmark/pulltorefresh/library/PullToRefreshScrollView.java @@ -29,6 +29,11 @@ public PullToRefreshScrollView(Context context, AttributeSet attrs) { super(context, attrs); } + @Override + final int getPullToRefreshScrollDirection() { + return VERTICAL_SCROLL; + } + @Override protected ScrollView createRefreshableView(Context context, AttributeSet attrs) { ScrollView scrollView; @@ -41,11 +46,6 @@ protected ScrollView createRefreshableView(Context context, AttributeSet attrs) scrollView.setId(R.id.scrollview); return scrollView; } - - @Override - protected int getPullToRefreshScrollDirection() { - return VERTICAL_SCROLL; - } @Override protected boolean isReadyForPullStart() { @@ -76,8 +76,8 @@ protected boolean overScrollBy(int deltaX, int deltaY, int scrollX, int scrollY, scrollRangeY, maxOverScrollX, maxOverScrollY, isTouchEvent); // Does all of the hard work... - OverscrollHelper - .overScrollBy(PullToRefreshScrollView.this, deltaY, scrollY, getScrollRange(), isTouchEvent); + OverscrollHelper.overScrollBy(PullToRefreshScrollView.this, deltaX, scrollX, deltaY, scrollY, + getScrollRange(), isTouchEvent); return returnValue; } diff --git a/library/src/com/handmark/pulltorefresh/library/PullToRefreshWebView.java b/library/src/com/handmark/pulltorefresh/library/PullToRefreshWebView.java index 730077008..839e5fa04 100644 --- a/library/src/com/handmark/pulltorefresh/library/PullToRefreshWebView.java +++ b/library/src/com/handmark/pulltorefresh/library/PullToRefreshWebView.java @@ -76,6 +76,11 @@ public PullToRefreshWebView(Context context, Mode mode) { setOnRefreshListener(defaultOnRefreshListener); mRefreshableView.setWebChromeClient(defaultWebChromeClient); } + + @Override + final int getPullToRefreshScrollDirection() { + return VERTICAL_SCROLL; + } @Override protected WebView createRefreshableView(Context context, AttributeSet attrs) { @@ -90,11 +95,6 @@ protected WebView createRefreshableView(Context context, AttributeSet attrs) { return webView; } - @Override - protected int getPullToRefreshScrollDirection() { - return VERTICAL_SCROLL; - } - @Override protected boolean isReadyForPullStart() { return mRefreshableView.getScrollY() == 0; @@ -141,8 +141,8 @@ protected boolean overScrollBy(int deltaX, int deltaY, int scrollX, int scrollY, scrollRangeY, maxOverScrollX, maxOverScrollY, isTouchEvent); // Does all of the hard work... - OverscrollHelper.overScrollBy(PullToRefreshWebView.this, deltaY, scrollY, getScrollRange(), - OVERSCROLL_FUZZY_THRESHOLD, OVERSCROLL_SCALE_FACTOR, isTouchEvent); + OverscrollHelper.overScrollBy(PullToRefreshWebView.this, deltaX, scrollX, deltaY, scrollY, + getScrollRange(), OVERSCROLL_FUZZY_THRESHOLD, OVERSCROLL_SCALE_FACTOR, isTouchEvent); return returnValue; } From 1b25d3395eef32410139b99be08ac62a11188140 Mon Sep 17 00:00:00 2001 From: Chris Banes Date: Thu, 29 Nov 2012 17:01:40 +0000 Subject: [PATCH 021/120] Fix Imports --- .../com/handmark/pulltorefresh/samples/LauncherActivity.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/sample/src/com/handmark/pulltorefresh/samples/LauncherActivity.java b/sample/src/com/handmark/pulltorefresh/samples/LauncherActivity.java index 0e9dc3dd7..c030809e6 100644 --- a/sample/src/com/handmark/pulltorefresh/samples/LauncherActivity.java +++ b/sample/src/com/handmark/pulltorefresh/samples/LauncherActivity.java @@ -15,8 +15,6 @@ *******************************************************************************/ package com.handmark.pulltorefresh.samples; -import com.handmark.pulltorefresh.library.PullToRefreshHorizontalScrollView; - import android.app.ListActivity; import android.content.Intent; import android.os.Bundle; From cfd61edea75a8ad52e15b654d394a0754ca33a67 Mon Sep 17 00:00:00 2001 From: Chris Banes Date: Thu, 29 Nov 2012 17:14:25 +0000 Subject: [PATCH 022/120] Make getPullToRefreshScrollDirection() public so it can be used in the extras packages --- .../com/handmark/pulltorefresh/library/PullToRefreshBase.java | 2 +- .../pulltorefresh/library/PullToRefreshExpandableListView.java | 2 +- .../handmark/pulltorefresh/library/PullToRefreshGridView.java | 2 +- .../library/PullToRefreshHorizontalScrollView.java | 2 +- .../handmark/pulltorefresh/library/PullToRefreshListView.java | 2 +- .../handmark/pulltorefresh/library/PullToRefreshScrollView.java | 2 +- .../handmark/pulltorefresh/library/PullToRefreshWebView.java | 2 +- 7 files changed, 7 insertions(+), 7 deletions(-) diff --git a/library/src/com/handmark/pulltorefresh/library/PullToRefreshBase.java b/library/src/com/handmark/pulltorefresh/library/PullToRefreshBase.java index 7ec10b890..36d2de453 100644 --- a/library/src/com/handmark/pulltorefresh/library/PullToRefreshBase.java +++ b/library/src/com/handmark/pulltorefresh/library/PullToRefreshBase.java @@ -523,7 +523,7 @@ public final void setShowViewWhileRefreshing(boolean showView) { * @return Either {@link #VERTICAL_SCROLL} or {@link #HORIZONTAL_SCROLL} * depending on the scroll direction. */ - abstract int getPullToRefreshScrollDirection(); + public abstract int getPullToRefreshScrollDirection(); /** * Called when the UI has been to be updated to be in the diff --git a/library/src/com/handmark/pulltorefresh/library/PullToRefreshExpandableListView.java b/library/src/com/handmark/pulltorefresh/library/PullToRefreshExpandableListView.java index e098a2576..7606ab74a 100644 --- a/library/src/com/handmark/pulltorefresh/library/PullToRefreshExpandableListView.java +++ b/library/src/com/handmark/pulltorefresh/library/PullToRefreshExpandableListView.java @@ -46,7 +46,7 @@ public ContextMenuInfo getContextMenuInfo() { } @Override - final int getPullToRefreshScrollDirection() { + public final int getPullToRefreshScrollDirection() { return VERTICAL_SCROLL; } diff --git a/library/src/com/handmark/pulltorefresh/library/PullToRefreshGridView.java b/library/src/com/handmark/pulltorefresh/library/PullToRefreshGridView.java index 06b4bb563..6aceb0fbb 100644 --- a/library/src/com/handmark/pulltorefresh/library/PullToRefreshGridView.java +++ b/library/src/com/handmark/pulltorefresh/library/PullToRefreshGridView.java @@ -46,7 +46,7 @@ public ContextMenuInfo getContextMenuInfo() { } @Override - final int getPullToRefreshScrollDirection() { + public final int getPullToRefreshScrollDirection() { return VERTICAL_SCROLL; } diff --git a/library/src/com/handmark/pulltorefresh/library/PullToRefreshHorizontalScrollView.java b/library/src/com/handmark/pulltorefresh/library/PullToRefreshHorizontalScrollView.java index 74a1b0f44..9a0e945ba 100644 --- a/library/src/com/handmark/pulltorefresh/library/PullToRefreshHorizontalScrollView.java +++ b/library/src/com/handmark/pulltorefresh/library/PullToRefreshHorizontalScrollView.java @@ -30,7 +30,7 @@ public PullToRefreshHorizontalScrollView(Context context, AttributeSet attrs) { } @Override - final int getPullToRefreshScrollDirection() { + public final int getPullToRefreshScrollDirection() { return HORIZONTAL_SCROLL; } diff --git a/library/src/com/handmark/pulltorefresh/library/PullToRefreshListView.java b/library/src/com/handmark/pulltorefresh/library/PullToRefreshListView.java index da521d320..db7a298c1 100644 --- a/library/src/com/handmark/pulltorefresh/library/PullToRefreshListView.java +++ b/library/src/com/handmark/pulltorefresh/library/PullToRefreshListView.java @@ -120,7 +120,7 @@ public void setReleaseLabel(CharSequence releaseLabel, Mode mode) { } @Override - final int getPullToRefreshScrollDirection() { + public final int getPullToRefreshScrollDirection() { return VERTICAL_SCROLL; } diff --git a/library/src/com/handmark/pulltorefresh/library/PullToRefreshScrollView.java b/library/src/com/handmark/pulltorefresh/library/PullToRefreshScrollView.java index bb170be01..c5f0e0100 100644 --- a/library/src/com/handmark/pulltorefresh/library/PullToRefreshScrollView.java +++ b/library/src/com/handmark/pulltorefresh/library/PullToRefreshScrollView.java @@ -30,7 +30,7 @@ public PullToRefreshScrollView(Context context, AttributeSet attrs) { } @Override - final int getPullToRefreshScrollDirection() { + public final int getPullToRefreshScrollDirection() { return VERTICAL_SCROLL; } diff --git a/library/src/com/handmark/pulltorefresh/library/PullToRefreshWebView.java b/library/src/com/handmark/pulltorefresh/library/PullToRefreshWebView.java index 839e5fa04..175126018 100644 --- a/library/src/com/handmark/pulltorefresh/library/PullToRefreshWebView.java +++ b/library/src/com/handmark/pulltorefresh/library/PullToRefreshWebView.java @@ -78,7 +78,7 @@ public PullToRefreshWebView(Context context, Mode mode) { } @Override - final int getPullToRefreshScrollDirection() { + public final int getPullToRefreshScrollDirection() { return VERTICAL_SCROLL; } From b361fb7299ea4cd4ae649cc1f4fe5dd6fedebe8a Mon Sep 17 00:00:00 2001 From: Chris Banes Date: Thu, 29 Nov 2012 17:22:11 +0000 Subject: [PATCH 023/120] Make OverscrollHelper public so it can be used in the extras packages --- .../handmark/pulltorefresh/library/OverscrollHelper.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/library/src/com/handmark/pulltorefresh/library/OverscrollHelper.java b/library/src/com/handmark/pulltorefresh/library/OverscrollHelper.java index d329832c8..07860ccc8 100644 --- a/library/src/com/handmark/pulltorefresh/library/OverscrollHelper.java +++ b/library/src/com/handmark/pulltorefresh/library/OverscrollHelper.java @@ -22,7 +22,7 @@ import com.handmark.pulltorefresh.library.PullToRefreshBase.Mode; @TargetApi(9) -final class OverscrollHelper { +public final class OverscrollHelper { static final String LOG_TAG = "OverscrollHelper"; static final float DEFAULT_OVERSCROLL_SCALE = 1f; @@ -53,7 +53,7 @@ final class OverscrollHelper { * - true if this scroll operation is the result of a touch * event, passed through from from overScrollBy call */ - static void overScrollBy(final PullToRefreshBase view, final int deltaX, final int scrollX, final int deltaY, + public static void overScrollBy(final PullToRefreshBase view, final int deltaX, final int scrollX, final int deltaY, final int scrollY, final boolean isTouchEvent) { overScrollBy(view, deltaX, scrollX, deltaY, scrollY, 0, isTouchEvent); } @@ -83,7 +83,7 @@ static void overScrollBy(final PullToRefreshBase view, final int deltaX, fina * - true if this scroll operation is the result of a touch * event, passed through from from overScrollBy call */ - static void overScrollBy(final PullToRefreshBase view, final int deltaX, final int scrollX, final int deltaY, + public static void overScrollBy(final PullToRefreshBase view, final int deltaX, final int scrollX, final int deltaY, final int scrollY, final int scrollRange, final boolean isTouchEvent) { overScrollBy(view, deltaX, scrollX, deltaY, scrollY, scrollRange, 0, DEFAULT_OVERSCROLL_SCALE, isTouchEvent); } @@ -118,7 +118,7 @@ static void overScrollBy(final PullToRefreshBase view, final int deltaX, fina * - true if this scroll operation is the result of a touch * event, passed through from from overScrollBy call */ - static void overScrollBy(final PullToRefreshBase view, final int deltaX, final int scrollX, final int deltaY, + public static void overScrollBy(final PullToRefreshBase view, final int deltaX, final int scrollX, final int deltaY, final int scrollY, final int scrollRange, final int fuzzyThreshold, final float scaleFactor, final boolean isTouchEvent) { From 368877bbfc8e48ec22a2b4d702507570300f75c2 Mon Sep 17 00:00:00 2001 From: Chris Banes Date: Thu, 29 Nov 2012 17:31:59 +0000 Subject: [PATCH 024/120] New PullToRefreshViewPager Extra, with Sample --- .../AndroidManifest.xml | 11 ++ extras/PullToRefreshViewPager/ant.properties | 17 +++ .../libs/android-support-v4.jar | Bin 0 -> 349252 bytes extras/PullToRefreshViewPager/pom.xml | 46 ++++++++ .../proguard-project.txt | 20 ++++ .../PullToRefreshViewPager/project.properties | 16 +++ .../res/layout/need_this_for_maven.xml | 9 ++ .../PullToRefreshViewPager/res/values/ids.xml | 6 + .../viewpager/PullToRefreshViewPager.java | 70 ++++++++++++ extras/pom.xml | 1 + sample/AndroidManifest.xml | 4 + sample/project.properties | 1 + sample/res/drawable-nodpi/wallpaper.jpg | Bin 0 -> 94597 bytes .../samples/LauncherActivity.java | 7 +- .../PullToRefreshViewPagerActivity.java | 105 ++++++++++++++++++ 15 files changed, 311 insertions(+), 2 deletions(-) create mode 100644 extras/PullToRefreshViewPager/AndroidManifest.xml create mode 100644 extras/PullToRefreshViewPager/ant.properties create mode 100644 extras/PullToRefreshViewPager/libs/android-support-v4.jar create mode 100644 extras/PullToRefreshViewPager/pom.xml create mode 100644 extras/PullToRefreshViewPager/proguard-project.txt create mode 100644 extras/PullToRefreshViewPager/project.properties create mode 100644 extras/PullToRefreshViewPager/res/layout/need_this_for_maven.xml create mode 100644 extras/PullToRefreshViewPager/res/values/ids.xml create mode 100644 extras/PullToRefreshViewPager/src/com/handmark/pulltorefresh/extras/viewpager/PullToRefreshViewPager.java create mode 100644 sample/res/drawable-nodpi/wallpaper.jpg create mode 100644 sample/src/com/handmark/pulltorefresh/samples/PullToRefreshViewPagerActivity.java diff --git a/extras/PullToRefreshViewPager/AndroidManifest.xml b/extras/PullToRefreshViewPager/AndroidManifest.xml new file mode 100644 index 000000000..028e2fcfc --- /dev/null +++ b/extras/PullToRefreshViewPager/AndroidManifest.xml @@ -0,0 +1,11 @@ + + + + + + + + \ No newline at end of file diff --git a/extras/PullToRefreshViewPager/ant.properties b/extras/PullToRefreshViewPager/ant.properties new file mode 100644 index 000000000..b0971e891 --- /dev/null +++ b/extras/PullToRefreshViewPager/ant.properties @@ -0,0 +1,17 @@ +# This file is used to override default values used by the Ant build system. +# +# This file must be checked into Version Control Systems, as it is +# integral to the build system of your project. + +# This file is only used by the Ant script. + +# You can use this to override default values such as +# 'source.dir' for the location of your java source folder and +# 'out.dir' for the location of your output folder. + +# You can also use it define how the release builds are signed by declaring +# the following properties: +# 'key.store' for the location of your keystore and +# 'key.alias' for the name of the key to use. +# The password will be asked during the build when you use the 'release' target. + diff --git a/extras/PullToRefreshViewPager/libs/android-support-v4.jar b/extras/PullToRefreshViewPager/libs/android-support-v4.jar new file mode 100644 index 0000000000000000000000000000000000000000..feaf44f8018aba0e3e4f5f8e7115101dcb4d00ef GIT binary patch literal 349252 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 vQtTtaF%{4o|h}R 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�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 literal 0 HcmV?d00001 diff --git a/sample/src/com/handmark/pulltorefresh/samples/LauncherActivity.java b/sample/src/com/handmark/pulltorefresh/samples/LauncherActivity.java index c030809e6..5d9730ce2 100644 --- a/sample/src/com/handmark/pulltorefresh/samples/LauncherActivity.java +++ b/sample/src/com/handmark/pulltorefresh/samples/LauncherActivity.java @@ -25,7 +25,7 @@ public class LauncherActivity extends ListActivity { public static final String[] options = { "ListView", "ExpandableListView", "GridView", "WebView", "ScrollView", - "Horizontal ScrollView", "ListView Fragment", "WebView Advanced" }; + "Horizontal ScrollView", "ViewPager", "ListView Fragment", "WebView Advanced" }; @Override protected void onCreate(Bundle savedInstanceState) { @@ -58,9 +58,12 @@ protected void onListItemClick(ListView l, View v, int position, long id) { intent = new Intent(this, PullToRefreshHorizontalScrollViewActivity.class); break; case 6: - intent = new Intent(this, PullToRefreshListFragmentActivity.class); + intent = new Intent(this, PullToRefreshViewPagerActivity.class); break; case 7: + intent = new Intent(this, PullToRefreshListFragmentActivity.class); + break; + case 8: intent = new Intent(this, PullToRefreshWebView2Activity.class); break; } diff --git a/sample/src/com/handmark/pulltorefresh/samples/PullToRefreshViewPagerActivity.java b/sample/src/com/handmark/pulltorefresh/samples/PullToRefreshViewPagerActivity.java new file mode 100644 index 000000000..ccdedc78b --- /dev/null +++ b/sample/src/com/handmark/pulltorefresh/samples/PullToRefreshViewPagerActivity.java @@ -0,0 +1,105 @@ +/******************************************************************************* + * 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.samples; + +import android.app.Activity; +import android.os.AsyncTask; +import android.os.Bundle; +import android.support.v4.view.PagerAdapter; +import android.support.v4.view.ViewPager; +import android.view.View; +import android.view.ViewGroup; +import android.view.ViewGroup.LayoutParams; +import android.widget.ImageView; + +import com.handmark.pulltorefresh.extras.viewpager.PullToRefreshViewPager; +import com.handmark.pulltorefresh.library.PullToRefreshBase; +import com.handmark.pulltorefresh.library.PullToRefreshBase.OnRefreshListener; + +public class PullToRefreshViewPagerActivity extends Activity implements OnRefreshListener { + + private PullToRefreshViewPager mPullToRefreshViewPager; + + @Override + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + + mPullToRefreshViewPager = new PullToRefreshViewPager(this); + setContentView(mPullToRefreshViewPager); + + mPullToRefreshViewPager.setOnRefreshListener(this); + + ViewPager vp = mPullToRefreshViewPager.getRefreshableView(); + vp.setAdapter(new SamplePagerAdapter()); + } + + @Override + public void onRefresh(PullToRefreshBase refreshView) { + new GetDataTask().execute(); + } + + static class SamplePagerAdapter extends PagerAdapter { + + private static int[] sDrawables = { R.drawable.wallpaper, R.drawable.wallpaper, R.drawable.wallpaper, + R.drawable.wallpaper, R.drawable.wallpaper, R.drawable.wallpaper }; + + @Override + public int getCount() { + return sDrawables.length; + } + + @Override + public View instantiateItem(ViewGroup container, int position) { + ImageView imageView = new ImageView(container.getContext()); + imageView.setImageResource(sDrawables[position]); + + // Now just add ImageView to ViewPager and return it + container.addView(imageView, LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT); + + return imageView; + } + + @Override + public void destroyItem(ViewGroup container, int position, Object object) { + container.removeView((View) object); + } + + @Override + public boolean isViewFromObject(View view, Object object) { + return view == object; + } + } + + private class GetDataTask extends AsyncTask { + + @Override + protected Void doInBackground(Void... params) { + // Simulates a background job. + try { + Thread.sleep(4000); + } catch (InterruptedException e) { + } + return null; + } + + @Override + protected void onPostExecute(Void result) { + mPullToRefreshViewPager.onRefreshComplete(); + super.onPostExecute(result); + } + } + +} From 01d82c51eb0dce97e77b75fb300a7cfccf65a27d Mon Sep 17 00:00:00 2001 From: Chris Banes Date: Thu, 29 Nov 2012 17:51:26 +0000 Subject: [PATCH 025/120] Style Improvements for Horizontal Pulling --- .../drawable-hdpi/default_ptr_flip_left.png | Bin 0 -> 2339 bytes .../drawable-hdpi/default_ptr_flip_right.png | Bin 0 -> 1699 bytes .../library/internal/FlipLoadingLayout.java | 21 ++++++++++++++---- .../library/internal/LoadingLayout.java | 8 +++---- .../library/internal/RotateLoadingLayout.java | 4 ++-- 5 files changed, 23 insertions(+), 10 deletions(-) create mode 100644 library/res/drawable-hdpi/default_ptr_flip_left.png create mode 100644 library/res/drawable-hdpi/default_ptr_flip_right.png diff --git a/library/res/drawable-hdpi/default_ptr_flip_left.png b/library/res/drawable-hdpi/default_ptr_flip_left.png new file mode 100644 index 0000000000000000000000000000000000000000..bd354ddc94cdb86d46fca6591de98312f99429b3 GIT binary patch literal 2339 zcmah~3p|ti8{f!W3MY4yT5~I%Z8mawHyg*~e!oOv4a2aFnOUusN~iEIN%j9H@vjJV zT#87@rLai3l_5-_3*sD?6mqueRR7NZ^Z&o^`@HY(ectE!KF{-gexK(}c6YUtmxIcI zKp=Ssd!nc4Ne~HC1|qtH@JYKspf$Qw8yj~A8ylEAlMzOZrhq`^>yP>jGX}g>@W~9% zTr~pB&+b@CQ;Cn)?kX*4Q8UCLBX7!4E$_9!PXTHo z$8DB}1atcq>dPIxju~Eau;;$Iuee!%O3G)XnjLK5bw6PKLz~60#Y^nVpaG&KiFzwj z)93iP>%|uz>z>WXS38sKlG0Vy<0RR0{k1D1y{%md*`WIF(Zq;$icH&7`rD7L3p#cC zQlE7u!`QqtmrhE`FI4C7F&s4RYYEhpPLLk;?HJ@f<3{Ja-o(H7I_ACc;Yww>>WS07i{*llSLp?OFRG9%Y;fdVJ5S1t z^&L+dY%AM!{-K0UT4-H<`)HzcBB8vfra-E_3otXjtoDb~&M10up>=<8roYG970h{T zP#S+Lt@>=^nN4j9ci5LS+teJJJ74P`EDGBfzP?`|Rh_Nge=29NYmx=g*ef8^0H|@u zhJnBy&)|wH^>(j_L>*T(MDUYBM{KTpHs;Lz+8w4iJq$nT=)E>F8t&Gm6g{}tBJD*> z(m!sh*CH-^m9}9S9Al<-c3hJSyWHg=I9ByB_y))U`k-blc=2S241eM+)?$hGs`v0 zH*s2}DpjP78Tq5NGn29l?dw*wYc*JMWsxqoxQO4^XqYJKK`ugio4uQouCvtq2XZp5 zdYbZ^1#>$2?0~GXb157kJH^00c{)XiOTGn#h^v~(yNm5A2XDV06<9l*;$Wo z{QM#i>uWnF$GXtb9(VvUtZ>=kI{T?yp^*BRIS1XYCuNr44~pePYi&~& zO%2%?d;d5PXswc1z+Hm}mO&tii&SqvmY<6=5W=7#$)Sv33X(&M5f2#{>cImt;K2-9QMhC6=ezcb8&~+FqjnBb|e~!f#c<1Fc^**8U}b0cYJXd zy;;H|SgaTTg-S?BKqeR?8O(4L+QPyDWrRUtFbI(aB5p68Mdl#raXOzt{=y+r;zF3z z7#5X5hlz2?!Hjs8B^)je^!50XCoSe{AbQ-FszmjnIOG@<8fk?3iY#)(iE0FFm=rRL zLKF!eV}wQ{L>FeeHyQ(A&;Z65hx)?WUjIzq9$`jYEmK`HrhkjS!dl zgZ}?<$fAaQ>(+meDE{(y7R6e?jY*}5x+m@t9*sl&P4_>O{G7UIyWr(S)%~^g@N(SW z2%_I0c-ety?d>N!=8vT}TK#mQy@j2AT<4V5sh;%4^+JfXiblk9eVTC1RpCz0++$hw z&p>ZXHkYNkW=#mqbt^ZwK_0lYqX{CF^rGbN@tH!fMbOHD)gx=QPBbHeqGt{dCADg#wUm@M444Lmy?w`B%T8qr zvLkF%f?&>X_PhY%OrV4BE6nUAcWzw3g(^%GyEjdvb3!&II6HT<0(t}6Hl8uP26{dxi4S ze5qx*#K_|d0iaa4GHJ$YRx`EV?NGNx@`;+^!rv#~+9uze%qAWV_gG3LAn@Qt;sa*> SamOI>SaPs+B^Lj(=kTAdSLiSR literal 0 HcmV?d00001 diff --git a/library/res/drawable-hdpi/default_ptr_flip_right.png b/library/res/drawable-hdpi/default_ptr_flip_right.png new file mode 100644 index 0000000000000000000000000000000000000000..40061e28ea15d4789e27b58d77cb193a44c6e83d GIT binary patch literal 1699 zcmV;U23+}xP)4Tx05}naRo`#hR1`jmZ&IWdKOk5~hl<6oRa0BJ8yc;~21%2p?MfD<>DVeH z9(p*dx19w`~g7O0}n_%Aq@s%d)fBDv`JHkDym6Hd+5XuAtvnwRpGmK zVkc9?T=n|PIo~X-eVh__(Z?q}P9Z-Dj?gOW6|D%o20XmjW-qs4UjrD(li^iv8@eK9k+ZFm zVRFymFOPAzG5-%Pn|1W;U4vNroTa&AxDScmEA~{ri9gr1^c?U@uwSpaNnw8l_>cP1 zd;)kMQS_;jeRSUEM_*s96y65j1$)tOrwdK{YIQMt92l|D^(E_=$Rjw{b!QT@q!)ni zR`|5oW9X5n$Wv+HVc@|^eX5yXnsHX8PF3UX~a6)MwxDE0HaPjyrlI!;jX{6Kvuh*8ej?;85ekN$?5uuCiS zBTvvVG+XTxAO{m@bvM#Jr)z6J><&E22D|vq?Y?Vkbo_DijopiF$2PET#mZ8eu=y$(ArYkv7@Ex`GL?QCc!_*KFrd&;n1r7 zqW-CFs9&fT)ZaU5gc&=gBz-DaCw(vdOp0__x+47~U6sC(E(JNe@4cTT*n6*E zVH4eoU1-&7pEV~_PRe`a7v+@vy!^5}8?Y3)UmlaER00009a7bBm000XU000XU0RWnu7ytkQB}qgQz_}Pw5MhzjR;yKiyNnTW;Aw>9g(xVZN|HM} tBJ%_4Cp!qdFvL3n{*G`P7(y1O@(;V^+O)IH Date: Thu, 29 Nov 2012 17:56:32 +0000 Subject: [PATCH 026/120] Rename onPullImpl method --- .../handmark/pulltorefresh/library/PullToRefreshBase.java | 4 ++-- .../pulltorefresh/library/internal/FlipLoadingLayout.java | 2 +- .../pulltorefresh/library/internal/LoadingLayout.java | 6 +++--- .../pulltorefresh/library/internal/RotateLoadingLayout.java | 4 ++-- 4 files changed, 8 insertions(+), 8 deletions(-) diff --git a/library/src/com/handmark/pulltorefresh/library/PullToRefreshBase.java b/library/src/com/handmark/pulltorefresh/library/PullToRefreshBase.java index 36d2de453..5289f7792 100644 --- a/library/src/com/handmark/pulltorefresh/library/PullToRefreshBase.java +++ b/library/src/com/handmark/pulltorefresh/library/PullToRefreshBase.java @@ -1027,10 +1027,10 @@ private void pullEvent() { float scale = Math.abs(newScrollValue) / (float) itemDimension; switch (mCurrentMode) { case PULL_FROM_END: - mFooterLayout.onPullY(scale); + mFooterLayout.onPull(scale); break; case PULL_FROM_START: - mHeaderLayout.onPullY(scale); + mHeaderLayout.onPull(scale); break; } diff --git a/library/src/com/handmark/pulltorefresh/library/internal/FlipLoadingLayout.java b/library/src/com/handmark/pulltorefresh/library/internal/FlipLoadingLayout.java index 7fe282e95..ff6bb18aa 100644 --- a/library/src/com/handmark/pulltorefresh/library/internal/FlipLoadingLayout.java +++ b/library/src/com/handmark/pulltorefresh/library/internal/FlipLoadingLayout.java @@ -66,7 +66,7 @@ protected void onLoadingDrawableSet(Drawable imageDrawable) { } @Override - protected void onPullYImpl(float scaleOfHeight) { + protected void onPullImpl(float scaleOfLayout) { // NO-OP } diff --git a/library/src/com/handmark/pulltorefresh/library/internal/LoadingLayout.java b/library/src/com/handmark/pulltorefresh/library/internal/LoadingLayout.java index 0d90cd2b9..2917b2567 100644 --- a/library/src/com/handmark/pulltorefresh/library/internal/LoadingLayout.java +++ b/library/src/com/handmark/pulltorefresh/library/internal/LoadingLayout.java @@ -159,9 +159,9 @@ public LoadingLayout(Context context, final Mode mode, final int scrollDirection reset(); } - public final void onPullY(float scaleOfHeight) { + public final void onPull(float scaleOfLayout) { if (!mUseIntrinisicAnimation) { - onPullYImpl(scaleOfHeight); + onPullImpl(scaleOfLayout); } } @@ -314,7 +314,7 @@ public void setTextColor(int color) { protected abstract void onLoadingDrawableSet(Drawable imageDrawable); - protected abstract void onPullYImpl(float scaleOfHeight); + protected abstract void onPullImpl(float scaleOfLayout); protected abstract void pullToRefreshImpl(); diff --git a/library/src/com/handmark/pulltorefresh/library/internal/RotateLoadingLayout.java b/library/src/com/handmark/pulltorefresh/library/internal/RotateLoadingLayout.java index 5c04b1d4b..9730baad9 100644 --- a/library/src/com/handmark/pulltorefresh/library/internal/RotateLoadingLayout.java +++ b/library/src/com/handmark/pulltorefresh/library/internal/RotateLoadingLayout.java @@ -57,8 +57,8 @@ public void onLoadingDrawableSet(Drawable imageDrawable) { } } - protected void onPullYImpl(float scaleOfHeight) { - mHeaderImageMatrix.setRotate(scaleOfHeight * 90, mRotationPivotX, mRotationPivotY); + protected void onPullImpl(float scaleOfLayout) { + mHeaderImageMatrix.setRotate(scaleOfLayout * 90, mRotationPivotX, mRotationPivotY); mHeaderImage.setImageMatrix(mHeaderImageMatrix); } From ea5b153bcf3f06f595b3754bdd7208e8be61563a Mon Sep 17 00:00:00 2001 From: Chris Banes Date: Fri, 30 Nov 2012 09:38:11 +0000 Subject: [PATCH 027/120] Always reset the LoadingLayouts --- .../pulltorefresh/library/PullToRefreshBase.java | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/library/src/com/handmark/pulltorefresh/library/PullToRefreshBase.java b/library/src/com/handmark/pulltorefresh/library/PullToRefreshBase.java index 5289f7792..29b3fe977 100644 --- a/library/src/com/handmark/pulltorefresh/library/PullToRefreshBase.java +++ b/library/src/com/handmark/pulltorefresh/library/PullToRefreshBase.java @@ -518,7 +518,7 @@ public void setScrollAnimationInterpolator(Interpolator interpolator) { public final void setShowViewWhileRefreshing(boolean showView) { mShowViewWhileRefreshing = showView; } - + /** * @return Either {@link #VERTICAL_SCROLL} or {@link #HORIZONTAL_SCROLL} * depending on the scroll direction. @@ -598,12 +598,9 @@ void onReleaseToRefresh() { void onReset() { mIsBeingDragged = false; - if (mMode.showHeaderLoadingLayout()) { - mHeaderLayout.reset(); - } - if (mMode.showFooterLoadingLayout()) { - mFooterLayout.reset(); - } + // Always reset both layouts, just in case... + mHeaderLayout.reset(); + mFooterLayout.reset(); smoothScrollTo(0); From 1f50c9b902a98a894e4ad072128ee27d60a92ee8 Mon Sep 17 00:00:00 2001 From: Chris Banes Date: Fri, 30 Nov 2012 09:40:55 +0000 Subject: [PATCH 028/120] Tweak Horizontal Loading Layouts --- library/res/layout/pull_to_refresh_header_horizontal.xml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/library/res/layout/pull_to_refresh_header_horizontal.xml b/library/res/layout/pull_to_refresh_header_horizontal.xml index da1006d7d..818ed229a 100644 --- a/library/res/layout/pull_to_refresh_header_horizontal.xml +++ b/library/res/layout/pull_to_refresh_header_horizontal.xml @@ -3,8 +3,7 @@ + android:layout_height="wrap_content"> Date: Fri, 30 Nov 2012 09:47:22 +0000 Subject: [PATCH 029/120] Update Ptr Sample so that it's clearer --- sample/res/layout/activity_ptr_viewpager.xml | 18 ++++++++++++++++++ .../PullToRefreshViewPagerActivity.java | 7 +++---- 2 files changed, 21 insertions(+), 4 deletions(-) create mode 100755 sample/res/layout/activity_ptr_viewpager.xml diff --git a/sample/res/layout/activity_ptr_viewpager.xml b/sample/res/layout/activity_ptr_viewpager.xml new file mode 100755 index 000000000..5fbb0e832 --- /dev/null +++ b/sample/res/layout/activity_ptr_viewpager.xml @@ -0,0 +1,18 @@ + + + + + + + + \ No newline at end of file diff --git a/sample/src/com/handmark/pulltorefresh/samples/PullToRefreshViewPagerActivity.java b/sample/src/com/handmark/pulltorefresh/samples/PullToRefreshViewPagerActivity.java index ccdedc78b..df05fddc4 100644 --- a/sample/src/com/handmark/pulltorefresh/samples/PullToRefreshViewPagerActivity.java +++ b/sample/src/com/handmark/pulltorefresh/samples/PullToRefreshViewPagerActivity.java @@ -36,10 +36,9 @@ public class PullToRefreshViewPagerActivity extends Activity implements OnRefres @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); + setContentView(R.layout.activity_ptr_viewpager); - mPullToRefreshViewPager = new PullToRefreshViewPager(this); - setContentView(mPullToRefreshViewPager); - + mPullToRefreshViewPager = (PullToRefreshViewPager) findViewById(R.id.pull_refresh_viewpager); mPullToRefreshViewPager.setOnRefreshListener(this); ViewPager vp = mPullToRefreshViewPager.getRefreshableView(); @@ -82,7 +81,7 @@ public boolean isViewFromObject(View view, Object object) { return view == object; } } - + private class GetDataTask extends AsyncTask { @Override From a2fba341841eb732718ab4e75d36b3ea2d9c6bfd Mon Sep 17 00:00:00 2001 From: Chris Banes Date: Fri, 30 Nov 2012 10:08:35 +0000 Subject: [PATCH 030/120] Move some more attrs to be deprecated, replacing with start/end attrs --- library/res/values/attrs.xml | 12 ++++++--- .../library/PullToRefreshBase.java | 11 +++++++- .../library/internal/LoadingLayout.java | 25 ++++++++++++++++--- .../pulltorefresh/library/internal/Utils.java | 13 ++++++++++ 4 files changed, 53 insertions(+), 8 deletions(-) create mode 100644 library/src/com/handmark/pulltorefresh/library/internal/Utils.java diff --git a/library/res/values/attrs.xml b/library/res/values/attrs.xml index a808c6ead..c98912779 100644 --- a/library/res/values/attrs.xml +++ b/library/res/values/attrs.xml @@ -2,7 +2,7 @@ - + @@ -12,14 +12,15 @@ + - - + + @@ -27,6 +28,11 @@ + + + + + \ No newline at end of file diff --git a/library/src/com/handmark/pulltorefresh/library/PullToRefreshBase.java b/library/src/com/handmark/pulltorefresh/library/PullToRefreshBase.java index 29b3fe977..a16d403c5 100644 --- a/library/src/com/handmark/pulltorefresh/library/PullToRefreshBase.java +++ b/library/src/com/handmark/pulltorefresh/library/PullToRefreshBase.java @@ -38,6 +38,7 @@ import com.handmark.pulltorefresh.library.internal.LoadingLayout; import com.handmark.pulltorefresh.library.internal.RotateLoadingLayout; import com.handmark.pulltorefresh.library.internal.SDK16; +import com.handmark.pulltorefresh.library.internal.Utils; public abstract class PullToRefreshBase extends LinearLayout implements IPullToRefresh { @@ -935,12 +936,20 @@ private void init(Context context, AttributeSet attrs) { setBackgroundDrawable(background); } } - if (a.hasValue(R.styleable.PullToRefresh_ptrAdapterViewBackground)) { + + if (a.hasValue(R.styleable.PullToRefresh_ptrRefreshableViewBackground)) { + Drawable background = a.getDrawable(R.styleable.PullToRefresh_ptrRefreshableViewBackground); + if (null != background) { + mRefreshableView.setBackgroundDrawable(background); + } + } else if (a.hasValue(R.styleable.PullToRefresh_ptrAdapterViewBackground)) { + Utils.warnDeprecation("ptrAdapterViewBackground", "ptrRefreshableViewBackground"); Drawable background = a.getDrawable(R.styleable.PullToRefresh_ptrAdapterViewBackground); if (null != background) { mRefreshableView.setBackgroundDrawable(background); } } + if (a.hasValue(R.styleable.PullToRefresh_ptrOverScroll)) { mOverScrollEnabled = a.getBoolean(R.styleable.PullToRefresh_ptrOverScroll, true); } diff --git a/library/src/com/handmark/pulltorefresh/library/internal/LoadingLayout.java b/library/src/com/handmark/pulltorefresh/library/internal/LoadingLayout.java index 2917b2567..2b0c37931 100644 --- a/library/src/com/handmark/pulltorefresh/library/internal/LoadingLayout.java +++ b/library/src/com/handmark/pulltorefresh/library/internal/LoadingLayout.java @@ -23,6 +23,7 @@ import android.graphics.drawable.AnimationDrawable; import android.graphics.drawable.Drawable; import android.text.TextUtils; +import android.util.Log; import android.util.TypedValue; import android.view.Gravity; import android.view.LayoutInflater; @@ -41,6 +42,8 @@ @SuppressLint("ViewConstructor") public abstract class LoadingLayout extends LinearLayout { + + static final String LOG_TAG = "PullToRefresh-LoadingLayout"; static final Interpolator ANIMATION_INTERPOLATOR = new LinearInterpolator(); @@ -138,10 +141,24 @@ public LoadingLayout(Context context, final Mode mode, final int scrollDirection // Check Specific Drawable from Attrs, these overrite the generic // drawable attr above - if (attrs.hasValue(R.styleable.PullToRefresh_ptrDrawableTop) && mode == Mode.PULL_FROM_START) { - imageDrawable = attrs.getDrawable(R.styleable.PullToRefresh_ptrDrawableTop); - } else if (attrs.hasValue(R.styleable.PullToRefresh_ptrDrawableBottom) && mode == Mode.PULL_FROM_END) { - imageDrawable = attrs.getDrawable(R.styleable.PullToRefresh_ptrDrawableTop); + switch (mode) { + case PULL_FROM_START: + if (attrs.hasValue(R.styleable.PullToRefresh_ptrDrawableStart)) { + imageDrawable = attrs.getDrawable(R.styleable.PullToRefresh_ptrDrawableStart); + } else if (attrs.hasValue(R.styleable.PullToRefresh_ptrDrawableTop)) { + Utils.warnDeprecation("ptrDrawableTop", "ptrDrawableStart"); + imageDrawable = attrs.getDrawable(R.styleable.PullToRefresh_ptrDrawableTop); + } + break; + + case PULL_FROM_END: + if (attrs.hasValue(R.styleable.PullToRefresh_ptrDrawableEnd)) { + imageDrawable = attrs.getDrawable(R.styleable.PullToRefresh_ptrDrawableEnd); + } else if (attrs.hasValue(R.styleable.PullToRefresh_ptrDrawableBottom)) { + Utils.warnDeprecation("ptrDrawableBottom", "ptrDrawableEnd"); + imageDrawable = attrs.getDrawable(R.styleable.PullToRefresh_ptrDrawableBottom); + } + break; } // If we don't have a user defined drawable, load the default diff --git a/library/src/com/handmark/pulltorefresh/library/internal/Utils.java b/library/src/com/handmark/pulltorefresh/library/internal/Utils.java new file mode 100644 index 000000000..734321890 --- /dev/null +++ b/library/src/com/handmark/pulltorefresh/library/internal/Utils.java @@ -0,0 +1,13 @@ +package com.handmark.pulltorefresh.library.internal; + +import android.util.Log; + +public class Utils { + + static final String LOG_TAG = "PullToRefresh"; + + public static void warnDeprecation(String depreacted, String replacement) { + Log.w(LOG_TAG, "You're using the deprecated " + depreacted + " attr, please switch over to " + replacement); + } + +} From 5f9ac754379e15895b1093a9f0b8d08faab00881 Mon Sep 17 00:00:00 2001 From: Chris Banes Date: Fri, 30 Nov 2012 10:10:08 +0000 Subject: [PATCH 031/120] Update Sample layouts to use new attrs --- sample/res/layout/activity_ptr_expandable_list.xml | 12 ++++++------ sample/res/layout/activity_ptr_viewpager.xml | 2 +- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/sample/res/layout/activity_ptr_expandable_list.xml b/sample/res/layout/activity_ptr_expandable_list.xml index 6d6194dc3..4b00c972b 100755 --- a/sample/res/layout/activity_ptr_expandable_list.xml +++ b/sample/res/layout/activity_ptr_expandable_list.xml @@ -1,19 +1,19 @@ + android:layout_height="fill_parent" + android:orientation="vertical" > - + + ptr:ptrMode="pullUpFromBottom" + ptr:ptrRefreshableViewBackground="@android:color/white" /> \ No newline at end of file diff --git a/sample/res/layout/activity_ptr_viewpager.xml b/sample/res/layout/activity_ptr_viewpager.xml index 5fbb0e832..362c58498 100755 --- a/sample/res/layout/activity_ptr_viewpager.xml +++ b/sample/res/layout/activity_ptr_viewpager.xml @@ -10,7 +10,7 @@ android:id="@+id/pull_refresh_viewpager" android:layout_width="fill_parent" android:layout_height="fill_parent" - ptr:ptrAdapterViewBackground="@android:color/black" + ptr:ptrRefreshableViewBackground="@android:color/black" ptr:ptrAnimationStyle="flip" ptr:ptrHeaderBackground="@android:color/darker_gray" ptr:ptrMode="both" /> From a7bd75ab5fce027a7e9577cc018c4be19fc49d4e Mon Sep 17 00:00:00 2001 From: Chris Banes Date: Fri, 30 Nov 2012 10:12:25 +0000 Subject: [PATCH 032/120] Update Readme --- README.md | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 92b2e9f34..1c9891884 100644 --- a/README.md +++ b/README.md @@ -9,7 +9,14 @@ This project aims to provide a reusable Pull to Refresh widget for Android. It w * Supports both Pulling Down from the top, and Pulling Up from the bottom (or even both). * Animated Scrolling for all devices. * Over Scroll supports for devices on Android v2.3+. - * Currently works with **ListView**, **ExpandableListView** & **GridView**, **WebView** and **ScrollView**! + * Currently works with: + * **ListView** + * **ExpandableListView** + * **GridView** + * **WebView** + * **ScrollView** + * **HorizontalScrollView** + * **ViewPager** * Integrated End of List Listener for use of detecting when the user has scrolled to the bottom. * Maven Support. * Indicators to show the user when a Pull-to-Refresh is available. From 73eaa39ce3aa7df3a96e59b5b653144de703c7b9 Mon Sep 17 00:00:00 2001 From: Chris Banes Date: Fri, 30 Nov 2012 10:35:36 +0000 Subject: [PATCH 033/120] Update Manifest versions --- extras/PullToRefreshListFragment/AndroidManifest.xml | 4 ++-- extras/PullToRefreshViewPager/AndroidManifest.xml | 4 ++-- library/AndroidManifest.xml | 4 ++-- sample/AndroidManifest.xml | 4 ++-- 4 files changed, 8 insertions(+), 8 deletions(-) diff --git a/extras/PullToRefreshListFragment/AndroidManifest.xml b/extras/PullToRefreshListFragment/AndroidManifest.xml index 6cc0d8d9c..1d48922f7 100644 --- a/extras/PullToRefreshListFragment/AndroidManifest.xml +++ b/extras/PullToRefreshListFragment/AndroidManifest.xml @@ -1,8 +1,8 @@ + android:versionCode="2000" + android:versionName="2.0" > diff --git a/extras/PullToRefreshViewPager/AndroidManifest.xml b/extras/PullToRefreshViewPager/AndroidManifest.xml index 028e2fcfc..ca02f5815 100644 --- a/extras/PullToRefreshViewPager/AndroidManifest.xml +++ b/extras/PullToRefreshViewPager/AndroidManifest.xml @@ -1,8 +1,8 @@ + android:versionCode="2000" + android:versionName="2.0" > diff --git a/library/AndroidManifest.xml b/library/AndroidManifest.xml index 1eb616171..d9e351a9a 100644 --- a/library/AndroidManifest.xml +++ b/library/AndroidManifest.xml @@ -1,8 +1,8 @@ + android:versionCode="2000" + android:versionName="2.0" > diff --git a/sample/AndroidManifest.xml b/sample/AndroidManifest.xml index c35fe2fd4..b7ec08f6e 100755 --- a/sample/AndroidManifest.xml +++ b/sample/AndroidManifest.xml @@ -1,8 +1,8 @@ + android:versionCode="2000" + android:versionName="2.0" > Date: Fri, 30 Nov 2012 10:47:15 +0000 Subject: [PATCH 034/120] Update POMs --- pom.xml | 4 ++-- sample/pom.xml | 6 ++++++ 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index f222bee0d..cf68f88e2 100644 --- a/pom.xml +++ b/pom.xml @@ -66,8 +66,8 @@ maven-compiler-plugin 2.3.2 - @{java.version} - @{java.version} + ${java.version} + ${java.version} diff --git a/sample/pom.xml b/sample/pom.xml index 83826524d..eaf361a1c 100644 --- a/sample/pom.xml +++ b/sample/pom.xml @@ -30,6 +30,12 @@ apklib ${project.version} + + ${project.groupId} + extra-viewpager + apklib + ${project.version} + From 559325cf3152a45bf01d0dc1116309b6bdb1ede6 Mon Sep 17 00:00:00 2001 From: Chris Banes Date: Fri, 30 Nov 2012 10:54:23 +0000 Subject: [PATCH 035/120] Update Sample so it uses Holo --- sample/AndroidManifest.xml | 5 ++--- sample/res/layout/activity_ptr_expandable_list.xml | 2 +- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/sample/AndroidManifest.xml b/sample/AndroidManifest.xml index b7ec08f6e..e28cc313e 100755 --- a/sample/AndroidManifest.xml +++ b/sample/AndroidManifest.xml @@ -6,13 +6,12 @@ + android:targetSdkVersion="15" /> + android:label="@string/app_name" > diff --git a/sample/res/layout/activity_ptr_expandable_list.xml b/sample/res/layout/activity_ptr_expandable_list.xml index 4b00c972b..aac369808 100755 --- a/sample/res/layout/activity_ptr_expandable_list.xml +++ b/sample/res/layout/activity_ptr_expandable_list.xml @@ -14,6 +14,6 @@ ptr:ptrHeaderBackground="@android:color/darker_gray" ptr:ptrHeaderTextColor="@android:color/white" ptr:ptrMode="pullUpFromBottom" - ptr:ptrRefreshableViewBackground="@android:color/white" /> + ptr:ptrRefreshableViewBackground="?android:attr/windowBackground" /> \ No newline at end of file From 773974ed36fbb2ffe1433a294bd3e206a21820d8 Mon Sep 17 00:00:00 2001 From: Chris Banes Date: Fri, 30 Nov 2012 11:08:22 +0000 Subject: [PATCH 036/120] Style the Horizontal ScrollView Sample --- .../activity_ptr_horizontalscrollview.xml | 50 +++++++++++++++++-- sample/res/values/styles.xml | 12 +++++ 2 files changed, 58 insertions(+), 4 deletions(-) create mode 100644 sample/res/values/styles.xml diff --git a/sample/res/layout/activity_ptr_horizontalscrollview.xml b/sample/res/layout/activity_ptr_horizontalscrollview.xml index 5ada8ea2a..5f9307b12 100755 --- a/sample/res/layout/activity_ptr_horizontalscrollview.xml +++ b/sample/res/layout/activity_ptr_horizontalscrollview.xml @@ -14,12 +14,54 @@ ptr:ptrAnimationStyle="flip" ptr:ptrMode="both" > - + android:orientation="horizontal" > + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/sample/res/values/styles.xml b/sample/res/values/styles.xml new file mode 100644 index 000000000..609c2762f --- /dev/null +++ b/sample/res/values/styles.xml @@ -0,0 +1,12 @@ + + + + + + \ No newline at end of file From b248414574ff29533ad29462d11c1776f059600c Mon Sep 17 00:00:00 2001 From: Chris Banes Date: Fri, 30 Nov 2012 11:12:42 +0000 Subject: [PATCH 037/120] [maven-release-plugin] prepare release v2.0 --- extras/PullToRefreshListFragment/pom.xml | 2 +- extras/PullToRefreshViewPager/pom.xml | 2 +- extras/pom.xml | 2 +- library/pom.xml | 2 +- pom.xml | 4 ++-- sample/pom.xml | 2 +- 6 files changed, 7 insertions(+), 7 deletions(-) diff --git a/extras/PullToRefreshListFragment/pom.xml b/extras/PullToRefreshListFragment/pom.xml index cec7434ff..718390b61 100644 --- a/extras/PullToRefreshListFragment/pom.xml +++ b/extras/PullToRefreshListFragment/pom.xml @@ -10,7 +10,7 @@ com.github.chrisbanes.pulltorefresh extras - 1.4.3-SNAPSHOT + 2.0 diff --git a/extras/PullToRefreshViewPager/pom.xml b/extras/PullToRefreshViewPager/pom.xml index 031995557..bd53196d1 100644 --- a/extras/PullToRefreshViewPager/pom.xml +++ b/extras/PullToRefreshViewPager/pom.xml @@ -10,7 +10,7 @@ com.github.chrisbanes.pulltorefresh extras - 1.4.3-SNAPSHOT + 2.0 diff --git a/extras/pom.xml b/extras/pom.xml index a88bfd1ee..187a68a38 100644 --- a/extras/pom.xml +++ b/extras/pom.xml @@ -10,7 +10,7 @@ com.github.chrisbanes.pulltorefresh parent - 1.4.3-SNAPSHOT + 2.0 diff --git a/library/pom.xml b/library/pom.xml index 69e1e875d..1a3af2d2b 100644 --- a/library/pom.xml +++ b/library/pom.xml @@ -10,7 +10,7 @@ com.github.chrisbanes.pulltorefresh parent - 1.4.3-SNAPSHOT + 2.0 diff --git a/pom.xml b/pom.xml index cf68f88e2..014be2d34 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ com.github.chrisbanes.pulltorefresh parent pom - 1.4.3-SNAPSHOT + 2.0 Android-PullToRefresh Project Implementation of the Pull-to-Refresh UI Pattern for Android. https://github.com/chrisbanes/Android-PullToRefresh @@ -24,7 +24,7 @@ https://github.com/chrisbanes/Android-PullToRefresh scm:git:git://github.com/chrisbanes/Android-PullToRefresh.git scm:git:git@github.com:chrisbanes/Android-PullToRefresh.git - HEAD + v2.0 diff --git a/sample/pom.xml b/sample/pom.xml index eaf361a1c..7fe2eb021 100644 --- a/sample/pom.xml +++ b/sample/pom.xml @@ -10,7 +10,7 @@ com.github.chrisbanes.pulltorefresh parent - 1.4.3-SNAPSHOT + 2.0 From 6a8c29a31fd13a1cb28de4c090f71ffd6446c343 Mon Sep 17 00:00:00 2001 From: Chris Banes Date: Fri, 30 Nov 2012 11:12:48 +0000 Subject: [PATCH 038/120] [maven-release-plugin] prepare for next development iteration --- extras/PullToRefreshListFragment/pom.xml | 2 +- extras/PullToRefreshViewPager/pom.xml | 2 +- extras/pom.xml | 2 +- library/pom.xml | 2 +- pom.xml | 4 ++-- sample/pom.xml | 2 +- 6 files changed, 7 insertions(+), 7 deletions(-) diff --git a/extras/PullToRefreshListFragment/pom.xml b/extras/PullToRefreshListFragment/pom.xml index 718390b61..875ba4ec7 100644 --- a/extras/PullToRefreshListFragment/pom.xml +++ b/extras/PullToRefreshListFragment/pom.xml @@ -10,7 +10,7 @@ com.github.chrisbanes.pulltorefresh extras - 2.0 + 2.1-SNAPSHOT diff --git a/extras/PullToRefreshViewPager/pom.xml b/extras/PullToRefreshViewPager/pom.xml index bd53196d1..e9c4eead5 100644 --- a/extras/PullToRefreshViewPager/pom.xml +++ b/extras/PullToRefreshViewPager/pom.xml @@ -10,7 +10,7 @@ com.github.chrisbanes.pulltorefresh extras - 2.0 + 2.1-SNAPSHOT diff --git a/extras/pom.xml b/extras/pom.xml index 187a68a38..b1ff730c8 100644 --- a/extras/pom.xml +++ b/extras/pom.xml @@ -10,7 +10,7 @@ com.github.chrisbanes.pulltorefresh parent - 2.0 + 2.1-SNAPSHOT diff --git a/library/pom.xml b/library/pom.xml index 1a3af2d2b..aa3b4bd92 100644 --- a/library/pom.xml +++ b/library/pom.xml @@ -10,7 +10,7 @@ com.github.chrisbanes.pulltorefresh parent - 2.0 + 2.1-SNAPSHOT diff --git a/pom.xml b/pom.xml index 014be2d34..cac7d5172 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ com.github.chrisbanes.pulltorefresh parent pom - 2.0 + 2.1-SNAPSHOT Android-PullToRefresh Project Implementation of the Pull-to-Refresh UI Pattern for Android. https://github.com/chrisbanes/Android-PullToRefresh @@ -24,7 +24,7 @@ https://github.com/chrisbanes/Android-PullToRefresh scm:git:git://github.com/chrisbanes/Android-PullToRefresh.git scm:git:git@github.com:chrisbanes/Android-PullToRefresh.git - v2.0 + HEAD diff --git a/sample/pom.xml b/sample/pom.xml index 7fe2eb021..15d2b8be0 100644 --- a/sample/pom.xml +++ b/sample/pom.xml @@ -10,7 +10,7 @@ com.github.chrisbanes.pulltorefresh parent - 2.0 + 2.1-SNAPSHOT From 9b69b67379a0d0dc43bda43ec7bda23799b63e8a Mon Sep 17 00:00:00 2001 From: Chris Banes Date: Fri, 30 Nov 2012 13:21:35 +0000 Subject: [PATCH 039/120] Fix Footer randomly appearing on PtRListView --- .../library/PullToRefreshListView.java | 30 +++++++++++-------- 1 file changed, 18 insertions(+), 12 deletions(-) diff --git a/library/src/com/handmark/pulltorefresh/library/PullToRefreshListView.java b/library/src/com/handmark/pulltorefresh/library/PullToRefreshListView.java index db7a298c1..c65ba87d2 100644 --- a/library/src/com/handmark/pulltorefresh/library/PullToRefreshListView.java +++ b/library/src/com/handmark/pulltorefresh/library/PullToRefreshListView.java @@ -138,38 +138,44 @@ void onRefreshing(final boolean doScroll) { super.onRefreshing(false); - final LoadingLayout originalLoadingLayout, listViewLoadingLayout; + final LoadingLayout origLoadingView, listViewLoadingView, oppositeListViewLoadingView; final int selection, scrollToY; switch (getCurrentMode()) { case MANUAL_REFRESH_ONLY: case PULL_FROM_END: - originalLoadingLayout = getFooterLayout(); - listViewLoadingLayout = mFooterLoadingView; + origLoadingView = getFooterLayout(); + listViewLoadingView = mFooterLoadingView; + oppositeListViewLoadingView = mHeaderLoadingView; selection = mRefreshableView.getCount() - 1; scrollToY = getScrollY() - getFooterHeight(); break; case PULL_FROM_START: default: - originalLoadingLayout = getHeaderLayout(); - listViewLoadingLayout = mHeaderLoadingView; + origLoadingView = getHeaderLayout(); + listViewLoadingView = mHeaderLoadingView; + oppositeListViewLoadingView = mFooterLoadingView; selection = 0; scrollToY = getScrollY() + getHeaderHeight(); break; } // Hide our original Loading View - originalLoadingLayout.setVisibility(View.INVISIBLE); + origLoadingView.setVisibility(View.INVISIBLE); + + // Make sure the opposite end is hidden too + oppositeListViewLoadingView.setVisibility(View.GONE); // Show the ListView Loading View and set it to refresh. If it has a 0 // height, then we need to set it to WRAP_CONTENT - if (listViewLoadingLayout.getHeight() == 0) { - ViewGroup.LayoutParams lp = listViewLoadingLayout.getLayoutParams(); + if (listViewLoadingView.getHeight() == 0) { + ViewGroup.LayoutParams lp = listViewLoadingView.getLayoutParams(); lp.height = ViewGroup.LayoutParams.WRAP_CONTENT; - listViewLoadingLayout.setLayoutParams(lp); + listViewLoadingView.setLayoutParams(lp); } - listViewLoadingLayout.setVisibility(View.VISIBLE); - listViewLoadingLayout.refreshing(); + listViewLoadingView.setVisibility(View.VISIBLE); + + listViewLoadingView.refreshing(); if (doScroll) { // We scroll slightly so that the ListView's header/footer is at the @@ -253,7 +259,7 @@ protected ListView createRefreshableView(Context context, AttributeSet attrs) { TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.PullToRefresh); // We use a 0 height (instead of View.GONE) for now so that it's still - // layed out + // measured and laid out final FrameLayout.LayoutParams lp = new FrameLayout.LayoutParams(FrameLayout.LayoutParams.MATCH_PARENT, 0, Gravity.CENTER_HORIZONTAL); From ce2d1d2e08663266acc48c50f01416c3b9646fc2 Mon Sep 17 00:00:00 2001 From: Chris Banes Date: Fri, 30 Nov 2012 13:24:45 +0000 Subject: [PATCH 040/120] Improve ViewPager background --- sample/res/layout/activity_ptr_viewpager.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/sample/res/layout/activity_ptr_viewpager.xml b/sample/res/layout/activity_ptr_viewpager.xml index 362c58498..29f42b1e9 100755 --- a/sample/res/layout/activity_ptr_viewpager.xml +++ b/sample/res/layout/activity_ptr_viewpager.xml @@ -10,9 +10,9 @@ android:id="@+id/pull_refresh_viewpager" android:layout_width="fill_parent" android:layout_height="fill_parent" - ptr:ptrRefreshableViewBackground="@android:color/black" ptr:ptrAnimationStyle="flip" ptr:ptrHeaderBackground="@android:color/darker_gray" - ptr:ptrMode="both" /> + ptr:ptrMode="both" + ptr:ptrRefreshableViewBackground="?android:attr/windowBackground" /> \ No newline at end of file From 3d498d33d29b3a749e7230c6a78fd55b69d569af Mon Sep 17 00:00:00 2001 From: Chris Banes Date: Fri, 30 Nov 2012 13:24:56 +0000 Subject: [PATCH 041/120] Update Manifests to v2.0.1 --- extras/PullToRefreshListFragment/AndroidManifest.xml | 4 ++-- extras/PullToRefreshViewPager/AndroidManifest.xml | 4 ++-- library/AndroidManifest.xml | 4 ++-- sample/AndroidManifest.xml | 4 ++-- 4 files changed, 8 insertions(+), 8 deletions(-) diff --git a/extras/PullToRefreshListFragment/AndroidManifest.xml b/extras/PullToRefreshListFragment/AndroidManifest.xml index 1d48922f7..0bf8b6c17 100644 --- a/extras/PullToRefreshListFragment/AndroidManifest.xml +++ b/extras/PullToRefreshListFragment/AndroidManifest.xml @@ -1,8 +1,8 @@ + android:versionCode="2010" + android:versionName="2.0.1" > diff --git a/extras/PullToRefreshViewPager/AndroidManifest.xml b/extras/PullToRefreshViewPager/AndroidManifest.xml index ca02f5815..488ddf580 100644 --- a/extras/PullToRefreshViewPager/AndroidManifest.xml +++ b/extras/PullToRefreshViewPager/AndroidManifest.xml @@ -1,8 +1,8 @@ + android:versionCode="2010" + android:versionName="2.0.1" > diff --git a/library/AndroidManifest.xml b/library/AndroidManifest.xml index d9e351a9a..98a851e6c 100644 --- a/library/AndroidManifest.xml +++ b/library/AndroidManifest.xml @@ -1,8 +1,8 @@ + android:versionCode="2010" + android:versionName="2.0.1" > diff --git a/sample/AndroidManifest.xml b/sample/AndroidManifest.xml index e28cc313e..4bc16adc3 100755 --- a/sample/AndroidManifest.xml +++ b/sample/AndroidManifest.xml @@ -1,8 +1,8 @@ + android:versionCode="2010" + android:versionName="2.0.1" > Date: Fri, 30 Nov 2012 13:29:43 +0000 Subject: [PATCH 042/120] [maven-release-plugin] prepare release v2.0.1 --- extras/PullToRefreshListFragment/pom.xml | 2 +- extras/PullToRefreshViewPager/pom.xml | 2 +- extras/pom.xml | 2 +- library/pom.xml | 2 +- pom.xml | 4 ++-- sample/pom.xml | 2 +- 6 files changed, 7 insertions(+), 7 deletions(-) diff --git a/extras/PullToRefreshListFragment/pom.xml b/extras/PullToRefreshListFragment/pom.xml index 875ba4ec7..716079e16 100644 --- a/extras/PullToRefreshListFragment/pom.xml +++ b/extras/PullToRefreshListFragment/pom.xml @@ -10,7 +10,7 @@ com.github.chrisbanes.pulltorefresh extras - 2.1-SNAPSHOT + 2.0.1 diff --git a/extras/PullToRefreshViewPager/pom.xml b/extras/PullToRefreshViewPager/pom.xml index e9c4eead5..4dd68dbe8 100644 --- a/extras/PullToRefreshViewPager/pom.xml +++ b/extras/PullToRefreshViewPager/pom.xml @@ -10,7 +10,7 @@ com.github.chrisbanes.pulltorefresh extras - 2.1-SNAPSHOT + 2.0.1 diff --git a/extras/pom.xml b/extras/pom.xml index b1ff730c8..35070c5aa 100644 --- a/extras/pom.xml +++ b/extras/pom.xml @@ -10,7 +10,7 @@ com.github.chrisbanes.pulltorefresh parent - 2.1-SNAPSHOT + 2.0.1 diff --git a/library/pom.xml b/library/pom.xml index aa3b4bd92..06ec25064 100644 --- a/library/pom.xml +++ b/library/pom.xml @@ -10,7 +10,7 @@ com.github.chrisbanes.pulltorefresh parent - 2.1-SNAPSHOT + 2.0.1 diff --git a/pom.xml b/pom.xml index cac7d5172..435f1680e 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ com.github.chrisbanes.pulltorefresh parent pom - 2.1-SNAPSHOT + 2.0.1 Android-PullToRefresh Project Implementation of the Pull-to-Refresh UI Pattern for Android. https://github.com/chrisbanes/Android-PullToRefresh @@ -24,7 +24,7 @@ https://github.com/chrisbanes/Android-PullToRefresh scm:git:git://github.com/chrisbanes/Android-PullToRefresh.git scm:git:git@github.com:chrisbanes/Android-PullToRefresh.git - HEAD + v2.0.1 diff --git a/sample/pom.xml b/sample/pom.xml index 15d2b8be0..c8f37d43d 100644 --- a/sample/pom.xml +++ b/sample/pom.xml @@ -10,7 +10,7 @@ com.github.chrisbanes.pulltorefresh parent - 2.1-SNAPSHOT + 2.0.1 From 9e00f4478df817b60053ede3cf72598dfb29d8e8 Mon Sep 17 00:00:00 2001 From: Chris Banes Date: Fri, 30 Nov 2012 13:29:50 +0000 Subject: [PATCH 043/120] [maven-release-plugin] prepare for next development iteration --- extras/PullToRefreshListFragment/pom.xml | 2 +- extras/PullToRefreshViewPager/pom.xml | 2 +- extras/pom.xml | 2 +- library/pom.xml | 2 +- pom.xml | 4 ++-- sample/pom.xml | 2 +- 6 files changed, 7 insertions(+), 7 deletions(-) diff --git a/extras/PullToRefreshListFragment/pom.xml b/extras/PullToRefreshListFragment/pom.xml index 716079e16..70ab8f5aa 100644 --- a/extras/PullToRefreshListFragment/pom.xml +++ b/extras/PullToRefreshListFragment/pom.xml @@ -10,7 +10,7 @@ com.github.chrisbanes.pulltorefresh extras - 2.0.1 + 2.0.2-SNAPSHOT diff --git a/extras/PullToRefreshViewPager/pom.xml b/extras/PullToRefreshViewPager/pom.xml index 4dd68dbe8..1fd45cc89 100644 --- a/extras/PullToRefreshViewPager/pom.xml +++ b/extras/PullToRefreshViewPager/pom.xml @@ -10,7 +10,7 @@ com.github.chrisbanes.pulltorefresh extras - 2.0.1 + 2.0.2-SNAPSHOT diff --git a/extras/pom.xml b/extras/pom.xml index 35070c5aa..b816dda46 100644 --- a/extras/pom.xml +++ b/extras/pom.xml @@ -10,7 +10,7 @@ com.github.chrisbanes.pulltorefresh parent - 2.0.1 + 2.0.2-SNAPSHOT diff --git a/library/pom.xml b/library/pom.xml index 06ec25064..b8ed5b0c6 100644 --- a/library/pom.xml +++ b/library/pom.xml @@ -10,7 +10,7 @@ com.github.chrisbanes.pulltorefresh parent - 2.0.1 + 2.0.2-SNAPSHOT diff --git a/pom.xml b/pom.xml index 435f1680e..eb715e8ea 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ com.github.chrisbanes.pulltorefresh parent pom - 2.0.1 + 2.0.2-SNAPSHOT Android-PullToRefresh Project Implementation of the Pull-to-Refresh UI Pattern for Android. https://github.com/chrisbanes/Android-PullToRefresh @@ -24,7 +24,7 @@ https://github.com/chrisbanes/Android-PullToRefresh scm:git:git://github.com/chrisbanes/Android-PullToRefresh.git scm:git:git@github.com:chrisbanes/Android-PullToRefresh.git - v2.0.1 + HEAD diff --git a/sample/pom.xml b/sample/pom.xml index c8f37d43d..ac8f2e9b7 100644 --- a/sample/pom.xml +++ b/sample/pom.xml @@ -10,7 +10,7 @@ com.github.chrisbanes.pulltorefresh parent - 2.0.1 + 2.0.2-SNAPSHOT From 3187817cff28b96a8f9b8bc771c3418385e9744f Mon Sep 17 00:00:00 2001 From: Chris Banes Date: Fri, 30 Nov 2012 16:04:29 +0000 Subject: [PATCH 044/120] New Flip Drawable --- .../res/drawable-hdpi/default_ptr_flip.png | Bin 0 -> 1835 bytes .../drawable-hdpi/default_ptr_flip_bottom.png | Bin 667 -> 0 bytes .../drawable-hdpi/default_ptr_flip_left.png | Bin 2339 -> 0 bytes .../drawable-hdpi/default_ptr_flip_top.png | Bin 49504 -> 0 bytes .../default_ptr_flip.png} | Bin 1699 -> 1612 bytes .../res/drawable-mdpi/default_ptr_rotate.png | Bin 0 -> 419 bytes library/res/drawable-xhdpi/arrow_down.png | Bin 477 -> 473 bytes library/res/drawable-xhdpi/arrow_up.png | Bin 486 -> 482 bytes .../res/drawable-xhdpi/default_ptr_flip.png | Bin 0 -> 1983 bytes .../library/internal/FlipLoadingLayout.java | 65 +++++++++++------- .../library/internal/LoadingLayout.java | 19 +++-- .../library/internal/RotateLoadingLayout.java | 7 +- 12 files changed, 52 insertions(+), 39 deletions(-) create mode 100644 library/res/drawable-hdpi/default_ptr_flip.png delete mode 100644 library/res/drawable-hdpi/default_ptr_flip_bottom.png delete mode 100644 library/res/drawable-hdpi/default_ptr_flip_left.png delete mode 100644 library/res/drawable-hdpi/default_ptr_flip_top.png rename library/res/{drawable-hdpi/default_ptr_flip_right.png => drawable-mdpi/default_ptr_flip.png} (60%) create mode 100644 library/res/drawable-mdpi/default_ptr_rotate.png create mode 100644 library/res/drawable-xhdpi/default_ptr_flip.png diff --git a/library/res/drawable-hdpi/default_ptr_flip.png b/library/res/drawable-hdpi/default_ptr_flip.png new file mode 100644 index 0000000000000000000000000000000000000000..0a2c0bd9bb4907fc43e8ba68e3b9b6fefd6d84ea GIT binary patch literal 1835 zcmZXU2{fDO8pnesN{d@dgm5jfs~U8u1Ytxa$RdlSt;RB=RYhsIG)=2BsuJy3+o=|v zS{lo-v|4Iks$}d*89`$kEe1ntZ3Xwc*S*d?=RW7W|L^zw-~V&Yci#7$mrWwL%E_wB zfZ=j^Oaii!vhx%>kNbn4h`+C;<{RoQ_Z zK`wxzwS8RgaNbtXC}(To>SY}eTt?xN8?)V7X#_6&wryDK+KZ*PUvK;Exvth}>6Bv~r?3oBbOmfvY;PtZZj{5)W? zpi*|Y0b*y!O`YZ@!=mGp{QT)<86R?1hwb;(#Q&$Z%o7Gr$Yl};~H9*2yBnfxo< zBlzu0(H2Y%*mM56{=!2Z;?!{T1;wfY)%azvt(U@}xwIl4C1f&Svek`Ml0|Gd%| z)LnHZt49)%@_jS6cP3ss9{sYcp$Ob7K-yU4K|i~DhlZCIJB^k<^7TBjW0{3IpTaW^ ztH0ltsnsoC7xPrD8|v1k z<#`sOIxDU;|MuJmO&O68YXw#nvF1qY}Foq?oL zkd+hLn)B|{B1R2AHhz=VZ-_x@*{JW8+o+@Hx_eOm536WjP-N_7xTzBGY{*=}`d$Tr zjwt?XNeDzY#2}D_JjsLVvbVQ~!{P9FJdH;4{CD{hd;unt$pivnABaRE(2_``gUmiq zC=_4IA z<9C?T?jCpo(UVN2dHebY1&4%1T#1T}zm<^0zWeZTZe9Vmq`dM)bzNgi+uPrI`uRh` z_oB&}xrLS0&HlJPCUE{{IE)h&rdHNE@8u)`0}mkH^kz=wrRtW)VG9b#o|)8>^E>nc zjHcG`nHxel2zo4<&C z6qe=Vbihi=3CaXd7+KHx81@!R*57{Gh2t!6D{yktB+HV&CJ9mpwTpdn-r}IxFF{?- zCfOtj@~2Ers@nzXkKbQSlPkTdl?o?MXDg<@JR;E6H#e3sX1Ro5vqHNZyT(aSayj1C zwb>T7 a+Ju$p-kaba>tx`1KsXlyru;kqAO8vU6*3Y4 literal 0 HcmV?d00001 diff --git a/library/res/drawable-hdpi/default_ptr_flip_bottom.png b/library/res/drawable-hdpi/default_ptr_flip_bottom.png deleted file mode 100644 index 91210b8785b98e8e00b0448e580ee70052ae9129..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 667 zcmV;M0%ZM(P)E*5khpej0_6sH19j<27j9U|4a6G|6XGx6`a4SLh(OW-{+b9Z%Q^+wOX3l&NS z$vo`*DYr5cfP{yTaFPk-Zj~oueJPZOBqVIEdM2PG0xrVG&ERFXgdwbSNTtILQ!7hX za|xX6tlRBgap8C>Bm#-c`l6IWP>?K7{hIPQp>(7(`9xq|z;y%Ms=-1q}_C)r`xcs#zd(HA0dOcP}4QSV1hFbe-Ep|6LW^0AUB z7T*Hj=3~h`bzKrju2rlahM|?L=dY>j_=M^CmZ-9#wMo}hY;l5|ugGhqr1sXTQUa_x zQ6q|?*Ag{S2!2O<>4dvc5&`?g;VVyzh(0S<<`%9E(FeD&%G26hw-!HGviGBoR;ycq=cWJv002ovPDHLkV1i+H BIhgyP>jGX}g>@W~9% zTr~pB&+b@CQ;Cn)?kX*4Q8UCLBX7!4E$_9!PXTHo z$8DB}1atcq>dPIxju~Eau;;$Iuee!%O3G)XnjLK5bw6PKLz~60#Y^nVpaG&KiFzwj z)93iP>%|uz>z>WXS38sKlG0Vy<0RR0{k1D1y{%md*`WIF(Zq;$icH&7`rD7L3p#cC zQlE7u!`QqtmrhE`FI4C7F&s4RYYEhpPLLk;?HJ@f<3{Ja-o(H7I_ACc;Yww>>WS07i{*llSLp?OFRG9%Y;fdVJ5S1t z^&L+dY%AM!{-K0UT4-H<`)HzcBB8vfra-E_3otXjtoDb~&M10up>=<8roYG970h{T zP#S+Lt@>=^nN4j9ci5LS+teJJJ74P`EDGBfzP?`|Rh_Nge=29NYmx=g*ef8^0H|@u zhJnBy&)|wH^>(j_L>*T(MDUYBM{KTpHs;Lz+8w4iJq$nT=)E>F8t&Gm6g{}tBJD*> z(m!sh*CH-^m9}9S9Al<-c3hJSyWHg=I9ByB_y))U`k-blc=2S241eM+)?$hGs`v0 zH*s2}DpjP78Tq5NGn29l?dw*wYc*JMWsxqoxQO4^XqYJKK`ugio4uQouCvtq2XZp5 zdYbZ^1#>$2?0~GXb157kJH^00c{)XiOTGn#h^v~(yNm5A2XDV06<9l*;$Wo z{QM#i>uWnF$GXtb9(VvUtZ>=kI{T?yp^*BRIS1XYCuNr44~pePYi&~& zO%2%?d;d5PXswc1z+Hm}mO&tii&SqvmY<6=5W=7#$)Sv33X(&M5f2#{>cImt;K2-9QMhC6=ezcb8&~+FqjnBb|e~!f#c<1Fc^**8U}b0cYJXd zy;;H|SgaTTg-S?BKqeR?8O(4L+QPyDWrRUtFbI(aB5p68Mdl#raXOzt{=y+r;zF3z z7#5X5hlz2?!Hjs8B^)je^!50XCoSe{AbQ-FszmjnIOG@<8fk?3iY#)(iE0FFm=rRL zLKF!eV}wQ{L>FeeHyQ(A&;Z65hx)?WUjIzq9$`jYEmK`HrhkjS!dl zgZ}?<$fAaQ>(+meDE{(y7R6e?jY*}5x+m@t9*sl&P4_>O{G7UIyWr(S)%~^g@N(SW z2%_I0c-ety?d>N!=8vT}TK#mQy@j2AT<4V5sh;%4^+JfXiblk9eVTC1RpCz0++$hw z&p>ZXHkYNkW=#mqbt^ZwK_0lYqX{CF^rGbN@tH!fMbOHD)gx=QPBbHeqGt{dCADg#wUm@M444Lmy?w`B%T8qr zvLkF%f?&>X_PhY%OrV4BE6nUAcWzw3g(^%GyEjdvb3!&II6HT<0(t}6Hl8uP26{dxi4S ze5qx*#K_|d0iaa4GHJ$YRx`EV?NGNx@`;+^!rv#~+9uze%qAWV_gG3LAn@Qt;sa*> SamOI>SaPs+B^Lj(=kTAdSLiSR diff --git a/library/res/drawable-hdpi/default_ptr_flip_top.png b/library/res/drawable-hdpi/default_ptr_flip_top.png deleted file mode 100644 index 8d92b5a9df874889d498ede8566712c3f599eceb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 49504 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 MfjgqZ{(0_(EtDd diff --git a/library/res/drawable-hdpi/default_ptr_flip_right.png b/library/res/drawable-mdpi/default_ptr_flip.png similarity index 60% rename from library/res/drawable-hdpi/default_ptr_flip_right.png rename to library/res/drawable-mdpi/default_ptr_flip.png index 40061e28ea15d4789e27b58d77cb193a44c6e83d..be696c1c634c04fbcef5c3ea03c1ef89ca4ab284 100644 GIT binary patch delta 542 zcmZ3?dxl4`Gr-TCmrII^fq{Y7)59eQNDBe61_v{cJn}JW-9|-gmU^HNw-Do{yLEqn zqT2&}LR|m<|L@@75E>fl>FJq}kN{-(`S}6KfPjFgs3;&KFfb5E0zptv5JU>d@b~wJ zhyaxZ2M2@YK?)!M$OY;GvO~ZCr~m?j>XC$iQZR844N;1$AtWRSSpkF%*HyY{^Btfc zY)gXtf*DxY*f}_P`2_@pgheGJrKDwK<>VEVRCGM=0d-t2Y+n* zG2`3ZErx5QGXoFq7nK+8Q9V%derb2%`J=^0E5siqR&{3^OH ud5P6WbDvstwQ6sdg+RWUq5HDnC-Sb#4JQBp{Ky~Z9R^QVKbLh*2~7aSd(c7v delta 630 zcmV-+0*U?145JMpiBL{Q4GJ0x0000DNk~Le0000#0000Q2nGNE002IOTCpKJ1b-6% z01FcV0GgZ_0006dNklL51LSh6 z)fz{!_1}HvC<9ij)dyLY-(Vvf#edGJ`YMMEtn0eETrTPDLe$7PWc*|G2@SqhtK|Wh zz_nvd;#77*g+2E7BY-o^V-K7QzL)0_=9+1mLwGxudz(Q0(oWCA+a=4gzR)>Qz_}Pw z5MhzjR;yKiy7bUL4o?g|lWs+X!cvu74;SiN5FhdL(Tuy@YxA@mv> zB{gk@JxL8K$S~KE3R>WDJIbHEWk6! zFNg1mkR`QrJ?{mG>!Fd!WODdX@#>W)tsZ!{7eILjKz*>sQApx6L_co{J~6nhys~qs z?*z|DiYG0q*`P@S_-!Kp;lXPYa6t~<*Mq>vQSQ6vgMfew_~_w@FiQz)6DN5n@C3%t zCK)0MMsWh_H`mbMX@um3C@7*zk~=#h^8@N9I|#fm#5)20j&K_oLKdg;54+{sw6o3R QumAu607*qoM6N<$f?mfRTL1t6 diff --git a/library/res/drawable-mdpi/default_ptr_rotate.png b/library/res/drawable-mdpi/default_ptr_rotate.png new file mode 100644 index 0000000000000000000000000000000000000000..ceed80dbfea218e88bbe40cb52319faee9be7879 GIT binary patch literal 419 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfv=3*z$5DpHG+YkL80J#PMJ|V9E z|Noy!3OFt&ZwS=OUlQaO%pj;_>=K$*-Z694?lX7axoLf!36$b2@Q5sCVBk6o!i*-G zDyxBlG9|7NCBgY=CFO}lsSJ)O`AMk?Zka`?<@rU~#R|^BriEJ{n*r4w_jGX#(Kw%+ zus|=tIjOtMuRJB9`9bzypfm5E*eSCwA!fg(z<4`C0wRA86EZ!Ou4#QfnfW?h7B%{;YZl7=Al*Uivg*pbg5432_L&lhTv& Y0VskOQ#6NDGynhq07*qoM6N<$g3aoIi~s-t delta 278 zcmV+x0qOqP1Kk6VavBkIQchC<5fLIYL{(;Yh?%Op%-!z)T zlS^{MAPfZ=^9M2b{-=$JEXc#AibZ80F)-0>d7mPa{8s-fTo5on6(NC-g_shz&b#25DSt)CiOB(cJ}Yx( z^i@Dlr$FF+6mV`U`h6*J!GcGA(f{N>Z1m>>&o`lRYa-X~D>ZXX?0loO{-WE`4ti+% zy_+tRmR4N_UHdAr#CQ=1OaUixci&4UV0-Ac^i ccTyfHKPZA1Q~djGG5`Po07*qoM6N<$f*oFiKmY&$ diff --git a/library/res/drawable-xhdpi/arrow_up.png b/library/res/drawable-xhdpi/arrow_up.png index eaf7979344d079e369fc06e16e5b7d3efea559b7..676af1cfac9bce60fa7d56fea620ccfd0f7e33cd 100644 GIT binary patch delta 280 zcmV+z0q6ea1L6aabs7Z6APfZ!;SZ+x{+DelaEl9(Sag=7 zJ3ken4d247Z6&7KC7gaM63rymz6sxa*QS!Bnk9UyNVJmrT2>+yL@fAiZf}7FE~V65 zjqnoc>LaPyPh5ZUD&wGYCO9D^M*J7ReLj@N6zOSbl0KH)DG^TaF?6Dr$Eq^&V5PeM z-n-|0WIUW;9b<(Ld8{qVz4oI8X700005?w)sn;Q2d@B@FXE^|d9wHy3++bdS7o1kc~0G{G;Py>j?X-OaD9X;{tu&7*mQ iBA(5u)cS>;pYq=?`x#z-kyIG~0000_dVx(zUO}L@4bKAd(Y(%a4zyP>M|e@ zNFL*gCIY)Yun1BT0Dq1&Vu3*W^uwH-2pA`)Lxi)@!C?_WAkgsxsg$Ycak8=_Cz@CS zM;-EZNzZ7nrI37|YN%ItKrp$bi*E4J`4JQSS%fX8LPK(V{&6Kffo%)f7CSL2q3CL_ zBM%8k7+rty2t!IYsl>P@d}>qFFC?~8EraJ3dSndphOiPtRr5HrY(cNmkrvqBufEJ^Wk?AYv%l`**7ce%X1*KX z=;B{Q!L(Rv8*-jKLyX5*7b;q^_zTw zRZH<9_WY4x^9Fyqglbpr3?)jVQ8zf7SDoX3wr|EfE2hC>Pw~jD^Q#NAWbduprB4H& zC~_uE*U8U0sJHd2noC$Nz4j@_|1x+ZYjZGBJWktlwIYYboc!oQr&lXaLMFip182%) zJ+{KnTO??z)(xx~e7Vu3cl_=75G7uTO42v##-owIPub;Nq_AoK=@vIuRtY4eUdS{a)lTeSU`Q_l=L4>VUF?<>8#fYk@I5}2R;NvN~V|f#KI;-oa z$Y=SjdD;Sn#@M@R0=Qepz`Wt*>fnnZ2gXLg&k9w>elMCBTwp>}<3~_@g!u=E<~VJL z81VSs3ztu5v>py_7VxIR4Ov1cw9IR3`q{?bz_KeP^`*eyLKi=%6fqHRm-Sa?%GHM| zO=iWOrO3|OGtGb2d80_9V%ypQyoIA0A&)VR`!m%lL}ttI==jo4r}PX$4%Y>8c*S-@@8=5qd}x8hYM#(6NlcKrJZPcSD|S zyjpzDU@*61R{lAW8QE#Wjp}&Zx-n8)XSN+l6i519%(#BHdnvY6I!;f^;gr~G1Nkq} z(?0!U#Id@2rJsMW`}GW4P+g8agHLDrD|d@`E27HjDk#OA!vnq3W+x+c^_8MH} zr}TrlWwT973)1Voaywd0s!SPPxJP}0+4p^_)`|v@JCL^>(Fou`5-4FnNb-LQXaNN%&=sDDC~S!coC}jeiY`SW zN&>eMxhO1(0U~l?SH%CG`hOP<{!e~!xnvl4yx~kDjs%hbLnNi7W#!}*6!$AZm0@sI zHFXV5t%KT!baeIf4UbqJvqRcDo^Wz;bI0L{6z`C*h^XioWIqeGP>a`mMcZ%*7 z-!HGMs;T2WYG~v)HNR}{=o0h}3=R#CzMFbK_v!QE_m%Y@jjTPH07`d z{&cy(_>k1}IZA5!v9q|Vex=L0&N*qXuIN1I0cW>#pHfzPP=^hWGesIb^#1FQ_T$&R zU&zGd*+ij$~L<=kFW)=SOjrs6QSX z2mZK_k~KF4bEL-Ne#PW?9XL4L<6x0YX)>?$u9qxMqa+xId-HAuz!}9lhOR^LY=ItI z5Xcrl*#Z(3ci@6x`nMrE|k{P7~Ku^`CdOEKQ)2drbmN7oSniUQQO z&2)d~-S4au5@l=JtYPW8DftCxaN`QE%*vy@l}+|Q?Jw| gCi2}MRGSUa$q>U(&CSpX;1d90oN?%yfB60OFCnXS-T(jq literal 0 HcmV?d00001 diff --git a/library/src/com/handmark/pulltorefresh/library/internal/FlipLoadingLayout.java b/library/src/com/handmark/pulltorefresh/library/internal/FlipLoadingLayout.java index ff6bb18aa..688e4e003 100644 --- a/library/src/com/handmark/pulltorefresh/library/internal/FlipLoadingLayout.java +++ b/library/src/com/handmark/pulltorefresh/library/internal/FlipLoadingLayout.java @@ -17,11 +17,13 @@ import android.content.Context; import android.content.res.TypedArray; +import android.graphics.Matrix; import android.graphics.drawable.Drawable; import android.view.View; import android.view.ViewGroup; import android.view.animation.Animation; import android.view.animation.RotateAnimation; +import android.widget.ImageView.ScaleType; import com.handmark.pulltorefresh.library.PullToRefreshBase; import com.handmark.pulltorefresh.library.PullToRefreshBase.Mode; @@ -33,7 +35,7 @@ public class FlipLoadingLayout extends LoadingLayout { private final Animation mRotateAnimation, mResetRotateAnimation; - public FlipLoadingLayout(Context context, Mode mode, int scrollDirection, TypedArray attrs) { + public FlipLoadingLayout(Context context, final Mode mode, final int scrollDirection, TypedArray attrs) { super(context, mode, scrollDirection, attrs); final int rotateAngle = mode == Mode.PULL_FROM_START ? -180 : 180; @@ -53,15 +55,28 @@ public FlipLoadingLayout(Context context, Mode mode, int scrollDirection, TypedA @Override protected void onLoadingDrawableSet(Drawable imageDrawable) { - /** - * We need to set the width/height of the ImageView so that it is square - * with each side the size of the largest drawable dimension. This is so - * that it doesn't clip when rotated. - */ if (null != imageDrawable) { + final int dHeight = imageDrawable.getIntrinsicHeight(); + final int dWidth = imageDrawable.getIntrinsicWidth(); + + /** + * We need to set the width/height of the ImageView so that it is + * square with each side the size of the largest drawable dimension. + * This is so that it doesn't clip when rotated. + */ ViewGroup.LayoutParams lp = mHeaderImage.getLayoutParams(); - lp.width = lp.height = Math.max(imageDrawable.getIntrinsicWidth(), imageDrawable.getIntrinsicHeight()); + lp.width = lp.height = Math.max(dHeight, dWidth); mHeaderImage.requestLayout(); + + /** + * We now rotate the Drawable so that is at the correct rotation, + * and is centered. + */ + mHeaderImage.setScaleType(ScaleType.MATRIX); + Matrix matrix = new Matrix(); + matrix.postTranslate((lp.width - dWidth) / 2f, (lp.height - dHeight) / 2f); + matrix.postRotate(getDrawableRotationAngle(), dWidth / 2f, dHeight / 2f); + mHeaderImage.setImageMatrix(matrix); } } @@ -98,25 +113,29 @@ protected void resetImpl() { } @Override - protected int getDefaultStartDrawableResId(final int scrollDirection) { - switch (scrollDirection) { - case PullToRefreshBase.HORIZONTAL_SCROLL: - return R.drawable.default_ptr_flip_left; - case PullToRefreshBase.VERTICAL_SCROLL: - default: - return R.drawable.default_ptr_flip_top; - } + protected int getDefaultDrawableResId() { + return R.drawable.default_ptr_flip; } - @Override - protected int getDefaultEndDrawableResId(final int scrollDirection) { - switch (scrollDirection) { - case PullToRefreshBase.HORIZONTAL_SCROLL: - return R.drawable.default_ptr_flip_right; - case PullToRefreshBase.VERTICAL_SCROLL: - default: - return R.drawable.default_ptr_flip_bottom; + private float getDrawableRotationAngle() { + float angle = 0f; + switch (mMode) { + case PULL_FROM_END: + if (mScrollDirection == PullToRefreshBase.HORIZONTAL_SCROLL) { + angle = 90f; + } else { + angle = 180f; + } + break; + + case PULL_FROM_START: + if (mScrollDirection == PullToRefreshBase.HORIZONTAL_SCROLL) { + angle = 270f; + } + break; } + + return angle; } } diff --git a/library/src/com/handmark/pulltorefresh/library/internal/LoadingLayout.java b/library/src/com/handmark/pulltorefresh/library/internal/LoadingLayout.java index 2b0c37931..613d555b6 100644 --- a/library/src/com/handmark/pulltorefresh/library/internal/LoadingLayout.java +++ b/library/src/com/handmark/pulltorefresh/library/internal/LoadingLayout.java @@ -23,7 +23,6 @@ import android.graphics.drawable.AnimationDrawable; import android.graphics.drawable.Drawable; import android.text.TextUtils; -import android.util.Log; import android.util.TypedValue; import android.view.Gravity; import android.view.LayoutInflater; @@ -42,7 +41,7 @@ @SuppressLint("ViewConstructor") public abstract class LoadingLayout extends LinearLayout { - + static final String LOG_TAG = "PullToRefresh-LoadingLayout"; static final Interpolator ANIMATION_INTERPOLATOR = new LinearInterpolator(); @@ -55,6 +54,9 @@ public abstract class LoadingLayout extends LinearLayout { private final TextView mHeaderText; private final TextView mSubHeaderText; + protected final Mode mMode; + protected final int mScrollDirection; + private CharSequence mPullLabel; private CharSequence mRefreshingLabel; private CharSequence mReleaseLabel; @@ -67,6 +69,9 @@ public LoadingLayout(Context context, final Mode mode, final int scrollDirection setGravity(Gravity.CENTER_VERTICAL); + mMode = mode; + mScrollDirection = scrollDirection; + final int tbPadding = getResources().getDimensionPixelSize(R.dimen.header_footer_top_bottom_padding); final int lrPadding = getResources().getDimensionPixelSize(R.dimen.header_footer_left_right_padding); setPadding(lrPadding, tbPadding, lrPadding, tbPadding); @@ -163,11 +168,7 @@ public LoadingLayout(Context context, final Mode mode, final int scrollDirection // If we don't have a user defined drawable, load the default if (null == imageDrawable) { - if (mode == Mode.PULL_FROM_START) { - imageDrawable = context.getResources().getDrawable(getDefaultStartDrawableResId(scrollDirection)); - } else { - imageDrawable = context.getResources().getDrawable(getDefaultEndDrawableResId(scrollDirection)); - } + imageDrawable = context.getResources().getDrawable(getDefaultDrawableResId()); } // Set Drawable, and save width/height @@ -325,9 +326,7 @@ public void setTextColor(int color) { * Callbacks for derivative Layouts */ - protected abstract int getDefaultEndDrawableResId(int scrollDirection); - - protected abstract int getDefaultStartDrawableResId(int scrollDirection); + protected abstract int getDefaultDrawableResId(); protected abstract void onLoadingDrawableSet(Drawable imageDrawable); diff --git a/library/src/com/handmark/pulltorefresh/library/internal/RotateLoadingLayout.java b/library/src/com/handmark/pulltorefresh/library/internal/RotateLoadingLayout.java index 9730baad9..d8f69d5af 100644 --- a/library/src/com/handmark/pulltorefresh/library/internal/RotateLoadingLayout.java +++ b/library/src/com/handmark/pulltorefresh/library/internal/RotateLoadingLayout.java @@ -91,12 +91,7 @@ protected void releaseToRefreshImpl() { } @Override - protected int getDefaultStartDrawableResId(final int scrollDirection) { - return R.drawable.default_ptr_rotate; - } - - @Override - protected int getDefaultEndDrawableResId(final int scrollDirection) { + protected int getDefaultDrawableResId() { return R.drawable.default_ptr_rotate; } From a290f62aba8af472cdd66be5451b5439f7f253fc Mon Sep 17 00:00:00 2001 From: Chris Banes Date: Fri, 30 Nov 2012 16:18:16 +0000 Subject: [PATCH 045/120] New Indicator Arrow Drawable --- library/res/drawable-mdpi/indicator_arrow.png | Bin 0 -> 445 bytes library/res/drawable-xhdpi/arrow_down.png | Bin 473 -> 0 bytes library/res/drawable-xhdpi/arrow_up.png | Bin 482 -> 0 bytes library/res/drawable-xhdpi/indicator_arrow.png | Bin 0 -> 429 bytes library/res/indicator_arrow.png | Bin 0 -> 390 bytes .../library/internal/IndicatorLayout.java | 16 +++++++++++++--- 6 files changed, 13 insertions(+), 3 deletions(-) create mode 100644 library/res/drawable-mdpi/indicator_arrow.png delete mode 100644 library/res/drawable-xhdpi/arrow_down.png delete mode 100644 library/res/drawable-xhdpi/arrow_up.png create mode 100644 library/res/drawable-xhdpi/indicator_arrow.png create mode 100644 library/res/indicator_arrow.png diff --git a/library/res/drawable-mdpi/indicator_arrow.png b/library/res/drawable-mdpi/indicator_arrow.png new file mode 100644 index 0000000000000000000000000000000000000000..20fe2c126ae700d57be9c7f19a0cf7296ece8055 GIT binary patch literal 445 zcmV;u0Yd(XP)=Zx2#&4L) zK8=5n)@r~%(8dq25D}Ygf)-ju1T8`$8bu5W7I)FRVfVa&E$+=eW_IVcMlM984Kygm zR8>c_kGe@VfEFcTg=Zi!?7K`@0hSD#0CzFr3z!C2w8AiJtFq7m+J=pQ%b4&1yaiaa z!aeY0Sm8`o*aDUfdjw8n!Yj}WuxN!bW>COOnXn108a4p>F`*AU7*?2z6%t@Rz@owq zux{8ba1|3mzjxt%SfL3l1lVuXMC1fmq*}b!fi7@VQP@ws_haYWC$LR=L$P(Js^B*8$cdn=e$g2QZf_cR)JTmRW-=mmWIbponY$$NatP39zTCH?uv3DSGdR&bcwL no3+wa)w6%ELPS(VG?e=R;L=SFhh?BF00000NkvXXu0mjf7aXr< literal 0 HcmV?d00001 diff --git a/library/res/drawable-xhdpi/arrow_down.png b/library/res/drawable-xhdpi/arrow_down.png deleted file mode 100644 index fc29038e5bdecf430d5e6405f38540dbe2a5a3e5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 473 zcmeAS@N?(olHy`uVBq!ia0vp^;y`S|!3-qB&IE%bn2Vh}LpV4%Za?&Y0OT46_=LFr z|Nno=lqtQW046?zX+Z4)B|(0{41$76#x9|0{(+%k(&%kzt}ixr%MO$)a^HUp{?1*vl` zN=+=u%+FH@$;?ef1SmRiJI?AR2J>X`d;z#_@pHh?=6TsWNk0HkoW$f zHMy$GZmG_x(-u0ba%~^y{hI5`CM}tzTC>Vy%cNgXVM-z{IzMvr@*7$8mR^bJ{UG$} zmGa7){xS8Rv>q=|vrtrV`y+m!)^5r%k(ZenlkBG5(G>LiU|6zf`temppAwet`hRct z^V$@fISI1Kt^Ad1bWiX7Y4T{Y{ikcjVtyCeCW@c0Eqda+clLdY+l6kw^xZ!;IOFyFSOd1?W)*Pgg&ebxsLQ08-P-@&Et; diff --git a/library/res/drawable-xhdpi/indicator_arrow.png b/library/res/drawable-xhdpi/indicator_arrow.png new file mode 100644 index 0000000000000000000000000000000000000000..810ff595b79a2d7840ccf80cf4e559d6e15a2473 GIT binary patch literal 429 zcmeAS@N?(olHy`uVBq!ia0vp^5O>_%)r1c1j3A$ z?$-SQ3d)qYMwA5SrY$lWUWV$N`Q^`V3Dsq?sE9&HB2y1uO(jcwOC0ML3!^6#6*MNzhC?pM{Zudc=6nWz0!Q!3^piQaPsgJpL00qxj-#bB3*gHVV=hl4M4*-^f#`3 zxQClf_<+o@%?jUSGw!@@vY5W$Tq1L!P(s|?@9*w<@7TZe{@&Xh&kgQZXE$(6+Ogc@ e;bG2=EDWJDx@K@C2HykvkHOQ`&t;ucLK6VlUz}F} literal 0 HcmV?d00001 diff --git a/library/res/indicator_arrow.png b/library/res/indicator_arrow.png new file mode 100644 index 0000000000000000000000000000000000000000..8ae79770973e4fd85f994c0f6edff5eb5ebae6c9 GIT binary patch literal 390 zcmeAS@N?(olHy`uVBq!ia0vp^LO`s}!VDxogtJxwDdu7)&kzm{j@u9Y9{{O>_%)r16w3}Oq z@zUM8KR`j564!{5;QX|b^2DN42FH~Aq*MjB%%art{G#k)1?OPX!mW?Zfa=zIx;TbN zOifNmNDu*n1O`SmRaI416EP+Z#-kz!brO@4lbsE`j~qRERPc<`jHZOnwzf95MH>aG z1RZpNfU|dL91yfD<4c_F=I-t;EXDoMuI065`nfrljJ-# Date: Fri, 30 Nov 2012 16:20:58 +0000 Subject: [PATCH 046/120] Fix last commit --- library/res/{ => drawable-hdpi}/indicator_arrow.png | Bin .../library/internal/IndicatorLayout.java | 4 +++- 2 files changed, 3 insertions(+), 1 deletion(-) rename library/res/{ => drawable-hdpi}/indicator_arrow.png (100%) diff --git a/library/res/indicator_arrow.png b/library/res/drawable-hdpi/indicator_arrow.png similarity index 100% rename from library/res/indicator_arrow.png rename to library/res/drawable-hdpi/indicator_arrow.png diff --git a/library/src/com/handmark/pulltorefresh/library/internal/IndicatorLayout.java b/library/src/com/handmark/pulltorefresh/library/internal/IndicatorLayout.java index 26042594e..a9069f2a4 100644 --- a/library/src/com/handmark/pulltorefresh/library/internal/IndicatorLayout.java +++ b/library/src/com/handmark/pulltorefresh/library/internal/IndicatorLayout.java @@ -15,6 +15,7 @@ *******************************************************************************/ package com.handmark.pulltorefresh.library.internal; +import android.annotation.SuppressLint; import android.content.Context; import android.graphics.Matrix; import android.graphics.drawable.Drawable; @@ -32,6 +33,7 @@ import com.handmark.pulltorefresh.library.PullToRefreshBase; import com.handmark.pulltorefresh.library.R; +@SuppressLint("ViewConstructor") public class IndicatorLayout extends FrameLayout implements AnimationListener { static final int DEFAULT_ROTATION_ANIMATION_DURATION = 150; @@ -45,7 +47,7 @@ public IndicatorLayout(Context context, PullToRefreshBase.Mode mode) { super(context); mArrowImageView = new ImageView(context); - Drawable arrowD = getResources().getDrawable(R.drawable.indicator); + Drawable arrowD = getResources().getDrawable(R.drawable.indicator_arrow); mArrowImageView.setImageDrawable(arrowD); final int padding = getResources().getDimensionPixelSize(R.dimen.indicator_internal_padding); From ae245d2aeba47aebce40d38156eed39e33f0f931 Mon Sep 17 00:00:00 2001 From: Chris Banes Date: Fri, 30 Nov 2012 16:26:00 +0000 Subject: [PATCH 047/120] Fix Rotation pivot point --- .../pulltorefresh/library/internal/FlipLoadingLayout.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/library/src/com/handmark/pulltorefresh/library/internal/FlipLoadingLayout.java b/library/src/com/handmark/pulltorefresh/library/internal/FlipLoadingLayout.java index 688e4e003..fc257fa5a 100644 --- a/library/src/com/handmark/pulltorefresh/library/internal/FlipLoadingLayout.java +++ b/library/src/com/handmark/pulltorefresh/library/internal/FlipLoadingLayout.java @@ -75,7 +75,7 @@ protected void onLoadingDrawableSet(Drawable imageDrawable) { mHeaderImage.setScaleType(ScaleType.MATRIX); Matrix matrix = new Matrix(); matrix.postTranslate((lp.width - dWidth) / 2f, (lp.height - dHeight) / 2f); - matrix.postRotate(getDrawableRotationAngle(), dWidth / 2f, dHeight / 2f); + matrix.postRotate(getDrawableRotationAngle(), lp.width / 2f, lp.height / 2f); mHeaderImage.setImageMatrix(matrix); } } From 60cbc96919905dcc8f30e187252d97e6de0e5308 Mon Sep 17 00:00:00 2001 From: Chris Banes Date: Tue, 4 Dec 2012 17:27:08 +0000 Subject: [PATCH 048/120] Add support lib to Sample project --- sample/libs/android-support-v4.jar | Bin 0 -> 349252 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 sample/libs/android-support-v4.jar diff --git a/sample/libs/android-support-v4.jar b/sample/libs/android-support-v4.jar new file mode 100644 index 0000000000000000000000000000000000000000..feaf44f8018aba0e3e4f5f8e7115101dcb4d00ef GIT binary patch literal 349252 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 vQtTtaF%{4o|h}R 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�u}nTuCY`pnf}vKJ1*W-~m6#D<_P2fj<}fbi5B!R1D{_Q$HCGn8VvG@S zVfDlW>!G?m;V-4vBl6ofA9Q8d+gUAb;^VaCP%hPq3q{R2=Fs9amiU8Z*GZ^0X6p^g z{!sM1`!He}DAl!d5w?n_Y%*(1S|Us-J7FDLUv(mCDQo}{vuX0h+9++b`>@JU+4i{Y zN{h-=ZjJWg5@UBO&BhjdB{zIqoa6G=Z|8n#s~7$qnIL# z;L~SSnSbD&x_h(*tvd&yjLS90Lt$q!egH4YY-)JcSYBi- z7h&XcMJF9boolFumjAzLu zvn#GXVg?KmP>V#5Y`CR$^+x;+ZI8IIZ=3R*crGP!2Evcx77>}$QzjVfmkJp6tLTZp zA7DmoO?ytc$StuXp(K7uWQ}_c4#&K2ow$<14%A8`z8TPHBiWwPcrMwV(}*j%F1v;? z*PP&vYQ>T04r}!zp*gzovS<_H17p|yB^Jt~#|haz-ispLBi^0E>bVaZ`6|pq)H4p_ zg^^T@6S`E?6YRC`rkWC}7UyHCKbrCw!E^9ui)$-=G|jYvFVD}zW1^ou#ptnx8#QA7 z=*Op@F>bmwJlcLN#ub47ToCa=x4_+?;dm^7`HXkfjQXS6C2G6v=!Tnii0Y$QoXcWT z^>Y_*Os&+`>86EhvO}>mhdF-3bcz9^BmX|$=|n?%)}j%S|8RxP%df@+X?bfq%{3H* zji_NkbsH_m(eIx3%-^D2`i(%|oj=_ybRhGx+_e`%XNICL;gBqc#a5%#NyNcwqgC<2 z^6Sr_p)MN4>BO}Hxd;`(^8KMg0*o~SyLR1Kbzx+HX{*2+_Bzp1dYvgOChCFjs0qS) zG?-8CMzJXy=EB|m6HAahKG3Ijw4tFNj4JHHda1jfU_4S4&8cm6G0Z zeo0dcWN+yk^`fed(3FOB)}KKPAtJW|O#;KID%!vNoIg=+nUj`Yqt=X`1<8rOlz-Jq zfmh6;(j*0HUDUq%u3nd@*~7wqnqEW+6m5YLFE`gKHwT=JuVCmZfYzWO zI80&a$qS5)b`I_O(?7Y^Ftf$b=68>@RxKS=^CD>FIIzr5e|Y2GW~bh^-#riwhCE2N zrI4Cqz$!jHp|yt3PQ9!Gwagf{41s)Sz$M&I<|H0Zj23NXnUBfX~Y}-c1 zwrzEij_sslcgMCmwr!go+qOH-o4wC-(C2x-{Z{Sz@?+Jiy4J7U^PY3eag8}^-)B`#EsKPvF)O$g*^Bk2KhZVFW8yP;|f+e(V9TOFgJd1i~UXK%*)U)}@?a5fj~t z)IZ`H=(!2hB?Dnm1KkP)cxieReK=_D5e?!)~o+efDR+_AGGiApO#h-|zXZ zZG*CI8uN_0)1EY@#FwTIU&cH9S5mZsax_rX0Y9-JBhiyRXwz&m*4hMC?@tj8~ zi*5D=Z*=Uo`8N60cdNfP6nrH_zm=zp58-oF*SRl)ApwCE3~WOhXhU!4Qb>m`UupUX z`O2v7UWRvRTeL3O+5`O8vTNxH>WgdOuxfqrCVkguKd)$T5BzSuOQ6<4;8u+D8?dwi zf4m+4HH6mo?t)r<29iY@e0_v2eArV#x1nLpao=$$Myd@UrU!D2^Q|!oPK;9m599bf z%D@1R%SO@?$dA#bZ;y#Is+#0;BoDwV#rXYZPjkxZns-3EK~E)-LV8t|*Fc^{Fz*-S zxyMwiMrSE~REsR^P<`#Q z31#4e^ere646_->;Ly6-6#DK^%IK8`xE^ZmlwEOU0^1K^1%QbWP;a$L4}oBR^_B?+ zoM&&O*RH_#d?N^$!cP{RP#Wcg%$Q4bB<7T+HHG6k(3;rpRR|m4VZHC}s+G}1i4F1Ffc{cDvEE+-ZSFlh2@7&MSJ1&!6a>N1{_!CI z3{K?+&vzK$9{KU{_6grKwo2Ca;{JGR%JFHuot-6%+m(4Huk+3Egbj!`=z^pQQ!k{8 zh(qR@df1Y*G7guBQ|cOGIE~ac2A70W?wW0woAg3#6D&RNrw8dpoTq?8=q~HgRKm@qn3)UB>V)Z_F5Y`xw0%2 z-5Rz~%*?Xlj@uoxYS-V^<)*pKD``z?pjQmym9yKB)&oyAuQLZIx15OcAQj4n=37v? z$2*7SN+?W3oKM^^pB+YnLa2uanv^e`j+zkp)6kU|7bv9##L*!Knj4x-Y5PYix;_%9 z{`{Vg&E6tYNza&rc)q>&Rqvd~6qgsxddk`Xs_}3wc-x2;Q2NB*q_XF(GMBLKr!C9B zBFb?z6_K|@Fo+Fv;!-BA>}oNLn?HTDT*gFMZ$@(B;zgd&b8C*xxAEPE-2myf_3rzx zwmNq@%pR__^6Bre1Bv*i2$geGxUC#mV)4ESsK0mu=30|?QfNr%8IkNV6I;hfn&jE| z+b+36$PHqRJT!y@=L8%VU-l^#zv6wl;WF{(G7J&Iai_hniiB~6i=a~N78fh_uwH~>hS>AQ;CB+G$N4i80%jqhHWLxN-;gXqgvsWFM6Kw!3B5Wrd zJh%lNi^irX%&+gQyFo!)oImLX^e@>` z9f{4D^<_rkG~{Bc)Rdkx^CW|!Jv2-5hh1WfqLR8{iaRA-a=HA3i>}xvMBtYNhA~s5 z_7}IK^?+Be>MvdY=9i)wCDD80<{%oKffo(ZLdt z87So{ZAA@F{*D}wLf)mX?ZEhD$;XJ#7uK53GQ!*9p0HXeKb8<250J=U`Q?fa&iGXkS1p+}W zvv0HQVLfuTs5!x|^fNf+OX!v2$&?8oNP*80v7ojLlu?cAux8&)O;gQpGUq3o8+JL_ z6D_u2Ic6Xh?H!^L0&MZ5|F+Toh+~68S8MzRG&|}Jz|z1aMqh26x8z=B=Lzv$p=}<^?8=p(*jHS6|1-ts(A8o zw*94z-l({f=+2eMIV(&3r7}_-G)&`|K;l(d!V6f>sTlGBi_)~%hv?3h=89mUy-#4h(%?_74S+crG|Z3iG+tu1y(}W%EMa(Xd*TM4s5wM65%n zCyYzTDPegXcOZ9t5Efqh?I^=1HRfPaxfxc{B(K)x#;n(lwZ>AftLvi;povXsyjJ`5 zE+BfNYJ#ky?Hp=8RZ&H>I4-{4_+V)WC!Hy~B>}Z18tj5k@tBdH?QxNUYp8Xx)+$7J zkn_pT=R`GwV=hG$u5o1XnUWg{wdfIqk(dGHn63#PZS){3&}U*Z#+c`G+96u1bL9rX z26;(?IZ#4J9?&G#pWF3JiV~aEVLdf#d(>)=AYk%HxHHTDmbW>tm_ z-S>QNtYS?il?LY8?!)P`R5Kgr2673F^y}r@21`{-JN3l-%@!VRV^VbzcO^l0*A}N-cc=rX@2Tas4_l1?(J1AgS724ani`GmiLoz+U3eas|im0nWYur z-V#|BWf%H{a%k>9jdb4EB9%GcNIrXDxwprB%lO(Pj2Y?S%Zh|Q;PK*q3Uzj~bWT6n z*WybO6*CO?;hr*^?2->xC{Rh=qr{x?&P-P;XekZn4Jk%5H)=YLGhtv?3KH#6;p~$`ap|Wxa%Q z+?DGrpo>0WIT2hpAbc366Aj>cR7!B^Oxw21*Ks$K*S(X%Ng$i-FTH(VaWJN)_jA~i zXlXT@di2*-V@4J*kIyF1g>x|=V+{%_i65IV-I%?|+oIJ{Ul%d95+xG6E6{NsX%d*m z%AY&NnD>em_G}3N#__G*`|z>R-S)W>1?>t(DS1;#UP$2PWgwYolE{Ue1QnOrv6ama zG2OqAJ+26m9;Z8sTjHfjL&E(Fr=w#7^cVJ+&ysbcv|0D`+$HFLPAfVWL4sgpb?_4A4xsXN+=0Uj|IRFU(@;y*S>Q=(&Blf2q`~AfRXR0_t7f z!Zhpt;iLT-uBG_>hodMyg>l}%U6ek-P;oc8Wnvf&htxb4Wb{NdGjE;64M}Ll$>AOj z$!y0(gQOpKooPL3-GCyRpoeTaZ85pr7ONiKJ;8@eM|Or(ma z4%r+U)+h<<`WeVNgJ12AFZ5KA?sZrG=19eNnd#Exr$1d^iU@bU+S55a$){b_t*Xl!8f?}h8_DwDQ2qNr~J)$Jjz=2Ab*fszXH z^IfK0sNxC8$XM+qTDxUI%mZdYr`=rBW$M@KT^7U=qMPitKp;8n{6H}{Zl@f~NCaMh zUlfaMT^em_bX|j}tLkhsP1m2-e|e9+yiQ*D0CPmi({Kd#!z4~A7;1(fBxopZha#&d zFeYfIZj+FuO6e#Y%6_;i5LiA0W_wDuFze`J7SAHPQXZbkbV0%~=@Z49e(qJ^E|i z<2R0$k(O zhl3NZ-nw_>r_u+|N$%y{yR(CAvEWV!lx-Msi0Dzx6a!|`sHfe0I*CZ$sjyB@bX8ac zogxwK?nCCi^CDb>Htt_043+%K>c$1v_4H})bXJg%u9)T12bwz9PN3KU_a88gsh3r; zdH*hmxn=vU|FhF9jM}C52%&Wd8x@9x+JUZk--XPJI zpw|BrsybZVE}SPhwVt*whILzA7*T$64(!Uv-;EllI$7+63*)LDEXGFAze#dlRI9$3 zMch@Xj%nH%*@qA!qVt|i zO4-gq1mSu?{Q+`iuIf_yK5ARzZ=*B+ZJ49-_j8MagRP6X(Ld+Z{$-)_Kaf{>MGBM& zk=Ojhrd6%mf9X4`YBS!NtBLj62SiwiS8yNPqyjUZ<1qGn?MfA6N zqyf_13Op)OBF{uoUyxWdR+NT~z7c6_RCEvVobbdR zy}dFf=}7i)6g!}aXhGPl+SEJ6H)Y5+lJwV)b~4-hd^Gt^;t+je?Akn>$Odk;6iv&9 z8VcJ_>c65?Y-n`h+aARC8WKz4*0*ei=JGvGKLutX%8z;+Am7Kr1UQzg#4x}cEeFrN z`&Z;+p(^?c%bqZAI78%3)dK3zg;)Syl{~_^u6rg^?OtZiVQPUbV!dd8?jng!+`U=809cUhII&fE-3`&7h&Xw(orPt&r$lAgYy}Hz~h+= zPjkg0iR4>kXu^b+)Yb#RumAM-e@bD|4g9Du@qejKcKH7*3jTMM`Dc{;D?a|C(x~d% zehgIco-gMG_AEjQR{?8NJ;zs(U$L>8mja=wf}5KmZx2h#*za*A#JMcv@Iz;^`Sl@e zif6Co854@-^971YRh)Tve)y+W-s~JKTmZRLZ*_OahH>M=G@WeWC+e=cUio%^EeMyo z$1-7SjKm7Pqm2Jp`)O=cx^b89MdK+;ax+ee_@tqca4-Hbe~}xCHILvgFi?G+pf+qC zhPl3I_Cv`0vt+qELOx@JjXaAA_JD-;0&yhSIE$=-5KeLQ;Hw@(4KxAI9w?c7(?eWz zRDPxSTBd|W-0%gHN(2uUEMFb9)lAO1?LNx_v>gukW1@=N_jjGzz^hv2@ETS^>E zfGg^qHR0zXC+Pu-FW-G)2UPsRnD=~Ak1EfY3DNYNtJS*cW_5T>re?zZvR||IB4a!F zRkYH895ZJW)9OI3xfY!i>m0IM0F(V(z1L_?y`JB_=k^NIW1Wk?ezNS`d(&;3bcFWJ zW@!)7MruPx{1Mh8vkf;l|{Zf2ED?^z8@u;II#?g;WKiT_>{eFejq%|2e#Okp{}X`Vo5*zpc6Y?+o-;o_2qMuK$x={=m|*4ov?@Jms;n@+%)p8aHHx zki-2hV}OFLkqAjS^%d_RgoKJzVn7mLgzQ#1N~>Z}#4Rbhe71YQN#W5KY@~$|8L_wKo&1=iXL)jit)s!{9NSqHf+`3|I_fJy^ z8*Y@t249s}h2`3mlFvd{a>l2WwXnI$HOF$n$3edfxdS#z+jP|{%Cz+wXY3Pf?>e-2 zsp#o!R(fuXWVxn08}6TSvwB=qy*8|!n?6^!3)k0=GcF^(5p{AkB%E-V0+tNxhdovu z+*%D@i#`RN*(OmtS)xrnXUr_>}DPDU=_cN2q;9D-{{Kc>}@2ZPhgn11%P> zzE9d`yCaYV^y)8q;w^NJ4~amWkQdYs=ja>4g9qEb8}9>B4k`T$1==Y>Sy5<7L@OnH zgzFBU^f8Ghb25&s9`R2T(=lagh6y>t6l?aSfd?4ze_+W3UM3;RB@rOC3crx|O#Zqu zmocQ?EQGuYq3paR$`YmD{Z+(O;Fy}#**m2TDrOf=Vf6`dxE(c^csVWm9`no*bT3x1 z8D!WR5dDlg#B{950z3If%`yi?^lbi!n2wLS_5UqHG5-76>ff^z|2tFtarR%cJ4w8D zA5hqLW2we?)WJKQ!`|1Ih$u!FS#Sse@nBGG`$wO>OgzUX(3X?dXj=Mt{7M|2FjO?q z76lp{I2;^YFMzQZz%Po89gKzj&p(*Wvo$F$Nz-;v@}Rm4myPH9GY?zWi;nk`v=yLB zsJ1j;%(mE%OPYF))$hG0_HM!f=ZZG=zkWbu6vtq}8Dh0|v1)J*)3K>i?WH)1O{Oif zFq-4EaOQIB@Rd#^b590A;0yu+pu2BYch9F$k!$ADGaP9it%|KIqQ|t*9hnR0!GxW? zlp0|o$6?JCsgkS*Wf@N880;F7=L6E6C_jBk8fj^5J_~=g*K}E*YtHXpo*mj1^%9g% zYf+WS8u@G#9JZsa{E4D1#q`qFr^uwSiYC%8Oc%v4TaX$M4@cIIyW$d4+lAMdlO~?b zn5;TQ$F4mkFltdnHfQl6e{a%CiHok*YgfQz(XrXtUI+rJWgcH^nLZRe8{=VzU6;~| z@AVJd*A2F1Mjr1=b8w5)4w|Y9xyolbg%LBc#jIG5bHuYjD@7`9T9uJ^*y``SJB8Fr zV8Z9rt8;4H)`y9DFN7A;j({iTP&BF_Fe^Liu9`KFQqP@k(yfLewv;`Aubmn{JIhgX zy1nLM7kR4t*41^lj21Md|H|whfwBkq#+0ISsyw`gtp#mxHxp!TsLpy=iESDkszEs#n>Ipn_}M z$^4|i^(}HK%%SquJ|@M~Y!^=`J3C7>cG_^HXIB*#m(xP>CqYV8L}*cjo4kV&83qfk zC7L|5W@b=6ldV%36Y#Fs!Uf#uFX7|&tVah z!u`go>S6Q8=M$w`aPVq0%v44n`WK9bMa|0nh?dx3SSgh=qoHjv)oZ)E)DIVC5BB&x ze(5zAv&ZE-(_-}~#Uw~kH%$agq6`P5`j)WT64I+~0?dNJI7 zPo+E-IDN@{oSH_{FFZm{h`l5Sr znpV!Lrx|TubP3dQm~_bCFQLt61+r{gQtQ#` z=LokprR=@N?0qxyWjbWatAn54>CA(R!4EO!Sq5_bioXW;i*kVIWtdYNq#4ytqLhd= zD0*6KZ>rsn0K8SKC)hrN@6;Q7bejPkqIIjg;W5BkUny4br0=6m3gkuRu24dJhT%%> zbz#{wDHDsF8)8}nAmsF;PukGj=j-QjVr68pD%v6qFG3(FUU@`?Z@4UO_1jXwdGIsS z!Xd;3J$Ew)Y3Dm{CKY|AXeI7D7A97U>anSL;3vlPAZFwv$Mhg!^#iKSPU=gY2;T+mnLqxcb|(g6tspGa>n1QFL=a$g^dY(S>&o$JM)o67-Hv7vc@F zp^MEJ`f1nV$x01w1-e?w#a2RV`M1f)QBxEiei73a3_L^q+G=ho`K@5?>>d?v1rf^y z+X3}d57`A`!o3O$yCEbnL%FJO3kxQZ*r3*KJ%Cr*qah%Ww~)sp^WF*ry7dQ-hu^&w z0rX6Q=~rwvsU840%~TZ=@&Kw;WUy>>RgVAoOchED?+&X~YM`!4m9&$2I+;NMbp-OG zU(R?eqqNtL#am{E=&Bm6ePe7jLW4+uXzT&WJA5d&U~~~8B@~Qqa|(G9Gg$_fN$mH^{T|3e;Slq%oPi*I zS9^rsEze(L*Lz1;T}<~NBET-t0azG~>DWpA1+(B=yLPnB`{5%Z`456ati~5}Dtjev zs2BvF)zMD2t>O`h&FN08K#6tU5}7hbr9yR%Q<_pHILnJsgx=d%2%?9JpveMV3!JDv zm!?BMk84<=tD%dR8u=1!y`2>?lz*x~oI9F4w-tbt{n9f*lN%Q_-f4X~9EDuI)ZcuY z$!qX%Cmwk7j&=$Xh^{tsj<|dXRBw~rIuF#oY@Xe@P6SaO?Cf6^kzsRz_6LArgK&p` z|9~g*AD$Ke1~C6U!u~fQ?{7CtADH)FX0<9Sf3U~AX?gbBnAkA!(oOMf)@v#~D#tib z&}IJA`3l8F2wvJNrA8#K>^1DgZaYcQ0#NuLE8k(5Ed84#qKQSTch^#`#!|2*_eK}w zvw%dAS{|r^!vMcAuR#t$%SW>agy>J8m5bG$b-a_#vcaLdIVTDB8vwl z6fMl`LLsN-*`u3hG}}G#2hBrR)AZ_+1;)s`xmyaR4;w=mt}zObL>q&4b1Qj#^Zb4>D4U&-nC zkbJ!!W=f4!BrN{&=u13|7rp}vX1H?DRgx0We=ce3~C8ce@l zQMNB}EOv+Nxpm&w@9ib`M1aS}=dt?QVHh+bnGDd0(hahHy=K_4=pPGc` ztd9lI%&0=#oKOYZK}=xI$8)4*E~Y(3O8=TnRr;0awUXKGGmnN~7DP9NsoI??yAn{h zBz5cFBrqK&a)xY6W@Gxyt8oA-Web}j$~7E1!Il~nl&`DPW4zd%N1sU;h!QAvfTwXn zGD7weXcs1*=JX6ccI`R`9iE?PAK^RFq_?=*CEG${wuQdr+r)gfj($9cEqSJ#Tc!51 zV!rcFQ~18<7?PV0uw48bdHmn)mEGS5%l~ZM|DoLeR|EflN6tbH=0>K*|LnoWKgb{4 zK8l9>(GpdpKs_GHI!HKwjAAHVK@BR^A`06ho0h!1;aDT}XA68!AOa~F*dW8OTYW+q z{UO_Zg6q52E9gxaapThjdx5ENfN7*_?ssjPU?CXxvyG-*yMbz86y=PkOlUZCh9z`x%xKc<=AFptk%6HL+t!R;TNja=ZT0a? zc49?&wL|0S(RCE3wDnwwA%^rU>6<2T+>NDc7d(Y*Qz;=20nzwQ)zfE7hdO<$t0$5p zt0YMd*mec%aGCe@i33Kg>UuHwv2>*qDB}#ydJ0+x(N=`yWzIMOqq1 z5%tZ6*+eE?Eh5US{tk_7xF=+@LW!CxNWcOkkyhs`i(`m7xogjutUs(zJnU8VB_!0m z4{2ryL>&>K*&6Od%5%oeRmPyshOQp)VwVLBv`k@i_ZXDP6;%k)SV}VcRSMBk(U1Zx z8A!0xUUXygnZ0VG&jNfvbziPF8PqKVHjT7%JS_)tR4}O{O^yN(D8N0(b9;?}~Lh(KxmX!~5s} z1-en#=0qX!Aq?o~RYrzOJuo%sG60s@4N1)2#ZDIEhc_(;i#||RZCZ3l)*Nbog{P8L zGk1Uu{rf=fscAOW`MWKAurV1I@09NZ3+}?xIC)cYFmYqC)7sYb*=D z)44|=c|hcf#lC&Qq9qT$_%l~zO!{>+d<0a;U($e1e=nf^xJ>#zSNtAT|9SqeEb^aw z$lKMl|8QG>n`bxB)`3YD`awq~XJMl#0S%qRr4Q5H7tM+|O=_)WKsUiGbS+V%{IvRc zI;rE00fE_W}1o+5N9h@2}AMfY0JT z{p+l3`ldpcF!!Tl#@qbmzkJtciv*_~*)Q`GBC3#)~Lgir-`yO?#{As=bO}3w}Mf2Yh7MFu`O-rzTj}t#9U4J&QdmQ zbq+8hSk;FbpWzU;l+*C6ud5x-aQ2$Xi@8tFSQv*}L%MF~!i+UA1QNcI;gySwSsfQW zw_2K*&{;=m=%30MF|nkzQXh?{?cJRTKp3v0#jO;%4N;ia*Vhb9)YHY7%MddErj7q~ z+8zW*_&u>IoXbSha@2*T_2dOd>J_$lwLx$GlX4@>a_Rw8DPsm+S$G1Efd%K*NM9th z)~C0oc2PRb?akviXtjr_lo~DS4&O(1SIoR&F2827T|)mrlD>p|FK+L zCPS$zdz+6>{R(ISYyZs^N`KoP< zIt&^jwhQ4i?SaCZv={3u$JU3)6*)!+|gP+GA_}09^UCyLYv3=lH&#M z^v3(k6@_o>BJB=p2Tiu#03y1ohSF9F%%rM@+Ex$@4K=HZhU!*6j4ax`iUz}$Ds&}Q zsC*v7P9dOIEx%tu14gIYE{DpidVS42?2^vbqt2lPi(}RDN}=R^*pO&F5lOgq*oz&I zXDPn6wni9!w(iwR(GQu%9r>MjDKRsgfBCN4=fp{&_X141dxAbnJ?Owo2X(cQDcoT} zcR4Y0RG~Wc;%n3j{;$SU^|N0+A(oKej!?8vE#T;Mk<*Z$G$DGw&m3^a#mJQMVh!k? z^Px&StL$ze*hQb997R(P7krhK(2wl=66ZJL&ViIJ72f!Xf4HlHi7}oYUBrU{7r{ z^@&ER1yNz%H|V)s9cmU?)yZu4bcOK)4`tSdvD*6nX31oLdSqo%y4dEEo_2-0rnWj3esP1k^@GhPjJjjz&YxpvV|y+- z2Pf%xcawPPaW7{rYw7MsY&U>jldrlBQlV`I<)~6MHp8h@Cjc3P!z51zv*lgG1uePo z>4$iO!{puq!)feheQF&RSW)w!f`vJM`cx^w+C<}C+T$AI&D+@ zC*zA8NIQ=i0VNd&X60veg$B#opHhcQy!$H>PJ>6!CX8%vXp%sm(X5XJ#`( zH;SaZM=hCGGtWccDDoe%N}8K`zX6(+pQeH9PMilz8-(?t;OGf)*4_CW!o-PE<2&F`v+>>*Zqd;X3DvIHc(-Gf`}+8!pBv?jz}@>OHi( z80ldjpa@_ob4c}paR9$2Fw+D~9pg@t;vR&$k}wSxd484Fcr+(X>OTFzVqE1-V-pTO z;8L$`A8hWKM=2CiMtGmB=#I|ov5E>VFrCd^QC{1X_j-s7xtwvbz}o9G3oew8mET6{ z9rEiS*hSa2Dd*~EFtk9pjr~SK(rH13?R++-$W`$ZvY*g-z&rd(sPHGHUN4mHeC}q1 zO}HJ8VW*rMnPI1(+b2VLM7^-ZxIkO6Q>va5q-VOGMv{BhEt$SdvNojZ4I)o=!wu3g z(Npd3GjS7imn-3z`7_qfhx`E)(AA}^DA`XWFpzcjgm?f2No z<4;bpw0_e-@IEgg?McWYhB5c_e^f94&T>IbL~P&(*ahJ*OtpS<1Bie5D(KT~Q{>b< zeolGyQ+Ji59CZ!LP@M(8rsi29zWMwCKb8sk@Oe+d$w!2>R(G5hy*KYp@VJ1Qz~Rtw z8%rt0?;>VNyrnG+cJk*9$yjI zw$Vh90?A};A{_CDBF7Ry%l2;)o&RPF|0aX;Tbus}Tlm{d{{N-Z z|Bbi@}xN$YbY6m2Ir;VQPWK=5^tz(wmPR&O`I&UFrSmQZsrs zA4sY8QqS%jm$&Z&UI?4kP_lzaiU{A>QX-w#qTQH7lKljEflC-(MK=QV#fU1R>erlO zym?{>A?o5J#h-qCk9xqw3m+Lj@uMC7H%0s3+{%}~R}=nImGJvN{9iL~A4-LPOJM5% zDf}HLXa!3WBBY9M0HchqLslcBFM2U<4P=`rvD#aVIRkT}pieL2xCCkg zLB^oB^A#5uTSNy#Sr%56&P>V3xL{A!ecqY;SQ%7i*bIUahNdGBFfPiLw5Y>o-`}SS zypwqE?5X`@(aIV+epyf+dd#V=5+D9q7mY7bH;Q>qZd1xuIyiMfvj(+uDyFMPcR^J# zuXTCm>I7~N!eG)q_s(wa2!RK9^vVmZffq|ObR^3)Zvz%|tu}W{A2G0+x5Xf;&fR>} zK9bjO8U6_ri{Wg=R#x9#y#M5St^fxj^Owkv`P0*pm^$90i^Zsx){%$>EqFKra;?ns ztXEv)wE3SKvrk|pz27vBqEw+N3Rm$NHv3H&0lLngZ$jwbTn|rHM|)5sQ_QqDf=Yt0 z)3{9N#th~~q&Jsh@XNbqa<>XEn_t;3@M;{ng1Rz<9j1H*`O)}|-H-SLTqR;;_3T_8 z@%pr3U^wLFH}f9A!VGEXx>)66F+4+39>^a-F3L}{FUcw1(!ZaW3zF|2vQCilTB0!Z z^X!iTV?ISQkAap@)z}z&Bjoefs%X%3~gulSQaku{+ghqca2!DI? ze~-fdIr<;*`M)j@R24rwN)g}KLYjAZWVPyx6ib=rZ?!ziABaOW0)z<55$KRYzo)g5 zE!i!>x+b9#yeRssUUm~q5s*#jDb*R)P31v0a&vS48fSO>NWuIaUXWFO-@c~z;_=4I z8rd(1;G=>50?=X=F>45)t9xSg3x!N|!SqfSoP<)w(jARH^vaEWQT$lTfgVwikp`}A{XOWdckF;MZ>UVLK5|7kQqWA(an1(_9bFhFZ zw8}j4R*t1#T1g0;qOVHL-iVTO>&W&Lm$W=xsX?%mT0`A6jF5vppL7bZQ>~i-qO!wR zR9pwnr8KLHU0lMy>THI4eMYxLDcc)3y8RfLSp}R{OjYs#wx%gxgKLnV#UW6V89mco zM&EO(aD31~>V;ZLEZf1YlTO=W44P)w&NmT|ym8sp@J+X1#cA)plnyx6#Q3Y*Q{VYKmED%AS&*3ioQxU@;-a!^Bc>sQLLoT+tV8; z5Pt77DQc_&DlBL9h;F$yQf{NeU+XzGrp^jI?^MJjmvt5G;EbS0!u{;K?KR;&35pk4Jq+$J-Ya~ zDbk8s81OV-TXP64oTaVv5Y(5pGfCj3B7swyoTZXslY)3ne2gugWl3H@POmf`r z>N*wfYW=Em)H!fE-ZgnVh)YejtnpRCVOZQm4wI||CBa}PxTP+p^3Xu-jt{N~J z<%HOJzLfI%Iyo&by_jld4}3Ru9>b1{M3Ey+iuEEtG3eqc7=w;Y?E%a%b2}=Xfl@eH zBQ7d}hvIty&WqP7E4CQjHu&QmRQj`iqnN=(7w2r#rc z#D_c!=P<4f9ut=;E;W+_s6WTEl(6=|Uiz0Ynm@PU+xaE2lI#qAD>*Ls5_huFVhElH ztn72@LNx9IWWq{1If3X(j7L62c9-I1RB94pZF4IT#Gn{MQ+S0UKLSx(E!_)gtOic8 zh1a3+e#s$fn)+Q)s=mdtOGBJY_nK$_q_jT|IH1tguxs1LBms!=2kfkA!-_BL6x@$9 zQEQZF(v@6mhP=A7fVzfPJINJb%vqQ356oALS5WrBZt-s64=`7%slTvw7VaUgWVh|N zwfh=FE)X}!I>dPdJ+s_mAAs!>ImBP0-9p_`-GbfFWvmIde5z{XH>u`r;Y%05C!@3C z-u!Qq`YOMF7S>z&>Xv&3LVLW}_~Zet_OrlF3^dVz?B@;6AEiPx)jMqU<2Aed%h$~O z@4aUKNzMP`n(y~|@t^1aMlI!0)fOOsphG5iQ+fzbKh|zy^BS;e&0*>UXd=5+&#HFX984_KWW21&7IF! zW`cjl88^TT*JCz#V~vr6{Mc5JR&$$;e3w=PXB+h5K{F96=B+zY^3J0n}8`zZK?> z8vH-EYKbc!>swFW z@ee_Ib&H_v)cV9O4t8h zfcunC*L(q+C72c$2|&k8HT;4D7?)(14qKj?Mw*0e#o8*r370kHnyKhNgFBbJYxS(* zTukiKkaVOtX=b*33i4dP1F7Zsf}X#~@@SyAj}$W5)ayvvw>Ex5X#5BrOeB6fSKEC_ z8GS{N)HwZ?`~Jc|U9{vI+#b#CT-5Zc-VB?7M009ZKC3g&;+I?8D0LB6&cE zcB)CTRr1i3g*vM9ywvu03YWEIZid+&>U@nQt4*AYuiYa@m)K$4 zBiVZZZj2h2sIgD^gnWH|8$aWA7W3AkUDcqzzHhy-d*wGZkHeiy4Iuy%o^l4 zz%HVPl6RyGo)d)9`wa-9B9{W!DSude+ zqxm|a<-3siTu};F5inpnU1&T}QLF6&$i2RBNf@`h=O?3x4c2*JsrYyHP>mE*wQEn` zd5hKU7~CW~vLQ^tZA^w|ZU9qBJDH^baTCsfN0Z1G25Z&$hWng(Y-&g?^MFFeT&#Zx z8XPsNLcu@Sy4c^^;r|B3e^Wg3pPB4Gt?1g-&TKw3zPzlw)*^R4seWzw1c>b{>}wjf`Xz!Thj`Bdh(cgihsafsrt zO)uJ64l+IVC%(PjE`2O}ZVHSbF0gO*CFV;Wpsk?1=mn|RCP5*X z1sp8sBn?)ZL4O{4EuY$H%&DT_!C%|#==^*jr|;UrCp-)ff?xhDhkKK}HP+WwAfrXy z-v`rM98$$+IsbO77U0L8-W4XarD;EX793OOu3nb8=}KqHv5`8|fbY^0sq-{wQMW8~ z&=1tB^JVggGw}k<`ozRCsx=m<84U@lc_g}6#Z_XR%bszJO{A+aRxV6@MQ-$fn$ro- zXD}o%bf&xPMNq-AgCo5^I&~)@06U?~)3qw}h%Jd>!Kq9MudyV~rVnoz0ktk*E!v>g zQ2o8ssGl*Kdj=&&rid=y%mXl1P)#4@(pyx!FNFjFxItUNM}_@TnhBOUnN;dp^h++3 zibIk6=u$w5B`Ok_h4wVG3x|fh;==ZZfULK9YyFckssDXVh6_bZPa`(5T28G}?*V*{ zq=a%Es5m*2_4#_|mNsV~Uxm`vOXx`Am-)uL|?B6@}-^y* zqf8N923-(I?)ACQ3>53ytl=KB%!NSg48aJ%BXplRky&_w)B{9cbNM}N2QF0VmDZ47 zQjMu2f!RhWQLv#1iy_?L7*W|5L}=V8CrU0Q-Zj)|x;3cLo@=kp2_Q3vPyGDsOJ4{X zMTEDQkdCbj-{ySUsYIgZcBKA9;eOqNSgF)~qF_A+ZCt1(# zFn;z0?UDn%Jl-3wB_$8!A6UlAqJ_@<;|&M?OFrJ@?_rt$SIh9PySsk_nfkbmKN{b` z&bR>`53$nn&QG8G5vM99`MEeT!CXyHfEA zDz;IvZ9A#ht{4^Dtk^ayPQ|uu+i&f?&pG?-^Lux{ch7BiwzSzY*ZlJvbEx;xhjgBI zqAVuC3)qVdxF?1wT{f)BlbpLPmje@5*7*qS{poyC<%b4aDq%EL1>l-2a5hv&=;W&O#{AdHw_900@NKmpvtE|Xc}YHjhJajc_cxs9#?W8GkfISkVh;6m=H z70^gd7?boCxSV>)CAyP^r}(b-sk_H8XQB`Eo#N8$VmJvzpj)Ru(ZJ}M=|C|XuUjtk! zf8f0el9Irw#@uWm}XsWpIMv1Y!RCdq=jfMyv6b8keSS@)v}euku@# zlpS4RFey@GOzZc?zpjUSNPL{AT@QL3VVLmklWFuT0^9`b6iJ7yQLgHD$+D|TNyLl5 zDPu%4N)wq)b1)o?s3)?6)4GdJUNET_;1W;~!D56&N`J|6oi?z}om)R>lU9171Tji0 zOZE+|JuGL*k~7YbEzPQ0=_46`T0aqsnSlW-t}ARY6zJEjfJn-rdQk)Hzu6rt1U0;k z?Lwzo9z{sGO|o}N9Y%drF|TU~xYRA-SW@nH7HT7(mLrQ1v-Gzs;=gd0xKqAc%Kv#= zX*^?$E>B$Mnf+9YW(=P#!TwOGf-2H+?@O=!-0rC+W zhP`N>a6`XZn79h}qu-ge5?*kYF2Ez7`oBSm`=80d|GEtN>xfXhqP8R`KRQotgN2Ei z%AK$rQ65hn_+%JLyb`p5@1~?|ZL5DoSu0~}#ZBeW=Ywp5iKx)C3f=(14mEhL`|EU% zecJou=WVpk&(2I@2HK+X0|k*Zkf#DIj7>&jiBwiWN~5(9f)zyClb>#+vhkY_qYEc4 zsL$$}V`F%n3;awEnLcT$Cti4(Nr*zyNgKGz=}=f@Yjky%-9I4;Hk`Ex%ziq1_9Lw6 z($;jFVtwKNd0yNJJsvI>n%(8?fTNgVp;I~TKQ%I>93-d;U%01DW#)45S$6l)QK_7{ zg?lHcXEoB!#yJo}4lWe~3g>K3DUfLT3UUawk?{#-dY^uXFT{Pw03dCgda{g?aOk)k0>&!M443nSmDfVm#Rkg^a9PW3{vW;3_Mao ze`6ro_E$vLK7a(c{vzWGe&4Sx3QiFb4g6Au0%T2#UW6$$N7gE#2lPQJnm;HX8HpqQ z4nS*w0iq{=I)ML774`qm9l&4h;ExdVR|}|5;KZ&tTqgbsWZm}hLaca?7vj6@wba+osv!)s0_w!Mg2A*# z$>6KftRwmXLiZkbv!vy0%_8?Qf3yD9!%2%d*1{+y6HCxQp4=+JYPd$f&wXgIG3SV5 z0rtFQ`_=*G(-O&CX+y*@$M*yWlaN!_q3MR*tWa&U>Z+5_7R3q6VfqTT(Ij;C&};SC zxn!bPo_x*{P*c$Ib;+VWCMO8y4mcQxGE1x3ocP{^CEr_^%tU0g($FPXYJArrZ;CV= z>b>-4bGJZ$%)U!>IwY|2YdI%JlDPS1IWhDb7DcBL)>IaJ0pl`d$^lWH@B1_<5s2y3 zM<#e!9LmConc zm2GQFhl6%4++?&>Cq9Gj*bC4XKjp=z7amrg)q6kQBey&YZdF$&nKe<+>?}jSE*jzk@tS!CHEZ*2F-3C18 zeYAA0UT%`?VxP%ibbiuIK|SuTA;Ue4-s$>6VXvxF{ldKM=O;subjW)9k7+)SCUzrOQrC#xFm1 zfI+!`zinJOEY~emA7NecT@7CUh+3v)=iG-7_L_>=R7Cz(SZxcN^YAL>EBIji*`ENO zZ)|B5M~CKtoB4)=B5R8f6h`$6wT?gFP1X%`0_6K;Nc#uTysIjuNQx|GGt6(PC|P^* z#cn8BF<(Z7RcptW6H*Ok5O~ha27WZApu84^R145Q{m81@#_+S_1{Wm3b_vugLkVvc z>@|$jONZ{Ng6`)b!cNy)!S$<_rk4rQYZIYA>j}!fy5j6=;tRmDK@Nu!pkD)EBLQCt z(?f0$G2%Bu_nWz5oBCY_81-5U=A~RUM4^_-8^p#s=R?^sqj#6OK!=S5=(S1G2W?Uh zx<=`R10Q7R8Hun7ki#8-chvA};2kYobVGj7bwvC7D_z0(H|YEzIrCt+q9Y=*3p50Q z6=#&fwoy-Lh8F0k+#tW(Cji8AYyb~LF0CbeW`Uk=T$Mhyi#}SN@p^QXX`XQ$^NA*^ zvv_xnBWMS?KJdd$I!u23(k)^%QeZah1<)Ut7|zV4c@7CM&NJp%s>u>xxSp!P`no^| zpr+GT{kl*IuoUU8=%$8vjtJ29=fG0=fp)+&#()^|84WJ)}>YNeu zD%_n2uuO?uTnAVR_n(k9@poQC`L&0yH}EW!q9%e}&LR2qX)Q!I;y^2ECu3twZc^~F zFuF@{nHdg7=zu4eHp6B-ob=11vtGE!aJ}&^eW)#e)%~q#z+ot5(+1*Xv6%nv>;E&^ zQ~B?F{r`;o|4RA(M8`CL>(2p`zV>PeYLLksV$eil>RDnkWK;=eb%hw{*n?$97Yf0K z)={0%wnzVO6GDa;T@NQwjG5{Zf*%k70oI%zdm}05T#YHf<;nxHAB?%j2?G@{&7|%L z!v;Q&6y2A7yg}bnpkOjuUcs;Qm@*GW&!k6Jky3oE6r)ZV>uVt*mulocEvKkbH{q0m+BH9qNl3h-g&WC zf=8o>4_iR)N;r0#qTlgV%1ND0Ain{{yn?2kFi-7km_7r&zrLd==Ug-H%TZV212Vl7 zx`jvEs8bpjf+y2O-n1G3idY+4OtVs)Pfdv|3ULgo`EPiba6*Cb-gsuS57Dv{g&CX=su{ zg4bS7Lb@`FylA_v)bj1;Aywi9r*ia6^CCSRK}ZgScGm)ZXgGL>qzJVhJap#pEs&mm zWfvmBUB>e>s`ibKQ$PG7(`Frr=OBE$Rmf3pEBuZ^~11c^I6oG$JF~i zd16l81nRxMmJEtXO#H<1bkx0#Q{oTDC)7-RgH(BnT);~0vyJNqEPjalHC-fZj|qmY z^mV47krR3rQNZSqN^KMQ65EUD@)3PVDS*+@Xpvujir#vfQ}I;N0@en>&OKOuQ#$I? zmdK~V$sv@bgBWcr=^p4akzz-4Sg9i`KiHtw&qr+bCQaFSdePs)wF^T=A zV)T;;f!n#o4N-h!@eR1`-H5xBdvhrUg<;i6KFhXHkGjX2Q3gKczyH1vvmH09z8jc3 z*Z(by@LwX%zkNl2l4SpyGyU`3KQQNiQ00=;9npo+gKWM7;-omKeXA(M&;zOv(|l@h z$iN{Dpuzq8VsCC7$?(Wl1znJcD2ac&!nXY2ihlUPQX=zrL14*EI()nA!_xiz#yzmz z&ch=~nV=N;$zJBILtFX2RP$a%^Qe1?@1fRu|0sw=r)O~kAuem zQL)I_HvTKJK~2DbSY%wA^cCV@D}Y=~CbmuVigyqSP$(u7_f6~yWpDssDmE6IPI5^2 z7y#7$g@~0E=Ot+tvk%#Eh@}(j06d27Fb>WG)}y~kUf~U55PUoLCjk7)D#dMK()9yI z^dr(=2&pL2eqOUJ*|PwRp455?n1QPNyd|XswRVF;$8(lF&e0Z{t_xV@SxZf%V}@0; zN`8S~Ul|2U@XR9y0MUX$+3H=%2Fo8Kt;_qOFH$Q2`<2a+QM(fEvHXUIa$Dsy)7GbX9Udbs&yo;id9oUf3iemiE#kkIj zmKZ9D_v0x zqT0+Ub5%_V>w&_J27Hg!6Jy)vlvOI!NDUIE>SV3dGi=7#I}PKej%!f&+lqHUF2=5x zy1!wbr6~XCjk4ILS8Fh9hKrV(Z7xPbYBOz150a2tuHnwzT=`_+QJ!Nhm!lD@dB6%l z+ZE($W(u9q@b^uzBGQtIv4%=xakP&Dvp$+99>mRe!)M^x_2mhJXN==fE=aAK<~hT= zy_r5WpAI&8d~|BXM4K?tSfDv(-CGRroAPwhfZr#Z-)b^pNl~#FAIIuv?>uYax$4oW zuH{lBO|UAFa6jd~&~TY9O5sP9*^zyecjaX@s!W8|7eDC*!@@+FZ^)wk=5AJyJYzGtAzS%bxN_7UD>s#ZrWn9@TJW1%$Vi$ zOOq*jb3`$M0F>?SeYnPQoH5g!57!$59)W@3;&PEU%>E@~kx*uS#E*W66}6 zoH`O+-QW&wk7M$tzXjt+pc~*?oYJT$K$wx*HyVEUhei-al|m4w8fnkRSdUF!oH_aB z*9#x`WATq-9|u*5sHEB{g^VV|QpIurqX15ExIxHRY;md(kOFwS)E?sMu9)nIJUsk( zeK>W^!6lJ7=U6-dm$h?;h3Fpn9 zRkw`=$wCF7$&#(rz%3eQbs1-2KsJ9oS~afRRD7kr4*M|u%TwdIHdz+}I}msD z1Lk$w2edtvl7RA=b5QsW6^>+I>OCY7k!=IW>SR8MWHQ=<_`Vm?PNC-HF6uoSkb;yj zoNj|R6g@{;6AJ&XyG#Zetr2?6IPy-*4FhWf2Cv_gl2=9yo?z(9wMJ|)nZ$g$WO>&3 z+5L9mk8hXh#`vmi^bt?eH3{iV^P*cOxvFS*odA+}fisis1zSlp=dZf`3d1p+GGfx5 zWJyc?g=<3!S7r*dAwVFEeQn2 zUlTd8imwA^MBCLGFAdu>@>K|(vZJ4pv5uX2o!}+Q1&$1eZtbF4{AKZm6_SYRHN-r- zbI*1Zht&h?mcF}UfN_#iXj!GiJW|s=KWuI zkoAgL6*6>Qy2Z{wUh>c7_l?{03aTbXqtm9>w!S{`(B~&)EDg)VVw{#2ZZ*ePBJY!ED;f*FM-s z1A^!ai;oX+Qa%Ji9R`KU7rDkX>6YlTg4Q&FOO=aWFmUuXc{y%mCCVSfIusQ66!-`0 zTLbs3abziD=m!H{ysxK5CSL1q*J~$sSL-CAAbO}TXaS$An4kkMKnKG>Tth18;@Sj$ zQ{4wy5T2hGUn5+UuKB(r9or~&7yFOcdmeK_;+AE^HwY4oB*qJP4BjCW#{x#*?_!8R zp?+ZORg4`62JLS$_Tf8lv2@}c#E+>vxUt)S_1JHs_I^8n!F!Mgq7Q}W6q#lk1#FtW zUfFh|u;_D3@`Ao^w*|(`1xp(6rp0ryotZ=Kn)9fmsfJTFbLt26sTH8t$1GGw3nt7b z1+n7Gm)&@Z-FOAntYwESn=K|`DfI1Qw$f*nB3cv%eJ2{NG{6FLHN&@SfhN;L0~Q`J zqExrs>FZ{INna0JV;QR>(!fAai|W|?$IW8%kmmA8(o8!ehWYur9lurEQRynP< zASBbo->eY~7oF*ucDM{u=02S4nQLbLde`2xhpMGcagka*VW5$z5lLB3;UFX(JTu`y z+`+?S+lOkd5iRUJwVwJYeG-9e%hV{)$#5g1?S4^B*;QxOAs#1k`}Wq73QZ{$Xht~_ zKp^g=pl7hg^vb>Vedk#{kn=$}Fm0m_7H(5@ME}h}DUkFc4OVh99ClbNvFDt!EU!cP z;ybKM^a^l95^fJ(jh~9*$sozHFO7roZfdZ;Z{=#FN0Drx67!DuOG(lYHOf1&l z8ywMMe8Z+u?tLEEdyv$loq2lWOdfb)VQ=+$`o)(67h3xa{{)6Mp>ir1R6x!MUBA~8 z5&XIDyQEM++5`j$K9Y9S(fMTzv9(eW%RUP1^OQ&+?W&i1H)4L)v@|njnaK z{C?%7cn~%Gf_3@En*CFGkD&i~InYaS?`QITVZhrg~AjB0b;RxE;- zNxN1f3gd0>C30J12Tny+@L|q)F;`!w4*D;e+Jikb{XBex?|(42RCAy4^q$6T;2TU@ zMQ;gkpMBWkjox5oTcvag z$kfYU0KBr7?b+!Po=L)-iQm~h#5>liUN+evyJ-1&q*~qKd_FVBcLB8{Cv6&qZxjxN zyKYhpewO$1NZf3YaA1oWc=cXOHO%k3{|W>dexEvRXcji&0S0ZMzXa|7gdqM)Ec-7^vA@>S|9JI3)OUbL)NgGn z9!2vcP)dTUd@?dI=ni(G&GP=Qlw@f$4|3c7vNDZH#=jg*n3!6>fbs?MZGrLm5E!Q? z`X$PBm@j;9_i!0Y=K$gpg+IMBJ}h(&Lx-Ux;;1m6dP*kYfWtI z`czK-L99hhpp^TUAXyg|-21RJk7Cy(()fm@_+m`nM&^k<552h_Q)+KFdrgK-(8)a?FT@fzqc8uUM|hm4C+ zA--~fSif$(uqmFn*05U8I8dXK0B(#=M37CToF#J67sMB?w{oj`Fs|^ur8$SjDKDmH zv91=h>kE`VSqLUG<+LQJcfBGnkoVx<>9U*@0mqlhQEjK$DymROaiz~>LR3eetn!;n zphuA~;5V)_-RRQNw`=knq@CxIa1r6^pjk`&(MUJ+P+A;r&|&1cZ?~^oq`kJu=vI;< zWmq6g%#O*j&S`JnWxXeXZEx7y5G-8tvw|4^7oM@oJ=^2YrlVG2)9FTLG#Vo+n{;O2 z^cr&it$<=3KvE&1{o;g=R2?7D{VUqGJ8SaZos?zI?lw+c<(9lKS#6_ z#6#t3%=Y9+@+P{!Sz7j<7XHn!6oI40oQ4{H1GTqmW3H}XTP z%~ey|Up>1qdWm(5G+hX)GlOEwLBh)SqhVC9g_elQ3y``k=?(AV3o7r5Lm>h+`s@-7 zrV@b*f+}1tz-T(gINO@|A$6nO(+vw5(ZNLRP#xit~sFZ!zql6vIK2RLa^w7oga9@gw6 zBGBbn%VjIy62)FR_>42NyNF7Fegk zsE{n=N)$fQH-C0QFUav#eAbnBIM+apu8dnfJl6hxzTd+~#nYgtJ&?ZQ^cO1Bf7X0r z|6R@Z?^LLNRebr0ubSw}=mX;vHD{bbIa?ORW}H4P`30l_-NY>+KYTVMjcaSc!l{|q zT@sVZ>i+HOWd_t=?Y|Xej-}w~H?4)Kb0e)c-;cd|opIb--BtcPe*yV0-gVBP1`B0K zkBKO}!Q5c$1>Iv_3+{Y~KN^PqUFA|NXUSi`06zz<>pbYs&= zIYh58fc?{baoXr_f>$(y!m*No^_Xw6_9;8CgGd0rSS`|Kkt;=TugFd(h^t|m{1Lis^}!!sRB@l`b4WaV=l#l<-9`11qHQZZ1)0n7n%~N2sfS9KJ=oB+0(jXwL|t{ zXD5ydtaBZl^M;YkCTnamLzST+H67hHMlB0^gaK*t^fB61$&Y35f_4g-){C%Gv!NFE z2dnPfxyx3UPc!(_7Z#A}lt)^y zrnE2E43Y%N)*V~tHnUkQ1%>n!eU&wG>_57ZNiQ)|ashHhWN8IBKT&k@I zI~5;4kyy-L&BwR0tGN9XUN=7 zQ1@2lPugZknRqnS2>Mber&G6J1nY6I;ll0K#@v=kwapnYFHVY-j?T50h3$oU>wiv? z{wl0aTSi8n90#LjR((=89oL%>sX;wy{SnVZqvi+KEAO#Y>W7nDjWV*dLA}_5kW%E@ z1x&3HeDC>-}_;>IKmRx{96`ebX}fk9t&nI=0jjksrovJvRuaI4RA%X^Gd zOD%9yrtj0h^1R`n#AmDLe za@zA>M{3P&j$#{TOT;5&Nm zJ4}I$k;tzVxSy@-YfKX4w!`MD#ipbN_OnP1kxjXXP+hVna*0yBL=4qdGVoTZglO?g z4T_gC5eyimWq~=KIM0fTK9x9_IEgsgAZutf1f=o;#Lwa?+_R$S9EH@p1f4p?G~s+i zO5-A<9&HS*62=k}ad)w&A}fLwMSVVaO1azjpJA>h4^GN@%_>^Yt`4EcsZ;p#*94GV zx+t#Yqf;V}^kXwS>-h;$F=}{k3gS!Uh)b|6U4>ABUC-3A*EVa5OJC=|X6~(f*Vf5f z2M|lUrt9HTcddWFQT2OoI^_2?trn7n$l8{$_O}OvGX(Cw{L-<`4waZ&(u`OIseUZWsNwYXy7 zOL{H4@oEwH2CfwLN}1&?aG*rKq}2ATa+WY630-UjuF?bi!L+fSW?b&9ojF#3@3 zpYjK?-NOr#8(AaIn&5BJURfGDmWjLazxJyou|+dR_yX_GF`th0!xs1w?r{a)RZ_e^ zp4*^3;TpXWudNf^unoOTyZt1&VHRVSZ&!%oBI37m`Nr<3L9BM@0hU#cE`!=Rvrn3wLFLCCjOtZ%ETCLbgAm@k{> z-zC5B5dz>ND+HE^33n?|*2#dtAp5~$1UwMEK=x+bnw-iNN`q9kwJ(@ zjMobj#A~`(6iAMPxaU~=Ra1mPy;QX{@f4tH5=Rx}%GUg)vesRE;j{y{b2F8X99DF)q2YS`zt4z+^J435$tNm!1{(N>j;F~j-`o_i84a>(_m)nDTg z_J_pfF-cd6d=got^-YJ|%gLaV-5)5sHEm;38HPtPXvWazgmrVxh0m5Yxu zse3YrulXhzPRe0D25YF&-JmYU)H*X=gdh zZ47Z{+LRmNw&IB_Y&z*udTfrVT7ojL=ji>ygUA^~toiC@{Md{25exlXg?mbWnX?Dm zB3GKRM`$6NGLLLKA(&nU1v&h(V2^_Pn8`2H14>K(>2GW=qd!oP};3P+E7${4$LwH0?|HWZr<&GFeY;WRYGvFQ(wls$O<*3NEKe1&_55P-?bpv!xsD?$-P?r9EwfMd3Dcev z3S)N@L4!1!VSS?Ha|{;@?g{+|`__A+XDf9*H_PN9hc1JtCHG$g4*v;q{! z>!kWiX8geUS9int|KV-~ZLCeqOr7lY9nEa4|0sk->}}j^{@@>E$V*H1d_ne{p6l=b zTJNQdq;NUqP7mED*(aGTM?qP4(;+?QNIDwCT>OyL<|==&fpj4n5=Y@jpk%ARf7+Je z)~2tcla&eb$#6gj1Ox4OfxgO2FHDYG**A0?`qAA`jH0fd3T8JGcE^noXYebb2rpAY zrgH!vdW^(1QVnv{Y`pChnlG-|?$R^>-U)rVwtz?RsvqC}>+yz!n>fHA-@hR&zF*9s1^Bw){51W;C>&_D+|-hr(xNltb$>XK@e6ZY|{t@LK+p#}pP-fJ;D zp7DFskLMGQ7()hb1yR;{*)M~UnO&Ezt2f7n(5E| zrcf&Qw{&c&zd0mno8M06-$axE!iJXmX7>N~`~T>10hfE&0F{n|)(5|5KnhCwe6XT` zfCbQW3v8(bL<^8m3uuCb`Ye;_45^GQ)ns%=35cbC`SbwtLeXn!aH)@)3I;VkGB);n z;_lqx`F@4biMLYH-M>r8YTK7w+ONfAGTo1W%Vxz4Gsly!?4BiO+29_az;#2a-&|U^ zf{XCX=tcVkVrsr>OX!ywoS<$xsPH608qj}6h)n5)T0l9|YFIp-8IBg&u8)rVN!9|V z5iAA}TT0**c(*P0Xw4X!Loc&>sqIp>qj}Hvh3k_D@#+hf>-VZF4YPMbCC-HELeIy@ zsg-MZnPb)Ov8!;}YNa4%s-ac6g5>+VH){3=EJ)O<2%)X3}0YcJ>1GnWb=*am2t zYWOI!k7i13GhGT+(54=p_M4)w?az3i-S*cJE2bS#k4fLr%-CgO80pwyRwtA5@+7)4 zkX(t45GV5P1h)rpGGV1iQqx0FmK&!-W`@tc>o>uW3@ zoHCEio-!z%k;jbzZUP?ll zsbuUhlE{iNU7urK(mb@03~ee-Uyy`eA}cT(Z`7_JXO7b>SCF75KsU5orlrWyq2`$S zOqt-8GkR*q^)oy9(DRkvTqukz!%zQ$^GW1a4Z4>sR}r)Efkl`8#ZaP*Rw-I}*vz<7 zt&m}G{ZvQu$l&m1q9!|TqS`?sA>_S8^*4Eb8;#2O(4m4MNwk)fryJjuXkqT|=wK*U z3WHCwLQKFTOI$VO@w*NB=w-||^8tPf#>F7NzsK)Dmd)aQ7G6avBW#U$b0?_a=$ zig9TTok(hQREP5!%-fjT9UwQ|6W3hRl45a|R%Hh0ACN$wK114K@gI#MpEEh4otbsF z2Rx_R@@@K(eT$mVL+g-*Z=qa^s}o@p-KNjxs0p{+-+@_(5ys1&l*9yV2_fb(qm2Xg zehq8zy*9Bxf%{;!))_d-pky~~Hv$zPJaIhoVy#`ZUn_F1co71{9~ ztkIrV1Ws@Y2G2!yDC-fzz~J$6nKqvNI&ri-$dSE%Y*V$2ZIEpc*&2EJe)~?i3wIJ1 zD$(~QW?T~8?{EyxbU@4{0FR|C3W!WQ!Tb1X1V+o|c~$utWc+u&Y*Qk8!V%Cd!vj)*C@=?K=C=u_dvpGQ?k*5go9No|Ru zpoV@aQKC?ge=jVaZI+Cqw1ce-WDe>@!uRjp3r^8>6_wp>$Mx@diQr zeOGiLfuENuP*Dz$ghh;bMe47qIa#=7NdIEgiPNw|ymx+Or%NCj5Wg&rE!0kkVa^AI zARGn)FGCgSb|lK5XeV$~nqS5mT$Ir31?W}`8uBY{IE|SoTZq?x<}-zNW*eN2{)v*h zt=okp+Qs}sL1#ce-iR2#WA_SxqgKSR@MV=BrC~}73d+@TGsIue6)|$+2XE!Ctn9og zS9xTlb{X$pL9@-zJ!7bg=B6qpnntmTmBEXsHH``?LHl7Mf#OnQQ`fUk;;h~TI|@Q; zRN{!QT3575EpdUVv3qJzMhop1ndrt=GcUQxa1q$7-?g6HQc;rCPUEN3)A zyAtx>Cc@Yb(df(k6C{r84?M~yS9}ByjHe>aDv_6Y9zgfJ`j$+sYQ?7jxO%}fv5|9D z@l^=7?3G(f+yYP#c$+OAkj_Ef-#EVO!;jgSp^VL$kSN)f2&$M^Uq?%nPUKPA2|lm% z(r6$&b-Kurl}jauEUFFQ-;Hklu3RMS9qs`Jw63ea9lc}v8|(V582rOKi<$w2#_bL4 zjrEQGNXruBrDZ`GkUe)ToFE=i<-Y7f16mj^gEj?ni1<15ny|iB87-0;tG~x%(IvZH zKt1G!*9PjL(^^j*IzFwXu`Q2R-XncbElLi~(c8i%=co8cfkVO6Yn?~ZPA1r-am*y7 zaVAC&;F>}~3OoE#B+6S=9DCR#Xno%t+vTPm4&1&orsveeq)_om{kqR`k8=E~l14Yw zv{W{GSH^UuHEv9;$QSk7jGkCj;QVdi5ki8+@_mbGM@!72Ep9z4*fmZK*O{0}2aVza z>GWK!G>cD6-l7ARIfb<`y|7*3@G#81+b0HWNSST14eChdF&x@A7HUCCKAbS6K}yQt2@43_WK8uBJ^03$r{Q;BUlC3cVv+Ay2r2gT6v8V%u>XK} zOzYglbPJgnCa~Yc;s}W+D~wT(OAA1RIB+)$xsbI`RF&-gY!UbZTdx9LLmlb3oxZp8 z$E^LAn|=%vV4#ipOaAu1<0O7NMp1hkC)EpgS%ZjB&-3 zO~P@;2EHg}^vKl+p&7QEK}xhZ-!W`wZOguG(QP0Ji36u2CrupKNj8L9={UYT;_@r6+$%mzQ!%>3J-wA2^XJGh0^F`orte;NZq@L+rM^0Fp<$j zs?pnDNyXNS#l}b_I(IdQhin2og=4>9z;Jh>n;+Qcu^o&B(+t0wrkqueZoFiY;GSGf+*UJ7#$iwgPOE16xJT~_?LU!TQ4N%$= z!N}`(2D>6r&Q~>{x&Bo%?LSSH?f;kO0sQHN{sclZ{(+$TFBk|*Kn#5k&MEp4f{VKD zN(`(2N?BbH(wlU6ruJRRG8TS|~xofD!gF@D+!MAW?u z(_dpB)S;}izNtQR#As}0OhdbNmBn~?3e$gZG^4a@oMwo*jm1(maguqQs^edAMjOjRz5qtg%0XXQB}*|S{s6H_GC^I<95)6?do`5m zF#3m}&w0AWshb}QK)R1{Fy$QC{c#Z`n+|PRdo+_B)cV_cV6C~dI&*qRm6)`goBWi& zTQqIk@@)T1yR_NBH)afcK3nM}=|(jctJf=~|3i5xcd_{sJka3m{}!X?{u_gn1{NcK zxJQ71zJu{^kN=~l%~1Hq1o2*~x`l?iI-&dzo;q|CUz8MdYBe5g-W%4VXp-ZT8iJ=n z_rrfp5F1QD2_t#%jkWKOwAWrg-MxV75u};*R_Ev|_oN0n1?_|=P4O8ACsEM^39X*N zLbeknG$BG-ZLVE42#ZzdyEM&iRlr}vBwu(;8UD(0kkx|0s0%n2*GvH$F!+@$0n=!0 zH;y*rxUx}lyi{Z1>bt#AVFQm8k&RA5Vl;Q^+w*#A6Hvk&LH=Sgjz8O`F+iT2t(I9L zO)8}eUt+Qw*&mC}i0*ZuFLo`qF90#qF9n+Fyy4uN58pV&2f1{7O*F0tDUN^(FZ!+t z^j=5Un5y^v(yeryyggk6bsYx>y3yt9#&QDTZ=9=eJigeTb%@3vg(2NAiCbm$qU1S* zS#f;1l1bBW*a#!suHfM&$ak2oE~C-BA9|@pN2Z!M^@HRw!{m8_K3y3Zs)g1Vb3z0J zih(%f#S`jE6|DU(Uw3M|E#nA`fK7jifd2`=^8U@~{=asz|2S?S==#sR8Hh|O0(%w% z@1k&lv9J%pe%w@Y@zBIM!sr&h=E6dqIHuoX$jEsRl9uwEZkQhXaqysYfh`NUNDng% zhR?*^MhlCr%g?80t7i!|>p#Ci(EH|N_A+3IQdQIw`W&=6jmh1(t zcCS=2ljg$Pq?raBBFz?XMZ}BjtQe0l!1LjP(x4E&`dxjj3Xl}6t=d8#W~Dh_iYvA~ zWH55JziY+?D6|%auQwj@i<#fx^l8~@b!R|lGcaG3Fuf9V!Sh6pOzlGVV4g?PdbMP~ zwL~T!9@Sh0_Eg>Ic6iyBKoEV~+WC2Ia^Sq9!?tw%OZly3MEe{jNhP`OI+`0(Ql>eX zGhO4L?0caEJzRGKwoI#&0T-Hczq*qVjTcIJJB`BkD(YRFNVOyr-?U10ju1Y(A<{TH z=vgIy50{Y#$y@`u?Touu2NX@FYW!PutV%wRJ2&W%8qbF@K_nB{UWCi&!nYHAW zgyAj345WJ4pRi33ml_zT8R4O12w!~l*_BPbZZFmuf)4%pi$h4gYss5!nUQQ{R*S81 z?G?S_y$7Xle+Y>v(L@9|+jnZEID^C6K^&Pzt?l1AD`V!dOzT2LPKSB=)qQ53fa;Ai z%<7EIn!NB8L0}iJ39nUJ?QL-FwrMeG}20 zt>~B2z-oDQLfD@askBEAQ!cYZB!V{^Q?MD81(Hf z@X3x1V$mg-=jVA-vA)HLlh7d;s`A~gRd0@OkIqHcV96$(tzRd}n>%RkPEOZ+d>HiT zlmqfduY1;1|4qIh7Y^PC@2IrTn^E(8sfmOhfeTUhZp_LJg&_ci{NK=)6~>CeF5uJi|W4jB0P zA%vB{OM1WG1x8FZK7r<#peYffpsfY1E;G_+sGFK39mrmH5o|;;$_yla`Kf@r%{wx< zR_Soop7Qv3{EYNrT#m-DKHMotT6lk1TwpHL@bk*NcI?bnq;v70!{L@Q8BU_bZM&k* zg_!+pDDS5%g{_b9$0YVH;bNM-$n$qi5)qhYM%UES{la}=MaYi$w^O~lZK^F9cJtUn z^(nB&8H0lzWA=ysl}fJK(f06J7XHOpsG#TBd{0s@_Ss*nEOWhjtFo2L0?@QVZQkRa zqBjS{j_x`0)mT`17IkaxD-FY=@x^U8bS6_(wj1PTk4QWR2V1}t4y&MfVpbYO_80k< z)}d zP@6N@voU&xVKjeMnc<%9P$r;@XmCt4iyuTpzm@ReJ7hO_7iDZvP#C@J9p0 z%+b>Lj~2*p&;MMA^$!3+Wz>FI3H`0&RIFM~A&%3EC|eqBddOLW92t~UTEY&xDVcLa z&t!pK;#*p%JRr(3V-Lg?f|c48%4Eqg2m+}y6r(2|qQ?;gPOTG+KHVe#mvvzZbpLj# z!#K}A*E$bh&CmD!CbKOOEbcD-`y24EvTd*GM(Pe7>IkF}lvRTf2?1Vy7`1HMVU#jcwbuZQG3- zHMVV=jnyRI+WS4{?04_;em!F(8RJ=5zwT$=6W6@vH3>^*_Zz?@dg&ZP>^2k9KNGe~ zrqp47f*ZDPI1Gul^^A#(?pw&>B*aK$7}38H-!FFPTDSc$q}54GqC25rdl(E_Hnw=V zvQgcD30)w7>Un9rcmdtII4yq~I5u!kbzDh;(CgB6mA$RN!FzrE*wIII=>gqcseEzd z8uJm5Q)m+~x38g8$Os8*uWnfS1}U4re*e-9ziDeojFwZ^^8CHSCgZdIOdptxKdkc+09abUjO)>%*5ev>k z0bXWxo;da)=t0`%Wyay9qz*Zp(--M=tQ8sx*k_7TC42%! zx6m`zhS4qRD(pSmH(v*m425F+NDMkS_HVS?o{?JwqWHRXOmQ#Q7N$CMD&J$qlqftx zW8@5ZskS8ca6l!GL8gr)(z}I)t&!^sN8_F0i`dRg8d6LgP^DgA z4vnOqIuKqF3&Ik41L+CqWn^@JAcpDCkK$2*m=L7~c4ZWUxLciIq_W=mjCi*EibRjw`9$RONpXhC zRe9e=+^sX1!hJ$vS^7EPipZ>b1|>+oe1dXg`g*Rh!d3OtzZQbT7a)$+1H()^)W2h+ z|I`xrT}rQFWNBky=IEwmuV-NK-|O+jY^;sk3~a3Q|GT>=DJcL{42Z7DaF(uTxDlQc z(QcI8B76O}Mmo0$X@nBa5GTz5RpFK2fv%-by=VyB@qM ztH+#?fiV$SFW-U?Dm%*8Ataf1RxZK|dJXOa$I1+ql-2N9E#{aF7k=6gFHlE6ZliT{ z))ApBH0m2jXab5@ry^85p=3X1GX{lvk7Io})d+|d`9?3xvuK(V^2JDd+e3RuMz%hI z5llZ+b~L0mEHFCcjwt#15yQ=%$_;8&@z(_FAFX1YEP@Fmpr>#8TMqwENI>;BS;N0@ zfdADhCi$~h{J;MBzlygi1!;>_U>|vxmc4qla6)u_!3uXqaK<-?FeP>>qFa~lwQJy^ zu|0`(s7)Uz{=>T;uPA}=^zliakhmXgg#<1buffLozQc{PpriH83pzIn0S&cQy&GMd z-SvDcDxf)V=GzSAo7B+dMHEy}bedR?xsKTrXz=W=tc_mU0Eukc` zbg5!zCMNZ9j(p4e)fcXY#U0P0e>C3XD|c>2V?~ZAPomCn1k3$RM0)Krw4i~3i}%*V zcYlu>slhP;Bp=V2-B7s)Bd#rrkzv+ts&fSC9cf5EXlTwhmuQ4lobx+ZZ0%$srW}0~ zO3(x~S!ZRAumR#l>#Wf4rTJik-EEXA-ww98w_kiNvul$zzWYsezBqXjb)?qb#=f81 z{ut(sMo4xXbth_(9GMcz)?vsSn&cS7M@Vroiq;g-r}l3BkYzGRg+(acB)8q@F4@J{ zu3LB;L){k=Y4&~RjdpM14Y`@|YJo!GiV(Lj?3`Yk>!@Eeo(OpnS|E1f@JL2lHG&fUSEKdAF$LMi*_Wf{!os-wc>lI!XZn6$@ z02CLYUW~A&AT=m>aJn|%Kslsr7rJ+*$ta865kAki7J6jAlk1Uq)x4&|P^HtAwkh^d~j%2f3D3|7DklTl^&X9-@69&y8) zZ+|0+u7Yu~+DvG|Vmfh}L>NB^UQWz6B9mCTk~!tFl%%AmZpptxxC2!E;-h#rmoAfI z-+@WEC_+ENOLLVqSxL15&?cYbBZpgI@|O7~tJsfEEqLE$@tC}n6!!%4dh5lEoGb`mU^wdsZyWUyX*xZ+1Q6psBFUo{eB9>> zU#~W~&B9XZ6>y}Fd3nJN`hKZm#MTDo?ti^yv(nwi_K`B-5-^@1)f)6C~^hau^APB@sS@7d1o%f%t@p>=XuZGEKhDc!J!||&(GcWb0ip>qYS9RKTfwrMrxp*- z$1ysnY3ONU08QJve2%JfQi~E*kLxw{eD~2UL3!fjPLMJd=S0fYEEVC(@eE13IOF}n zbMt~5;rcBJ6;{4%>gIYAHH=keDf$n7;A}DW#j=_X=ArO?!fnX$pu{(IlNpVsK=~|M zhO&+R`}4jqVy<60s2>6$PV&(6!jeVd8f-ZE_H6dh0uk499l-yH5Yip2$fLmHzyrF3 z|9>-->Nf}Ww`S1v zn&ykq)*<7HgrHn}=noQrr6FaakP|agB%lczuqQwjqYyooMi^Q41|OMLFon&7Bz-;X zDCt!VeKm7-adtL7++0pe%6@vx6Ad+uJF1)FaGw(Jy3I|)tBduEJ_xv}P4m_zOki;h z94?T;Gq8^wMo8nDxaO^!Lb)vr%FZvjIUc-?oSPFOsS0#Pe+rwsO7M^5yVn*=k^?0F4*ra!h9==TDn%n~?qh)Xl3({$tqPm4-e4Q4! zyQM_XHn=}Eey$J798(vyp>s>kdL$S&I9h9doNLb~ z@mn`RaZ=eK|M2y!inVHES=Gs8=BkT%3oie_)ej+nsp;*DwVCyH^Q1P1yX53AF(nlN zCQ|+|T;nvySjK3ll^YkvDHG}7>+Kt}t=$QuHpqq+Ul%tzjkFHS7qXpQOe(BX$%8se z7iV`bCM-)opG7|g@YoPxI|vI-V+Ph`GE2}+>4fzKgu(i`Xo~B47!XU>wJBTiSgA3`Da9bikQwmg>PAx7HRF$fpinX{ovyLL z9SwnHE?*4fgu93>!!rS(c}NVTIIU+{xD!k2w%5eIi0wsNrdnS;J45JC8}>~i72%F@ zy*wV>p4Lw^q=u(-HCf0AV}7I?NxfJ-!Zjq+(9%~U34H#P?ZlX7tATd5h>65>pzjH`K3}f*GvS0K%E6bkFS)5wb}Q71 z{_zZO{-I@D0RK>;)(PrxBYJ7I@q8il*`RT1;~_^HEs|My^wnXKK9U|oj08F>mIwv) z#4vkxrKu%3D#`iP6zeoOj6>VuK|;0r#@9EJ2U zbrLy6F=tUCi7~Y6fnABrj+&(Y<9r!(c>2Rc(E3nQ*S}YIr4H7MBHH3J?U5Ft|;0cq2MBr z350)9XEP?fFwD_VMjU*;n-q*aS)UPSXmXC2P5WrayQpdEpws1~F-wI)6pXr~lZ`?8$#xlkB2qX&H*TG%H#QlAdO zU8oNBSU`(ITz-z~$Gv~HnN9DeVU1NI9R!>2D`mU}vy_NZC?#3x#K~z}^&~ZiLuLk( zXRN@$@RX$|@oDcv97B2TUBgFaLt+s{Q7VT@v;t6dSjzlc)}<$HS!1xQ&93q&9306Se(OK3^$zyo3-|uOFo#eRTedJPEk0hjn0n2 zgk)Z*a8xQEdp8!mL1iW9r}Z+8Zi`J@dLC>sV&tTw&NE!zqK-RYDi{vJpA@2A6`w>a zyowA$WyR$`VSbrfhK-I-ScXl@$`_XHCVw;?)^7$4k(q-#OP*!Y;8&g#awrQr+sl8N z6EsnzWji&a0kPu-=?$R+5CU9weX9kaHhdA+V&q=F2+#!mzZLpqiGzKTR?l9Y1NXoqx~Qvaajfk`TN z{EEi5Muo(!I_+3G85~GsupqKn5%=W?77NAV_L0&!cCzQ2O0lV3_ypc3(?vxj6{ALU zlLquz45upAsi;e0TkAUCjA3&Ejf2yC3wCqyzR! zE6bb2iRb7RZfX>G@B)QznGIvUD(^=ygQsyP_Z}I~>#}=+cTkvL8s7rUZD`$*4{V0F zW-0`A6rgvFAQ1&jli4Xnk21d)nol#9*^kIaJMv#l^cY>Fg4JcZO8_uy5n zSKKLW_|jqdzE|7{srb-42ik%i;vl7L0{qcGzK<-cl%$(abuPOmagOeq2&lb5)O2@6 zPMMj$bNW!Vd^~fGdevC_bNx%|kpS1neOcu9c($bM33=^AdF?<4$?_3|t=oZ+Y9q@d z9!~xvWS^HQ3|7AML&L%xBRM&*z~q?uE6r$lc9gfxLYrgpRt(62X%B$7bN_X@mz;B| z$^~)3HX@s}6~VYa0ufAdq_wzu8)ZuS_XDhTLz2YkH@u+>i@fkobhJL6)gtaKr>PU0=s* z=2aoa*F`rIjv{w}HEWBsx`H3xP$tb-K;u1a~{~DlO7Lm`TLbVN*bq|j@MP=9YLRhwkw{zn7gX#{! zn3@~SW_x33=Ka1hmA#jBtbLXRok~I0g$>;?G~16BOV&eXi$Nog7W9=u!VI$^W1Mn4 z{V-G~`=hf0cRcl!gK%^uJ*8uO|LN+y@&;EH+esmzpR#o#dIS-%V(22}h-7uJj5MfE zb7a&F@Es59XDlv>2$%5n>)@J4*!(Tk3Gb~YPm2epjl9wEa!%sVUi{947wU7Qo? zCj3M+LWu_5rUM%vtt&tq5gDJhe)8NTOGGLK*rCc5%k!mKiNKY$+YbY0+n2k<C3rVXw@16>7?EG*R!_u^wG@{kPpJKvhs9Tl3Y9cXB+pMJ zgw_~teuBa{OlvGJHC8;@ui2_GS1M+;z%@d^EVQ{u)r-imE_@=5ov&924m!0IaE%A5 zz+ik|E~X45i6(?6;>LUsnUsoG9baSMDa+zcJvAxkzTAyMp&*=9MisFZn1dA2U84OoBPyrUWWqlRLrQ|!T z?HKZg9R;9xPHxoWZg^v4pzL}d0#2z&cbxmkQTXH5;Z^l2jgF*?cfUoW*f?*E7rI_L znYoR>5N((>VV?2D3~-T^`R9bj)ohprHz$!U{n)Nju2s%?j)ZXR9-w3*>JM&EJqA2Q zdLXHKUAC~I^3Swl(hFB2yc`UF*^??Bmg9=^>Q5*$Yk#2~HzOjh$?8Oqb@Xf*iHa$W zcgQcXBghuNQB0ZSkBMS?{i%p1YbU_ zzC_(Su-R&~^jw1nH=fENR;U6P8{~;{&NiMd{x%sa&+2GDbYogVFI;_(c80=^{$)B{ zHbAhYq1EI=qFgYR>4}+)w~Q(A;T&(Td2A3q2C7I|&jFTswQf6{rsNHLb%IG!PV7n4 z_Y+uwPo8Be?|xDNXRvh3me4`d;TPXnvq7>-2kg<{J&B4|7l5_|A!_08$0GdQL?IlEzxU-VDIt_T8JoD1~Sxs8kYiw%nDnYs~-<;;s zNIb@@s;C=k4#zaIIEys2OooyGg7pWE)~ndZTxtg*^9;g`rmQDUv-aWR9{ps?sImZ? zCWm4y2+FmkQnli0+Vo^sGi><9JHg-zaQtJ3V#(cAK;^J4snAetHH>5hTMv_1g^&hM zTcvt*Y0KV**SNZcc`}u{JQfz~%#LP9Sz(wGWuys5u>D#+ncXtvSo zBKF8E^*n7DHmKz|Bl)ehg6HuqhyXxb{LOmd6UTX$LZ*#*a4(&Yb-Q^)b2{28A>~Zq z!F70z>8R~GlY~;Q|LKmAX{dn-W#x=nVkCEh-f7Z|w~W%@P_kes?7semPnUcLuC2%H zPB6_;vlZKkX>UY=wSXoM!>!_Xnx>4PB357aj)@IW}&Dy7xFbi ztWI=|r(1cqsYY&&=v0G+<93>FK76vnTC;Xz*mpR`mx(E1Q;cri8SSMG20tDv^)Ty@ zC?>@()=%H);9%H&OE?ZgG?Mh{6lo=Aq?;(uRRXI=CkB&Cr{$Z~YF(vQQJJOhh>R=XV>M6?8`)g6sUn5i&=@)Bi$AXt@DOdbsX?T2Q zVoD5U?1zX_dJV>ke!9UMai#QPuv_YJ2GN#{YnDzjYVr&}u3W&H&j4IF_`vB?{6BSA zmF26B9M9ZK5^BqttZAund|9rXyWJNI`q`ShYER6e5;?=k4ktm^5l}Og!XPfo-9R}r zW-24~3;G_CrqwoVpm1ePD0?8Y!gq8eaRdi6`-&K-P)Bxe(N$MTEvi*!LZKSaQog5! z*+UoQXv3Ln29)#oK`k~6FJ0^K0f)FVum=&;YJc+eSrG~jJfWm|+zNr7$y zgy0*mCzjFG$j4wRN?Xcix%#8hs^f@K)ZdBCi< zrHkEWZMzY6XH> z62W*3-8s7sVc6V=%!a*>)Q;QKRWp;%VtjGsCEF?I#10{kidlM|X4?@BjN;qjrQNgv z7vPQCDH$KtQ=orox7WkdH3l-JLX`3)*5}@hmfY3 zXNvrWgMydd$+#k?HGK4+W^@Gi9=`XZ-#iR#u!v6@r7R5`;exe6XxQPp}SSo_#fscr05W#zj zRZ4ik66BSJCV_DK+HW0LQq!$87Q903@ZQa!gbMob`6%^Qq6C5ZtL*4by8fEj#j<$& z)$tCu1*@W!NO!6K5g&(|UCp^x;PWMA)r^;bomYY2=SC@6WOJ*ceQ|UrBTuqcLeUc| zl+apY{iGbxZUy%;1#4N`3JR=O5$B1taH)VSh>5#WIHNUaU%8ai|DNwpXP7k zD>qr~PT)G-KuK#lxay7aJH-~W3z)xG3l*2796S@SLn*+cBrgmO(GSWR&E2w2eCO-` zqW6Xc*Nv8Zqh&%(oC8`y76Iy3di`b|qim%U=2w~z80;>gG&f~?lrrti$M123zZ1x# zZO31y!YT~RdjG()J(n%ioc>7Sk)Er9xjV^&(+lD ztbc=kJE|?K@o`x)<>5rmmo-&?lt#}z@vOdeXkl5SQ!ww=A@gEI)tT+MLYOJI4vFZ& zSgu(Ovfg#@1Y~3NjJ@6HYx9<{cWY0iuqU-D9uPx@gv#((1Iq-1$Mj#ovfS_=YuCM!tm@MGT5NK+_ygFWHc)B(y7=Vyhr7Q{N|7Ja9m8{H z?X_`1;{k`$B+ks{0x-ChI?7d*Yg(UQckkf3z~Re>3|4!qL%0RRgHZ6W1loA@U=PTp zqJMD?Y9WmLn*)=8-HruGn2SF zqMkFXMuqfp?8&0I@)#lML-;s@ujVo-qKWT=u*z7DU|vnUfs*FBTe8p9))I}z#C3+k z@xDmX;QfxieKhHYLuA5>|5<~I4Iy!how{JBHaxwz6*zN*Z~D!QcvF7>m6JBtQU8NdYA-Du#ETTZJvp~LrzzT9O3me~jI!Rx5;=Oosj9RW( zH7PkLt=FZ^c3zgV1Po)=eGp`^m)W~)i3fQXoL7)7 zkc%?R9#P6K2HM?dXs<1lcs%Iib_)D6hlo-no)=`JQ~-iqlED~`sB1BW$6k}?=bl2PNz+Z)gU|` zjeST>#z$7_&81Ry;QE2q_G}la%|nt74Z3xS^?It-&C>aH_gtHalMI&4nbn@Xj;M4j zDaV3T6HJ$k*hz4Ww} z0tiSNB0xg2`X#B%odaN73y#wB4LLY|Au-0h(+udDW5Ip7dOxOL51qv=OF1gXyzq+I z-sV}}72W8M#f{I(MRu7>E_}l4nqI$KvyO8daZr6)gu8$gzED{aclEe_HD0%vb4Lvr zSzktcAg}N;4i?@k8U^i`tp$+Ys|K|h-|0^<5VBHaM1QOF6^ResM zk(PoH9@m`Huip@4jqSwU85Z>_;QOH8Nc?}?cPM*3^6hwrx|HIRj|b3wZh|bz*XKY_$QT!^8bhe|Ehn)1pnLrO9S`Ip=K^tueVyC zhb(A=afg;d25dCx#yH&mF!V5a zh~dk4%f)8uW?HbTKibcd=S-n!Rt+^@up7H|JFkYA?kCmnl`SNI;D-9O1f>)yMzGo_ z52M&1doR)!^QU8F5>CB(wvogq7G4tvifnb$yqfsPjMX>r?i?t_DJ~?zw9vYJ+-?u0 z?|5N;)RaxCC?$$Khdc{%4%2tv0wA`xc&nhQh(`3YWtIe)(1-<>zLL37qF5J7s1NOG zYNjZd2^g?%M1?-V-pe;`Dp!WDJHsGqdgv#Y*~)D2+w427>sK+gsWl(HbNhzCjXG6) ziuh@*4zT5sb8D2MTF&ktuhYK4_`|`=)LN*J108%l@b|CA?mv&;_b~3{8yw=S%;3cZ~}FA`$nBT3E~zfxw9P)5kq;1qU`?3m{2H`3(f~q(0J}X^tf7 z8K&_=n$b9L*CrQln2O8ru}pI$`5>$iSQV|LFuKjIZk;C7x3 ze6oqqu^#ayFht|N@rW(dpbh4^rF@;MRd76R3e_8{lTfs%`x?$E8lCrCV*>c(g4NX3 zMd$ZMAx$r(4q+YP`So$&u08$RAS8RzDYC#saN;(OQA@fUQF#3 z$h-ZM6m$}Mt(pon6s5mm75~fz_F;e_yU##xyWUSXo+G zK$W1Uail<{mHJ%Vy)$zQnyBgO5|48dH@;kpKb&)&uMMsJ2>MID$bp4lj7h0|DUJOy z&CS@EZPACe=7VS7DHnt5#a2*23cNN_9bA#}ue8|ZY9}aXsv}8(Z&eMy;sC7-T*z8E zNeY}t&_9R;j3yMPqh*zZKKmfW{rchr+!Ip>at;^Flec9?)0<42FJ`Y$K;y^@P}+=& z-=>2yaJe1ErC@iKF2We)r@{mX|2lwI%OVdq^mIjz%#g3gsFzw=>m;1eJ<&c-6;;GR zri8VJa*MOScj__QLsI$P8@Rr$Bw&H$qrx(Lx6;FM|2Zh>^79TBd;rPWaLovHJy%-@ zLWw>JjGDj#e^Tws&vT>&!027j+xgpB_K3FB(s%Mp^a@u=HxFLa^4iC%D~U%^g%r>>RD?tRMHK> zgU1~~$Rn1}vb8+29`7d6_oqJ^N=j=RYvZ!Bug13EMV9+u5-jh(F0cLR!fk7%j>~{% z5%sr3{+}a2zhi^`#)tfm?qWyssl$vE>Oc-S47mS8n{ve+i0P-AMhzVstH#ewD+?SP z90pLUb?IbcAkjdvvng695tEIpn-|fJUEr{@ITRYz2%v5FV0qKc`5{y4?d5&+$A<~M zFF{o;@m;PkNXzdD0sz*%ap~nXiLItHazjRn42tEoxbbzcVwBG$wlUjVG_!lvR1!VN z8*Sp&S4O?N%@+CXV^|ITRyQkwMlD}luyz&$Y1&T#)0Wn8ge=>M;th?TEqN4mD6Urg z0~FVxv;-rAobE z>x~`X3=SuIikEM0?~$0-UrHKB)4_rhYzBC!=g@TQ6pJPxxTLo?El4;gOhnuG;v(E3 z(>~E-ya|Z~8yIcJPgQa`mODjc|02jSw_P=G1uoEAs4L*2RzSgISO~avK6Aam67*SS zC1E5qeEJr?8}FAzIF0%2I-C6#;ddN}+s1cH0g!Be&!8%nU|XTT1tf`eYujU1J7aZ7 z7fMKf9`H4=aV!+Y@reFW=CGJ?=*%v)?P#=PJzl2jkqCI<*gh^D53d~oc&x!&JFHu& z^Iym*?2q@fQ5xY=O=$-T;;$M9Wz?_-Nsn{hr4L_1Jvn2qv}}nKBEWHeqw;$Jl&nYv zs*?0x!0#GlQ2%lO#PWn=LtOC*qB84f%$_@R|hmQk(Nk0>71ufT<*r z`%Xn9%S-$mSDmKcH=oH>25DQ0_N81TK?li0g7Af>Nq}Xa__T+V;t^>cVW$)!m5fgb zd(200?>0@jj~5I|7FDmdtcM=(RKXLCa^eO2_F1=4Usy@~N6qgso#lLdZ&yp>n+6k@oY59TQ7ww!UH-@!{6v66LEv2{1vWtb z${GGyxc^qW;6Jgy{}unM66I}XfTQp47??#<(D^c~ju`;7sVYj3)%;;T0kkxD0ZmW3 zqP4M!nfNB%dppnTal;$EX;NSkka*S5m7I$x?)e?KrRM!L%j4pE2apZ={&5S5r681$ zm?)f+zRzy)(?!@25jg?AFecW=hk{Vodp}>N;Kp#HYvS>fhV->srgd)frSf~fRcUL^ zRwK%+>TUvx;^FiBJPvpl%w!j(5ZMLTC0(`j0ayxJ9c8R+RpolCukK%+-Pfy)+U$K4 zFHV0Ia5c4Nx2PEEzuHL7)V-3Qb|O*l@~aursvB2 zRq*ZjdTeR$*d;>GiwsAwr$U28>4tB^3fDfWnDYH}1^P4H8s;>$=*ID}2q?@WU!d;PtbBcBrR0O4QI8B)Aux3kD))6hNYwrBV;DTLy8Aj0{Hp>kyU zL6~MfkQS-r8Dzq#GNMG%foG)HyM`#+P#u8`+zC52e;BL9Dyyv&5WS%P+Z5A3jrDgs zuK(kx0?9u<{a=)J&O4h$9ta2sK?oja2pMMxJQ0ZO+qwAA+PTbMdt>nuA`ql-IeqPk z`M<_cU+c!^?7dQ@#N_quoz3GKONu`U$&v^lsM>m)$=jEIHI|_y4nR$ZKm4`k--p~$ z*;gmz452LofslIDUjz>RBux5jM5botf27Ed0w+mBIWabQGe$Gi-2fvTKgdXnU@9S_ zZ)aytPaN=J=;JecnA`F5o49(}Fli*9mE?P1l%HRmU)V>mR5eVjR4g@2OkXCdP>Aq) zKXGRWYl3lbrQxBj?ymlUkAK2;iP|UY^S~6(_HPx#KM$1sH%Z`M9V!wr!M`5+gTRSn%lT6Qxx^gc#9IzLR;4|p(k z&`IGVa)G3qS?`^jPnJHOogJWTUCAHem_a4g7QU4mMCI925~pR+C%Qa%LX1bf_;+6$ zl2k+Jsg}ZDLKM!mw+w>jP^Hy~<|nU@Bz9YW??ipD#v$Xf2odknZ7LA^%(`Vp`FVF~ zS6-*T?y@j|Bux1L5R*wrKY>{(tHPegz)EC6i5DIX5T4#84Y0#SP?BXb+VE#K#&+=> zk{-*=H|XsHp~lSsguJso+sySpkr=%vpUlEGY6fQ=n=Of?z0u;6raQ{g9ig)CsaK!< z@a4u>Rjx}C@a&>izv27{aS#D=%SPP7zxH4(P`_BgT8AnSfFYpch!E*k~NB=Wb7y8Xxk~DJrcU8GR2Jip-qyJ^>MM}~Rvnr_E zlgZSBcHsqcVALgWn=(+TvVviwx|xCIwF!jA3|6dT^{;gLhQq|e#YS<%KWTe_G6_qL zikKX;br(KIm%5AFJmO1w5+#Sus~}ujvn`xP-)!k@JAm971w8c~@u%10 z)>ZtUTYK+_)eMJZ)pt|**1?X$i9bjs^vpf^cElrA z4m#)auq?0Wa;r@4@TNKL0zukv*Y$ZBq+G~B5+mAIb3wmuIM3B^Rxchl-6=7Vb4XAm zPQ(=b*nRuxLiznG(Zy511M4~{ZoDrx1C7g((_Wzv$Ag~8A^r{0e_LV z^eQ^H^*dCP$9%}qAEp!JSH#cQg* zLCaNGCjNfLiz%~?xs;=Zp9y=1^3z538xsZf3}hk%xA}7+%#d!nZE|Ncn6c@5Kcq*J zN_Z+|ec(s~gU0-Ritdjf8V)T*y(^}Jqx2~3pQHz7<3pCaz3&9#b-re(E)RJWKLo^8 z=7QSmRK>BL<_e4V=e=;oEnZTeK*R8F_as02pk0^s)vsgJaVUS5P;;ecsg)AAMlgU# z8R|2_=~b>%>{iz#zJ)7q@xxZJgWL=zYbGXUI%h&8BF@yvC(08FMTa64yhS4nTB>+V zpHU1e5Wt>gdZbUZ<&sJqcA>yaLJ8PYqcgq|fj9o_p-k*T7)aTz-oBo-#EUbaNv>#- zxCt@6nRh!jb+R4$c|tK?z%*$aH41Y$>Ik_0qR#Rcyt2J&RDOILb3}*gEu;zRyyll? z%x;~XMDi1kC(cV?%qd^t{|IFa!#4i_G5EJ4P!W8*@B80?`XpEyXV`zpkvz{Kq@R;E_ zMQ-w^xC@R=lNt4Ez9S}n{QB93$3%z8<@nnl;(s5;dL+mL^#~y%=v}b`NI|C22GZ&! z2r|VkP(lj>`Jo+c7-X8)G}ARaG*0uFtui#%vY($r4BN! zCEeRk z*E}by#|?K!R5OJ}Q)Et!V&rb4xvmc5G#S%D{p^! z2LSLA)KHomVh+Q60zIne7Ril5?^XOFCbiYHMVU-FD|Nr`V;rePubtu!yDGdN;@@=z zzDyO<&QCxZub}ScH9}%`g1iM43AIrgKLF+<%iA{R>`cLGt{z%!?_&hb>Lbp~riOq= zB{j(~OF*Z)7{;=^CSI03fm^5fAakR3CL~N_9^k#@o_sQhY9`7sR~GNFiVSY-$~~Du zEZgK>OIo~T8*($pfvR#5xu1SP*9~3CL?K*DW@)s(A1uC4A;gRi?1*5sweP<#BOR@w zRTs^sjI}ZBz zm&aD?nZ9c!$C4{Nu?*nxyO zdYIPYW+J+CgUVM|Torq+iV%_@YRFyjACkdpoAu7Pma<^G2J|$0WHRy3`C+Fw{KWB{ z5e8Wh=oKg~$ip~w)~bjvv~<=yh7jQmqqp9?#4<5lpF#Y{rzc>4bw9Zqew{MF#(S=v zv;!`gIZ2jyh?CmL81FF{qXKidw$Q$JrJWF1GF3(7 z_TQ~Hefd*akorjXSP*!R`(S?;n}vT9oBsi${a?NCNo$~T%D@k4%{I)GL@?7laF|3E zGbD869b~X@5Gct!9E~Cc_S~rY{IAPxaqopYS!`Wl;h+dzf`kLnMo1EJB=8$)xL%t! zgY_@Fhd^=}UY?o3$5R&T9hIiFCfmUtE!YRlu@Z&hJuJb-DJJC6EX?j)a`Xy>s zHBLg(5)xP{#-^B-*$&#}iH2haYWXN+XFTFqt@V$y`%-Jx<6HxnhqVJbQggkXGQ>LV z@ylwTW_w*-dj{A1f`nloaH$POyO}H1mW*BBa&8ROCXTGT<{=->w}c*{dlT664%HeR z&|G+wmN$556E+SPJh?2pa>->UGd6sZc(C!#zsMaZ7@}f0clvwf6@p}_Fw)}f5LHbG z@qH7C6A2s*S|)aiUe)3i?0-~Ru?p`(O54~EjoO)mCK^34-BW{AwN09%ZtDek$?r;U zLzs|z{Uxe+=|h}OI!zr$rec?cgSIx5Wziz^O(u=Mn)KNrVW;@}BkUiMAz52kbQ75E zA^r`R{bx@8JE?}h(r^-SLB+qG{z}TL60LxXv4BZAY|-L^Vm3G$B4Pvho>I0FVvv7c z9zTi{ikC}AwbQWOqGk>APa`SMZCGY(=C}cjKT31EdkxqINbm-67h@9>@3wkIk00Le zkI-8zJ4l(mu3#uF6d~g5ruHppdGnkK8R5WDK!prtTh(sv;4S~!z_y_&oTws95IfFZ zERBSoolimMOfK2SW(m}|;;U2Ri5F1pHJG3mRBCWnn!%D!R^qGQqM4DDME&WF!x#OXJ@cExdwaS1l(ea#3q$T&zp57k<=cbZ+( zI|@??Qy%jqy7%`(!{YEl$Lhh_w(Ui064r*kF0WHuvkQ_Zdstpj8L zNbOlyr?DS3QoCDytQF_QES?uU*q3hp$so&VMBVFaMOtbsz}jDZi4+p;xRiTBR++-m zdt)$LN;5-W@*F{}Ixa~=&`z`S{&8?Bw6J~6B^|NRjTTAR0L)9P#(f7CB$@%E`L8Lbvb5_Ab5-t_3&_M zCN-l}&i)mhR2G3HjrON`6&q|TK>j&a^4s?YO%lVWq-O2RFAhgR!e zsm=T;j*)mwyRX5BSPnEtcO5Z zUe05*F0=&ABbC6T^9P)2|6XNV%tg8#KT*4N1RP32O;|Fjdu)Fj0*MXjP`7D=Ba&r) z4KN21!8u)rmY6C0KQ0Zpl_u3Vuspf|ZlC+BMEd8YVfu|5{^Oebi^D6W=Vs&ND5qzy zXXWrO94qO+#BgS78b@K&5Wx}=%2twNX#Dfh>A?cb6rjb$@%PMHv%1pjR>vmLUk-Gx zKhp64`xo4u67BUto&s_^rS7bOhh72jd1-CDSIYYkymDfPmq|B^6`XEP5KgVMN@)V}tJ7#@%7QQ@yGMSJ zzrJFRO))YYcaZYMfT0r>hajqBs~Xw}zt9U{0j4>mHaKvSbr_LsD z0vK$Av3k#Aio(#THwR-4)~0nOru9{(g`c3cW**)#wMKZzBdAO1hpPo2d(Rf~W&V5( zbwM{UWDK0SZT^m8rZ{*1Cv~T>g1gHLXx_=cjS2k!hk5^-H0hsWkN@`kS7?Zm?Un!q z>dh*iT5C~3-CqdH(L!{uW*3&Cg5`lD_=h;U#3nL@0VgkXZnhvF<@L)y*WGR5Y>aUk zZ)CW6__%@FhG*df;H(CESrq?TvJGWqxpPytgEFsf2%p5D$q;MdZA~t|SDDXO{zYPq zqUpBUVxM&>cio(+hCv&13DrNw(zzp9lt%X~kH1=!aAipNH4V5r;75|+ZswhQgGrW0 zCks5stKl(|-leQF8-4Jr+9)C$qO+>8faDE<^#N@4%uUF<c)C`7d{&Xl7+=X(Vg?$CIF`9#Fpb z@3Kfm@sfYg7YE-_Sk#ew3Yfqp@Db+(NAfBp8ZZ!3#Nt%Kp%lv3vif}E)I}}G&lgY1 z6cAoNyvm^&)ECv{;*=*HTs@50m{9w?U)_E3ZDuRggPzoH54~a-z{|7GXV{m4maJL? z6_{f&5Lde_m&%s531)aF2u@ELuf~GrM*M#5MksP2q26Pyvo6(eW^}lt&{QMjOwl&N zkv5zuC(C$mMN^ri>9K;g%*JY-xpZu(Z=W(29iJADpYZV$!jKMkBqv#ATJD4B_i2r2 zw*Vjy==E$A#UM$Mj96|YhA3pD@#I>47+{%Z)D4F;$Po9dv#rs`-6Iykw z7tQEYQJ~7E_({w;@keaq3+aYtL|SPo0qGVaPx5I&r)ukUX@bt;W=QvX@d2e)#e@$n`LM^#PRUkJ$Y`!rn1BvoOjU?KpX3 z+qP||W81cE+h*sDZL?$Bw$-tdzCCyDov&u<*4(P+$N7EsuJf$3*4k@-)&5|wZal3T z@Se|w#QV0>g^!Eyh!8JI;JBsgdsRDN_INGt&(6PwX$4$$3FU-r!>!d6-Z{`2`7j%Q zfDFkCrQWhF{kdP*!-@)k@~2|@qTye2B>aQ+|EEFzrJe`%2a z4(tC5)&D;iit?uXzeE9k6-9>N0|`Ql|KO2r+p^U-d(7M}ZKGusvs z@vJ!R^C8kHyq(dLee)C+P^-J*6U4JM~+Ei%i3vWOFD&!uC6XNy?BkgpPwXa}=Zh`xFDFLvi8;@Uqft?N)q~b}BNEdZsU+DU$$`kahDQbBn&aukltdpTjd~ z6D@A!ATk2`C^m}BoOzUndS`V&v*x{|^(8nnY}CM>gCzAnHcXTb`};rLkqQSBQ3?Ml zPW9g^{y&9p&Htt1{|h1WPx$`-=4AfUHuL|wWhVcFDaU)Tw4_%2#UEJiiMJ;b8ruE{ zUILVYMndN&a&pWoX$R*W`ibm|10@icAVNkh#V3LY?Yoxb(ZjmakZ(Yc|HHP>)@WjY zZm^LyZdTOEt?+B?koX!}cw{X7(bUu6Pci`e!X`quBPhLgJI&RC^HA|C_keKo>JQoS zlS{aG4Ia7ZIRD#ifQVdp31L`#vrK&F5}ZwzHvZ0W>!{kMfW4d4;~7Ttg@uB6l}cya zSSY-*{Yq2}Tuq3Or2mscY#ys1bVgISYjPINI=zLoZc;l%M#0>i5|O2W_fY-)`5A%N zQv7!LdCuzt*MKcquU4iBm)|OD(w|GB<}Mxn^KbB~tmAE=&TCD-UWb-5DskcI!;wTI zDnCEb@atVYn$bR{KvOMIxDYH*V>}54aadC7lig>C*iy|Q&FI6Q0yp_mCNQkb7>SPZ z#ylAT|99erZP{*u`oG%#cT>avB+&o=tR-z5#o4VX0NSQSyYu+0=-X|#~ zLL?MyBoav#3k@AwpP4K~h768*PyRrTojIKa69a2Zy3wgluhzFxlOC-j4pZ)CC!>?0 zUQ?sj9CPhc_wUp>T-z8J`2BVH?SKIaqF?p9<7MkO*XL&a52pU#$p=Q{dE0L_W^u3J zj8^9`D8-TpV_j+&wfGDVWEi&j;bj8n2Qq9~cc-|BZa#5H6$rCzp_YZEpRC)17EV18 z7LG#C?9gl~&+Gs;nQRIzE*;={uv5Iy>BJTu;_NYSD(_TNx4|PHI8A%<;MH5rkQf#w z@(tRrNmhm4Sg(1K?%AG|f#Cwn=)$&{%a}n=i$}kzHJBFmcsEK2D^aBTAfjdGc1Nk( zJuz)Z0C4V#IJy6~&{b-YSQB%+wIz7&e4n9L^JE34S)WReqzboqooc#dL6>6sctLkx zbL;s;C(JN{uRE#>Vh{fIyQv@>h6}zwmWysKevjRbGp5bc>$Y6kP-7k?UFV;ixt9V#O_( z9}^0V^-EG&486asu6|-<0lKm^Sl%`{aCPEJBats1l7}__f|e$yd(x$G7@xaIn9jLA zP-f*SiHBNg=ODw9AMPuvSTiL>QZCBroU+-$=WJ%L6e#5g6>x1Nv9-BpZ7#~9YsK2_ zEB?;1PqtdGer|!INLlGUIJ17lsFvJ}RrOY*>!qi_ozm2%Vs)Zj4BgU};~nGc7Mh}W+e;dL6u;v9Xg7ymBrB+JjZX>eLN5wlQP-hiRJ{zn=^G5>hiQ^#GuXr@tJAtUNu4Nb71{ED)Vspfnq-oDRz1T|G5;c6E9}C z$^K*EVdTq*NupY3h4}lmRg9-M5gdkj?)kJMtVUf}zJoLAPu4un_m1_jepjxArCiAE zU;WMNR@!vvWiG*tQljYWl#0^X6{WTKFsw_tvN*hAFOcPX1ZrhKcwF!X<$|4DsZ5E5 z$R`m)`>ZoK1Bf{@Q`G}NRzqszq4L=k7p})r8z6(6+NO}Sdpq_=QFFjh@4!2Dy{O=v zLOs3Y7l2sFR8!Odr#dkAHQ&!+T40#~<4L=Rb1>Gpt-M!l-U&`*`Ape*C4^s#(e=rK zD1Z;r3abaqasBn(kq&LQ)DygSk%z}1-z!NXU2Fh`mZ>8)F-Z!R?Q4l+(e@g(DPc4{ zYh|7``OfmhaTW*;wg^BBdS78BrG)eGsWDv6<|wMqVCqbN1#TIN=;zvDGbQJpq=ir{ z(P0KUlt6)d5#hn;S%!Z=1u9lbT$)v|8a)q8->27PB^M+8EZL03zY_+gYWi|o9MzY8 zPjLx8e0UusDW-Q*n%hqzjGUOJV~XT4g~kP!lgBEKP3g~U!V+iwoc9FveHmIjZ;zg{ zzLH-{hRETy#qf9hd(Fvx-sIb_>;;P?I1|eNoP1boRCR1DktHUwHM)}^u zw=*}`IKe1tSt%SP(4N`|DT%h&wBud6raNNpfWb9rDiRHcH{x_5WVcjW=o>aOR8sPo z*qhWN&yhs348u#m4|hJ?n!{ypJ(VC22K2Iyra{|(YbHL7m`RXr5weOV_pmmOPeqYQ z&iovinM&I`s_k}~SHE-ODxD4ix4d)}dhRH+t=9H%pDgzK@~qxwQx5q_n_b>_^79n= zg}SWaMe|0H1Go~OL)+R~!FSxSy4=^VriUz4x!M&C*D{XF>=`)9|2SvF4RXwuAsO zq>tW}HhNMi`Um$pEY5ZDC0lQhhfOmqk{;umf5)`hMlTA|6YZ| zSyuVp5c>?$o7Gnkf5pQH@IOZ1g)xNluQI-U!v-s7FrX%!fbUJs(k=*ZEe?SRsI1c5 z)=abP+?cJJq{wv#F`h+ex5>7bY#3T;2uZ0%3Z6{q)yGVB2|21pIly{dWM$6ATeGjvQu8{dCZ>eRtl3HL5Ig0qa4pK4Qg zF$>*f(~}F`B-2%{W5WiEuec<4CQL$|*qM)h??EHGM-En>c2@eB$-87i4$uoZ!H?-9 zyU4|VCZ;w&<468X-1>a}8reO4QM_rMY$;3+Shj^NgR+j*jO*C$gGl4Gy2AXI1)=Jn zA8>X+X!U7A{1r4JSVCMX9w3?(?GcZ)MJpTg7m@}ACu@dB6yWKUr|4NNI|7ATMwGPd zaLv-Bu`J~-cqqI6Yr1*Qp`Ao|4rWy|AX}NJE?(fUY{*s(1$YG*Pb02;N3CLODe+D9 z#-+OZ)r=hPR_d|WpI#HC#6?#tDBk01bs4*exsxK_19lE5u&v2b4r*aHEyG3|F>|NR zF^JYk_%>IJ5`wBR+b>T&p{gjkZB35y>65D9Y*x!VEIA*M?{a_sVGDs=333cAcZpBbwG!SQbPz7V)274{NC{HSWD;mou` zi(Z08^A<92T$OPg0Kh_b2zoNsB!~({U725PJZ| z#(Tx7phi%GYQXRP6-8*TngkA5FYNC9W}7|TQYq&#!!}_t7c;F8M`z2j?i&`A+-{(7 zKLDsWKh7n?hEa;@G4Z&R37b}eci9+oe2{v5L5R#y#YhQTjNJTeNDH-@6)VJ+)Nl}# zvufE@ZBRjjZ6bJLKWiLJxWcu|s3(5Bh7zwR%zyF6PRXgyM>5u2=izUwq;WK`x8=9i z{Z#t(W+ATPqic4}Z_h?yZOfdH<0Q`dsM?pmFSxz-O#kz}lGR(7G^E@(PRlgI$g>I|0%H>6ExAp1kTrA+F?m@Nm z;jgttisXqDYN)%Ueq^a)s__t7S%d1&O)IFqs>t%dT8S9z>?1)wW!2x4H+33*L3}By z2^q;34$Y&S>--b;%e&Ryzxg8PG$z0#pFGySECTbn+aM2lgYvO=!*;i$3C3k4u19U) zzcla1Qs8-CjM)%BG`~TeBDrqy(9z}=0Rj2%Rbn6;AT*^+*HFb;yypULi0K)ba%Rlv zl|8jWVEPDQq(8;RV1i(x?p8QD^9dBIJI;i?p~XVi1~D3fKguJwfcemDQ+y)vLj6WG zfY-bT;V%eh2k5=fgTW&h!=vpv$I#}uhziq8>4Y3CR_B3;sPL?aa@)+$DqL9D2rJvU z0^a9^)V?Ow1t4#@6&{dTYs^A84#9RgMBIB`{~i+XREQg4 zv&}7wE0KPV&Y3ta+CIrRa}>Z9mvI@F@>q;HGHGSh5=)qpbCL~dTr1qCzQ+%v zPmO`I+L6CqMz3xCSAT+ou0lEl!BqsI4}Bm@ztyV!!6?2trat&HpCy?t4NP8s_hGD4i|do>`U{+|s{7ai7Eg30&JOb; z&TSQWHaU%WJIBA*c|G)qIGE>KmCjvc6QI-zF)Kp#3$4AgF3!-ci#3)j*fEaj9-7YT zqXn0l5{z_355|(JE#1wyD^PeN-qf@xe-TrrwKLCO?w!IrK2XSe!EX6NZTWhj*~il; zowz*U@jJLITDY((AyfyW<`r=@g5-lbTYMOSixCRh5rTeG$6i=?S;$ZQ;!gTE-VPu; zp||MubUrNS$#VL{Y5Rbef4im{xl1m*NmP*Jm@W&V>}H3GpX(svF00vB%kD~$)(7rE z{`Hcy+?j;0o7;NM8g%`>$ZF5F$ULcQ3xWvBim);YL=I;dYhZy*mwV(*{NmSq)41;^ zr9J;`$?_FseV%~yns3SQg*Y9N!BFs5ts0V!!d5*dNld?FweP?*TiQSrj_QXwyC42H z!xh0~V}4&|ni5`txS{nvb7e|kJJJjVN{IL5yFG zfObH^ZKNlB+}@latw|~voHJu$iSltq_q@2y7q8usyWt61BUyiSLIZdp+vra@U(^+S zA^H^PTRdZ~EitMs(m;+*xP$YK0eckST!7+}f%#yO0csfqNbR=rABdKGgTCHu-X0KB z=|_;xgF14T5AJN5bB?jy@aZnDLLvH_N(_y%F3SGLMq20E znR2IhwRnL=D6=8Lxe7RpM1+jRFx`<955|?pn#cJS7 z>X?*3u68xgPK4#mfRc;&r1(pUL50pIL@XY#(OOfe2CMIv-;t-bZO8V+tDbN~+Cx{c zxcbT;6d&4Xa6RKRCYCkhdd+IqGvo(2?_rjZ>`e1|v6r*j8^em5H2c__6&ca@OvO2k z%irx5`dVIDt*5Z6v9%8R*chXsuDfx^W;qTp5MP}J@-Psi7bZ`IH+x($d2Yhn#uj>x z-NQ4Th8?w+hY1VbJ$Q1C!2-goqWu8ZL(zU|*W&`iG<~Ceg9ZHDat&>=9~zfx80dW| zk5S$&iCJW(WXq~=D7+!;-qR-1eUakDrZdt58KJ=~-ZcW;;2q27ZYwK1Ha2-ZZZxgwq4ktpdinO(ng33$I~68DmBRAq zxe6;LRw;bqt>(`=;%#IeY21*OiA$R&>R0a0C+aMpN%giH`16@Wh5_5Fbeok5OT{vU z!P)g1g-I!}F0dBkx=4s?ZqhIO*ceapjyDnTX?3g<%JTS4qg`w9REhIq zH0C2J*>uMO#Q2GlY`Fgts0E4Ds(tFbcSP%A-qoF9(m2 zZz;g51wpbwabFpt!-%sdl!iV8!LmmPl_&vFmIZwgI5&)i5M%cyPY$!sG;-*|pkh!} z@e3s}6ooK6KlCx^vZ-pCHUi$h+@oB=Qn@-+AR6R^Jqn@?Y01sqpkk8nV?@V_-n7u2 zra-$Ve)Dy5rl>UmXCd7p{@z2~S}(;M?XUO=sl^=BLPux1kaD5LJQ&fRYF!f996;S_ zdLm_=64M+;>>DKr85@X{`laH$5>20sS|SL_$GpL42eA~#6C4aK-~ zHh*LL6C~te0uM3OD%(Mn*JDBlCe(@YZ5OyALB}SVpbEe$++)s=(L|FidOY#ascq=N z*vlGMocStsC$w>I*?eTQE^SSH+8S55>wAsOYV_J?JyKir<*#XAeUjGr%1NrHItW#j zg6H9AMJuNcx0?vr8GfLN?|99~meP3?f@<>@mY--O6&e&tf8$uUI+V-kLkFj+0*W?j zq`$G(WoGtJ+6igPRrQpC%ooX^Z%gD5G%6WnZ!*AXOHS|gV@6%*L#B=_HBr=?a_)iyn%*s;uTEKA`v28?gR^igCS#| z_5?8q{e~l0j8onc!rqBVf+-z^H7VauKI0TofQcpSw@zs7kf}f~e>* ze*6&ox2^gAs7n9Sr9k<=Xbk`5Qut2>y1NHTQ&sYX%h&v7tFa4H%uowi(Rdi58paq? z7!88WT`rd4Dj3T!$yg>pRF-)dEyWUreI)cTQ!H@^ZIP{~`@HAnyHw-vzlCW!LTo25 z{IjPIOnx&{x!i8%H}6NgFaK734K4*CaELNfIV$eCHkuBX(3YaAl7~whyOrdi!qK9Z z(QfDMHL~2Hktrrh1?k{%UH5@VlSeIHrA7o3ppmJ}r39k^l=HBP=M8(PmUTctgeqJC z@rA&I+Q*X8uUyB}g?weO+zBD_!3sF#?$qgGTa1!MYW7TJQCG8a)J8N+vv4J*t%_L1 zcz2pnDsBX`;$+%;0w`d#5?U;VSDDT_b0^CROveOQ8H;|FP`?=9zT7@JhFc7ent|y`J9IN^06U?jR2)YEq$?{BmP}YqIZMA$Ln|r@o2AK{WhsmIJJawc zl^V#AE-ALICbpN7(qk0`1u>M96_6tF389jU6*RF%J3Tla^T&mqtNYRo^vrutFfH+lN_e#}f1gso9 zn>_mh7=Y;dR22O7X?kMd^+6nm#+B`%>Ymj5FDw8K<@Mv#&R`sapQzhMsvNW$$Qumg zw;C#r@DMuXck0r1MSI$SRuxD5eQzlGLvOu~ewbBidIY#qr4L+cH`L{AS@br=XY~tL zT!^;I34FE_dA*KB#T(}V{E2P0dxlEe5`8;xQ%?A~TG|)I@gCK-h~N*Z_WXB2p$aJK zHJN@E5af>HSv1%gp!m=>*Dy5ENF^)l5v#Co^*N+{5Yp~+8;!|AiyL9hI<8PtPH(4fWr=dW_M9)y7j@w+7a*;uI z5zIFWQa_^=V4rYY9$Gt`2e-kuomgBtvMF zkb#;QvVrk+v|Q0w12GWhrd!3ikYLknB?Zttk(8fq(QLPs*Iyp)=#c zlr+WM(LTE88W;}tnaAZ1YaAvWRUO>&*}7+THgG0f)goN z-Q_u~K4M1??8jU^H5Co~OeL8?*IGuy#5FZ|u%dEiMHN*YWK-bOc+LP(uV;rtiGvh7 z2QEujLvLlPGu#ZnpyuY>S(RPxX_b9)N;aPr1BZmX&^I__d`A-{ljTzi$VvE~_Vpf}_%W~edGMe=2ls=c) zVYJvLFqd;~ezYh7S_9c9NVXt?S)s3vY$PJ@Qcdt}8n&&q6J)C?bK> z`djK!epxN#MSA1fZe!L{XRoE^HHcK%r!EmER{;l!hteBr*OuaUpL0>eJ-j>xU?Y+M z{dP>^)ir&oegir>s;2X2=?Bk$>t96hbmfj&_IA` z5n*azcL{a_w^FXJSV>@8>@ioaZ(!C$)iYl~Q(xv}n<+21gx-s95W(qP!=(OMIc}h? zcAaly>a#hF zHN;I$YBeY;NLx^y^kHQVc>EL;h$cR)#;z9E{9PFS6T~)9rmDKQR+U9#APcov#I!8C za6)@)oLVj}x%9vW0E*sQdLdC|=)S!1qlT8}RP2f^jWI_Lzd8lUrV6LZcbQ!Hpc5h# zQ$!?VJ&f(G`+lS{Ehwv>=3tg2TUF`2yZfLpn4HxDEv@iO31LsrnwwD(pHA|Pzidat zpG2-!LsI{bs$lqgs%pUxOMpk3c<(ZPjIj*>rV2uh%ySZqZS?cP5X_isO|=8A>1~)* z@l2i}kJ)2FH908vR`raRnFyJhnSgLc0bn?uTZt1oSUQh^0Y!sDNoqzY@?%X^fu2G` zl}JU#NUHj}I!heQ=&5C#Rt$cey#&OR)4;8x<)M8NBk!m5kTY4_x|~~RNjpx(8d=;i zX#)pJj7Lq8b3))~=S5VCTtyOS>x#xU`d)E1!xMD~vm~2wMxN8$P5F~K8YZJKK8MA9 za$&HsYV-|)8AQ{4sjP6#N{4Qxn3ny9ubB+D9i6i5p(kVo_I^bgl#^9UTzM&z{x+BS z93Lc!;MwTOc660BScx3FSDxsWnSoYVp_3N+jqGlKK7Fk;W7|kn zdR$&vpW#u#DQ0bbssj9#mN4M8fUh^h3lY4$au`$90f(lA_2!oR%Op_bAkyQ1lI8Ea{>pc!-7?@!)>` z4Xm37WYw3ECd^Y%_TGe$RlT}1m>ilCFdbFH@VbApFYCcN)lxJeP^4&D$#`p`T-?+Y zjz_s?3l%c}+Sr2Wdv5I2LOn^d7Gbb3PRP$7LCoabSBadIy~q-oogLRYxPQcKMc?RQ zLVh|4W9~%e0-Aj2@0cjG#K64oa+R+Q(kxHfSdY3!()ZwcHQc0uq@I}M@LLs*;(Gy) zFlkSBQfjJxe0o%Kj+$ULcDX1Yih|yF7PDk{F#{RaG(G%2fqeAx-`#@0yAV~d6FZ9vGRE00#edi?@EGt z_)!fEX3i^i&cGc|@J<%V{%FFuj!4{(R1J@d%&5uYs=_&0A;z=X*uyGNm&Wgp6318h zlX6M63Aw6AZb26DM?FrwF&+-h%2Xm-#s?B4RY$pqNpojONY40reh@TV%)>wO8eUA- zuSge^cK8XHM#~zG2Is6wO=>zjbkAT{c$g6CHW*3&&KXw%gx!$vuV%l?+P7=KrauCg zQeD?cM5-=%h$z&KVX}qK#4BOs;nkjjWI4YI?*>_Ae}y*3;XV>V`q{6&sddR_KN~9w zM_b|^vJ9P8mH*=sl)k0`ThDU3Fl4fH2`cA;=Rzu~iRa_B^e?iTu&O$7C#;=Jy0E^+ z;9r^VbMug?Dm@d?5-kX8-Zg!t?FyPo9n+i$(@&k1IK-90VewzN0rHLlEDnz7XO( z9-C%OojTZEB0RYTfUGDTx5TOqzx953YuUK8hX^u*I0v`p04yB>cb}SI`(tE}RT^Y? zmT2MdJ~2(_bFxtShS+u^XdNP-nnsc-uZ#KAstVE+HNgFtdm>j1v_IuUg0%8AnOx_% z+H~DO+B$$iz*2#+Q?WX|aYhR>on#HYK>Iv#hYk0r&*;V;dK#=m1)3(0eO)Nda4nCM z1tSdOH1V}wtb%yaWh@P2nMzfvIc%=q5fdAq9*EyJG3MEF6lrb;sO>~pM>T7On6Nq} zV_KY9L*W{k(H_O(iez_cuF3U3r_)X};Q_7=e1OtwQyHmmsIl?0oG8h3+3w4OC)fq! z-=gEDj{Gb}y;v8C0?*L(gidN;b95tOY1CRaoKJO=EigyJSTMXXtYKT50CS7GM>D>c z9`ClwGYxUuA)+mzo}XTQTk5ZFT1*#F(!f+jeqLr*p8^{T;zxu}wcU2sIe@Y$Dnr?I zqSBG6z4A?;ubJTCjKY)Q!VMW~Z|w+TSg^(|*_LwQL|d+XRMU8)KaP_wAkj21*$t7|zb5;D8VHdtork|+24!XCYW4NIks&IUgTT*vXFaj~1oQ>*- z$oNvCX=`gQD<^_LEbLN=?GjA0S(B<{9*~>LoxME@0U{0Jl7m86Qq zS=n}{EgE7y9$)vPemv`sXsCAdcy$|E@ie%0M|JcHbe<2g5ov3Un~sPUth7oN$B!bu z19@ssKoZ_r?ndH6hD|JW5oyufThe2#}1%QJgKxM64#05kqyh-+FqV1b~Si> zg%T7cAPMj4yWf+IEoiRJ3*r{@Y_bdf`LYt`J{rD->2#^&TE5_!qOz$J6w>Af1j3MU zWR{P6NyksTh0bN^g)it&B=!Ex`eqU2A@zlCI@r{FF2)IuTmnrKR)f9*H?P4A4d2)$5)@yp z<*a^HYC;*5EMVL1DJV^?zcl=Uoufu`bCptTlQ^ShFs@WCcaT@9i?MS$F~nz#8}2Q` z&rvST6(h){z7CQ{e*_^G7vEOou(CedlZ|7`jmar;+*-3{T;2>MC2vZedHw4OWNB272~myTs*xgjWrvg# zT(&hk-gryzK4E;NF-6uLC(fUTchK~&kwx|usC&UUL!lw5nr(?8Y#a^A=ec4rY2V<+h`P}${6g@OzL>{bv0<6 zDdYT1Tc{Fql?!i-Gw=S0_6O#5yDRsU?SA{!VLX*7^aoewT{PGs5j{GVb=KxuTuXR* zG+UChqHpZH2+uE}7;bsY(H!Fju6{I`A!U_Uv8-|T26dHGQtdS!_g03_Qs_v4ifXhO zg&;yk*kvt?7fX$E2iH8>a^VPCizaPw=!OO}lG|2L^09&b+Cr>)W+8#3Nyff^6l4(9 zTdJS=eG&A%{fd1wMZ*GGl_gHqFpf&~@o%8t+aLKeIVTih!L0OG>W=}mG9s>TuKB(S z&7cr|i+gI{N^1F{Xrn6;yLbD0rb>f-~-hOS$rIT^V?1(J<#Ybfx;mjYG!2jRSIWo$Q_ae=Q9Um$rxQ zT13mB8%0kJNvP;D)G`gHg|5npbhQnhRAnncqZ(-s)#P}ibw$~on& z8AV?X!&Cf*s!(Z;#HDT@N8^mqk#(X~1{B)nj0acCW42`-xI0BqyGQfN-R$$r3WOrE z59>(@`J&8n4sWxS>47?F3$1hP*xs9XB7{^2xJ-n(4vl6SbIvl0^F~7oWH-JjKI@~Q zd?J3AjRze6E~tICsK0L=GtFRf9q^WXZYj@hAL|^=?#|v)usVVli2!n}WyYU`Z>_w$ zp39e^&bbDl&Wm`rkcpE#^Ov?KP~G|81&)v2!IXL`Ua=309vG==L0O@vV9vV>h_nZ! z^2**}*)5qL4Ei-Yd{BGl22)abCI^>Md1e<6XNZy7XbNG@W*%?{-|-C?;+EeSSMvTk zJB8Q?{HuIR^5h#8oY4?mQ|5lE;>ZdA3Sjq2vo;{b;6~+??v`)%z+|3V|HOkFb#;AO z{8IaN6@lLfSU$hUYs%dTEuI`zH3c0X#7Ws5OY+_!nsaD8b-hcc-YIp{mk0d>09uAvEquiCyvF%EKfd9OQ1Z4bP%z4`8Y0nM+3LkXp?Fv9n| zZ+fM#T6D|9jHRz>?_U!AfAHGw5%0>VzeU6zc!zgOxdL@dKnM1^8d4@+jrER8E9WNr zX4RHW+v;_&W2xXvQ}Q$7f0>whqXQz}4awh&;X@YBjRku`x-uEQ#`-C`QmNP~Y;=ZH z*>jUCRSXsP6!R$lG6u{a)!kycEt?&zMMkZ9Hr0+~TjMQ6ZEUL^HiTsZDK08ERsXph zDxMWnRgecd7 z2>%2!s%mgm@mvHH?0-!T5TEO1e?$C~O!+I@*z-rQ>5NGN@h~2^?+7XRWl}}DP!Z8x zg6{(!e33W{g?;q7TMJX99)Lx<)cKNUpr)sXW7~{CncM)}L+Z_rax+?;>s*>aC- zV!223&rb9JS3pI0;Yrx4)Qezi$M=fmo}!Hl@XvPCge?&@nG_NoZAgyi^QD?| z#5~%!emz&&Wx$J$2TShH!+oWsjlM2Cqc`s*Z zg$^4_bVSt+*f7EcqKG6yoOu>b(7*u6RpQNhiuR;gf17~aBOK9**_AGYsnDHE~>47%n8_(M+pMw^JcS=cA{Fx(waLC9|YTvDZkGMWPzek9Jyh5%K zy!t;~BcMLfi;f4;;hBh${Cq2x(JY56I z*R^{Csdqz=#NY#ZrYvIojxR#Y>TGSTR{`I>{9{S9JDPmYsXyKu;>CLexi^UCK0}$g zph)tgeg=DDk=RZ7k>5O&1lx5`9X~Bff0-!Gq{G=;N1PreoR~c<)XpGM>kl*ySi#`O z8ZxL^9s_81thH&q#Vqez#}==zYMNmwqVtfh|h6(6>vE4F)J#3nRY!QomOvx4uYR6*-{TWPdr(sGhJecoXzm)rb-5>-EjH< z+ZO2yTg6#ES*o zVuh6C(yqgX?txv(L}BM{`Te@Nt7>qIIr)%Oa%bq|%y*N_Qfj{>25Ar|c^4pF~yL9;Bb= z0PcNGl4k5@kdCJ@Vq_Oc+T-Qz#NaaVY7OM}ECRW=oaLw@qik(O3g(Z&5R>4N);mW3SY0ytOFk}g8Vl_1d4d0b23>SjOv}6QX#;sfF+AWh; zlNuR9-nw6~g|>NvJ~d+`tTi!CcX?sJ5z3dWd>&x)n1rSv7-@_6Za)yFsuH{~-kC)L zbXC>Uysi>6S7_uM@4ZTBr=XfV4s(4bwyTH-3#%8s#T4s%JfDioE2Y%92I_FKJ>h_2 zbZKr{96r~-Y>MC8`Y^=P}&yLsiWAeta7wrZy$w7<1PMSVpl+n)KAQ7Hp_z zhpi0rohyyMNBB4fijc3g;+=wvDj?7mrGwi5nID6clvBy_drE_LkV%Z?#Xi}WkvY?V zCJKbuMC7uhbn-dss+w!-*_W^8VQb^&i0~=O)^qnF2Lt%M%?aIPRRYbcjZ_znrGsjn zW)z0;0@-uRAWB=2F-hr~zr9i{rWvx8qAg>J%`s&SlvR14@-v1nRDZo|h#zN|d=HiTvY*&!(wF)yphKkBB_2Oz zIvB=f#+TVlI=<0N)tTFvzG=HB)A45IksPWZGYprl-<@Bal*e&9S9dtu|uk-ksAjsgV9B3a1S2;l&*oW7=A_$aj-+Yi|4> zKLc=tLt8FDqGb@eJM$aJ{cW&|fo)(*aQsiOlz4SVLMRWifN@I%XH`xoK+7tW4uCQfcCj&3TB zZo}=J|DGQl-9{Vw+oOq{-Og9K2di|f>*AF^)(@NAJ6GFQ#vw^KAXfDD)i#Khar0Lo zd%6qZy$_ETVw{2`>8HA3-><@ZYvvf6@ZU2$n>LJuXyG2sTZAQO;R@F_0aAq93!wwQ2?k0S|ZzkU5^@vh^N?wEI8@v^X@@SQQeJqF9&v99eRm~;AX zqusG^g%zmD_FN-ECL{u5@Zp`VupFE4&PF8$h|*yP*Ql_DB}55u!N_gt=u8j$XDNi> zbD-tu5arF@90_vZFq^0yxpOF#j$6|0izeXzHYl+}Td%8JS&5|)O3bN%7P@wxv_zR; zuOPvc_;?6APjDc4c&k_ndi1yZNdd4*w!jX##msk8{5OKq0{f-=`{TnjIbbaWalM;5 zl*qCOcA8zE`J9O2UqC&j@b{@s6`4z$h70az3KdHn zW4o{t6}E{zuz*_!XIwOnqA~8<=xw{`Web{v-;vNMKImlOR;oG&)3#|vdx2(bYyQR8 z{7ilY8Q0+l>X}GcVlZy>EmFRiL;7K=hRbe)zuP%7_e+c+tZd9F&8>t>twT&2yjKLI z#wNN6XqofUyb!0<3lrNhyoqrzLgJ+v3Bph-d9flv9l)dOePuD31@U4mbplDQJk?TR_oQtuaCu6`k@DXf6ROKQxLKI@8(vwg*B?2Egz zbWg}fASyBY4bG(IxU$*zL6dc3HpB&gW=-o4%v&Dz!aHoWU74vm!By_dJ_AY<70=Ql z-3NZdeQ%Y%NF2j;v-n#RF|#5MFQUyv4y#sdY-^Id~v{B0<8 zTiv5371k}>Pdhm3cpZ(cxSGWC=DiT3lYNRpGfDYqB|X&Mm4q$Ddd%-`r z8;Zvc>``>M=A2gdGAHc0zGs@Jg)C30c2R5#8mUz?oY}D^)-cYJj9)rAwhUfJjVJPo zCT8s2&fSn~D8Dv|MaSp2v^6D?#+J6T$%_@8>Fie$_jWS|?OWP-B}whMf`ZA5+{j0z zR$hb+j((MJBea>|x5g=~cmyG$MqMkeARJGwo?=zx7{;#JQQ4<*`nR>hEIUG-@2ED4IO*llQ3(FFygYG zhh}4zX#8TrP`g8W1_xA^846rv<2>`_PU#EnKl14g=!^6}vTXI~2W_rZ)u;48){IT~ ztl{3Wuv}hV;lKWPyTN@X_>A79UyG>b{Rl1De?}OpA?WWlJY3VDOYoa6ZFC^dS_*>w z`!4moYKRD!Wn?}k0)<{QP>OVAGD|@y6)9E;MFNvzd)N-FXn{;#f4K_K8xMENi+a;I3fe`W#??NK^*0pUs5dvlH5N;87p5tXu8you zj-BK#*9D=(REo6;FUaOlMOPbF$Rrv0>W~?6^Dx%ksev6ayUM8F#Km<-t94*Iv4Z9DA$tZ6NQ!G@w8nHQps3>fiQTu@f_5al<= z;aR8Q!<57i!@>jGe$~9ay-OUR6obiKx{a*3^58CvcKwb}joelwLUE(!`p(xoa1*!a zmOn?S3uyR#J#)+f@>Kd|Kea_E7f#`D;;$o}c((ybOIjs0@b)7=s)`H4_?7N#+(ML5 zfD&NQGe~M7_R0L>7!G0*-_gj1X%f>x1`@ zHy6k^Wh99SEaEIZW<|!1;9iNlN<=dP?3J$5&z6C%-K#FOD@BSo38!rG4fUc zd{`{x+JqKmZC_OPhxE`I!R`@iQTr9-c^&RXn0Vd7T|C9~kdGI%pH<$xHIQFaQdm17 z+|!Jmy!CE=#t_D*Rle5yCSTX5uaBOh41;YiS~KI6S*l|b(X>MEfqQAKgm}!O#GT}S z&$Vf|ecz~?k!(_G6mw^#1B@UDXdO+HfS=XcK{#cYWY#f+er}dC-+?@(pN(rE@|N1J z*3?kX!M%)PpFCJC@@L&P_vi)U&&(22ug%hLRqD80+Bd;72>m@DfF4m7!J(KHkF9}9 z$xrxjBqqC!A+KTi)lAbt)p* z#$$D&MS~?kiW%hMY0E(PQWX)$k(nNC9xi_uJj1VD67=L>(OEK$r0-JMSDy^Uqg}`^ zU5W@T13$KQOIvsTrqQ~8q2)ci8WRoD2BIq&=W{qmHLKnH`iSp=&t zL_ECRUy98N0`-5N{xt+_hxYlDV|a<$$~h;MQf?q4zs95l3CA-jt$z*+3vx^ZhGGDUF{ zteF%HRunZ8IOiTdRhwzWswTBgac9*c7e;!g7H_z)3Z>3eJq9n;;;JQ6ueR6h z19GirGl=)ic4>@1fc!b^3i=a6?=ZL5`^~xN(f11T6RT@yvnTe=`ziA?;MWeh*;TG4 z&u8fUUU!4v8+*!tzd5j;CiQcI>mrWWHVwB4Tj481(iu|1Mk{H=HnT)nh<=(~Nkv72&Ms^#3JMjch8a`wE>){6mlAGE zChoK(p>wMQbjyq@79iq{F@J9?8tUs9+_mSp&w6*Rc2IwXCjt6KUb9ks^grqgtM>f(5{hBDTTbvQvr!*GCzz@|Ym;R0sR~OmTP$qrzg7 zeq1#(A^EA_qzR|@8zuWJ=%$aqP=(THr}qs~DKCQ;hs!FJ)bA!6xfLk&Wh5!JXr=ek zDaM#;CuyFEnX+|?rUUWR$Qp){A?=_I)yT4#}y0`cx~8WG0)w*%bfUEXx|cRI2c-R086wSUs;UeF_%``WI&vSd3aq zRo&o|Dsn0x7qd`ZMYkQ>9X6 zCXXeZkBaS^?K_#qI)&bpITbhHkL4=1#QinJ;&PfeTKT#q)gymJbQ!$E1F0MTXiA0l zaQpF_9!m_~1Mqn8UN`;&-%B7Rdnw=CZTGiH0Cd< zV3o*n4}%I7S~*khyVPdJ(E$dvlyoUps)<020~NWz^al)*XWQyLo-yX4USM+RGeOn9 z#1HhbU`UALZJLYZ3ab<+rl}-A9>R4x>CYT}&6r6B%%J4($KIty1>|kL@->{EV<4sU zX1MP6z^Lw)xD3SE5Ovx>IkgsTUG+$v?a}#$$9hi}qpu8el-+ZO#suTK8F-pIQu%h4cX1|) zYs0ID+YTIhjWC*L!6sot%g}tWi7U3@6`FIPU)sG0pzZ^P9MT@1B1}ALS-4=U3)YQA z*oCRI)`uRr=iR<-z|!4f|)Zh0?DrOgGaU$NMVDF{a zH^Zo01D#9KHY{<%22Wbe7iGAZB*VZJa(tKu1^j~3e0-C&GPy;n(iCeSM77)d9aYrx$&61Qkq z{_dYt(K9=ws;!GmR$sm!wLVkamwl+ZK^vWHT_zvpKBM2~y-?XWTu(+&aO)ajPKx!2 zxnabw_4##k%iJaKoRvzcf5keg{zkKJ?N@$7yIJKkq+RD%dIL5(gI}!rjOk%OmPKxw z4kOmvtQ3UFfY!3aWRGQ&hoICOad4>Bx&G)-vwk72VcziH4mPle~FW5y| zxP(&IpJ3$!GF~_8!S`3gltjAE%{DWMSEi)l92mw%Ifm+RwOX_$N3$$ND`UkNUdX^ zy+358d2vxwlrN`~?#f>DWwt2bgGi6D$40|)^y@Lbb&nimU&{P_~H15YDDRdU9} z<9p?E!&aD=t?_5a$9%rm5Ks0-ta+Fp=(W{^)P&ggWwB;%pqifdm7fJ=9^)bIo)%Bd zgHkdHw+8+VpaU;gr0y5B@a2%SVMPA3sKYQo5sqX`s23HSV+4vrO4g?k549`8CxZr| zKtu-AVI;L;z3qd)=iyVUA;W|2tHc~4U#j#(QZF?6JstV+O521JWluXnW-Uz;8ERp- z&1KL1N7bvl)jnw4q#j{yq)Z9TCMb>fE5`LHyK{RIDlya|wDWhm3%tYQ8=8ZX6Z_dO z8Vd$WK1N(v#i&&U=m;aoJ0xbqI1V(Yews9jgSy% zZ+6kZ2{cs*wpD`AZ-obLt}w-zTw3KRIbP!OVP?0t(-9CRviP)H4i^k^j~=INf?GmK zH@+@GE$}&*@q%|AuQ-@5=q>54Ic*WsFX*GB$ME!{3OfAaa)|u7g#cx0#1!W;CWP1MQu*pyqGJoQ$*v9lLCS zF_w4O&K;f2SstLB^cR=aTlr{AVUtnHWKJE*P5dg@)Xw=U@0`~c7Z+)69z5i|xR)`- zB1R3s>@7K)U~-Fbj#jZsFXY8d&}$Z_DDC2eQbb{kp60jr!o})AegLobwq>n$W8&0w z%eoydu66{)n&7cu+t_h9cLb%&tyiI{)ChHIZE65gXgK;>owWAZ!FV^eF6o z$vb3ivTLy31Jze)ZE!hgtw5L^cn{4rh}y``ZCh0D+@0Aj5z3FkB{=_Z?{umMhOoBS zfyh_QhNZEW@Gy-Mk2G9bJk!E{<0^$S+;qMEbhqoo<_IkN9jd zJwx*d^<~i=R<}@(Y+dRNv(|8TjZTkLUcwD?dc$?>9b?H8eYWWz=3_AE zeFk30a;^32yG9Nr8RL5J4sVN76UXrmV2Yv{g4T!8rLYNebw|)8=}W_P`(hLIV)8ce z>q7e_mjEilSiGnXyJ|d{31X!dl$Lvw)0=i>v54Y45uDeYqfxbS0$l)=YuhA0Ntm%h z7QZ0hm#o3mrCF+I`sBHyBzd{SIRwk4+Qb#dUu9+68-Hn24(A}JYym4tEH1T5>lO^w zH#rd5<*s(Ny0$gjjBypIwc>M|=Xqo3rvr-JY#x5hIJU)lbp@XV+4x*&Nl;?%Yw)2} zCi>8z3d1j5c@Q^1*}o>P`2BN~PDhFX`!k*_R`jvo9I3R=y>ZjI8-eeCe5}bn!Z2Py zG>^nh@^cmH-=bbF&@ssTf*E(*S=c{9Ja_0ds6GJ6RKcuNVa%!!Y?Yubl~ij5Rt{km zK;8;wA9N;!S{KD-M`?5pkWo(oJ69%}gP%^7-asEc%2qBgsb?l8C_@aH1Jzj^ z9u%iDX8j~sA5P4;06!9b#fP4+ZF}d>>~xXt?^N~GP7nIpdiQHRPi^YBEGy4xx42e< zD!gz&x$bwm30kFNEg4y1{{$5g`14i0HSE8roOH7YoF!{}7^LJW;2!L)E!q2C>+2Gu z1EfQmN-@RCQc~>~QgXi&664mgRlu1kQmBY#r1F0`bfVY~w&RKZCXQATP~IFhUvi9C zjYru8MWGP-gfZj~<-#lh_?$l`?k8vtZj`V~c z=5KsuU-oy?W%CCE@O)e{&ym52yZkWm2y&JKFh0#8heaMZ$hcOrNj11ovc4j6kKBl= zs)|FVu&4p-M5#Jq^Qh-cVRaXFZQu{#Ys+VT+3NfLLbAgK9MPldFxx(Q@>K|fO~HvR zicQMd5+iM4AxAPlD=Bfe4O-i~Xv=pe#KQ6G@8_a|uS_P%YMzTlX>GvEGD}zu=7L0t zuv>%n?z$NEacqD>^IAXJ?A}YZwhK-DbFrl65&E6nsGb4t#^KdSP_;8qI67E^6%TnH z{HUBvsN)0xVufr{j)zh65TL_~Iao;a?(hZW3D^-rDhL`dhn%~CZyAnY&URT&qoo|<@%^$FuueFoTOMWIFk7vNrDr~%cL z=d@bRAoy=p&yZd5I<>N= z>=e)&yyr!2a=mc8#dvf6Zzny|h=T-DostAgCN(*)-?GDqufpG{?&; zWj>+07V~6`iNf>4eZ-wmBTa^07QZ+NlS;=~6>-y;JN}OOi_De5=mSwsnl=F`HIEDh zG0vrOI_L+$Q-UCM{HZIWq=nal;PYFLs=?eKJ|tmSPv9{uuWcF50l*5m3g@a6)88m< zPzaHp{exXQP7*Q%ceVVt;KmQdiWxVX(i<}A7z3+f*T|4^Riy;do5E)+$`P*u>9^t} z>0_Q?KP4#A8dwaE!Ik)=0@MLal@iBBU+>4!HQe!o->cH0wksggbMN?-ky4x)1L zT4MPJW+d^R`mBs=lD%9}WXL&LQovt1D$km))!w{fBqUcM;Z-EH3D+~l7SrZ_TXt^4 zbsVP3PD`~&9ph!Ih=?#om5f=t(js3-##QCO{`spM=O7IUCU#;hG~#C#qg9bP5~ zv?t^Su%J@1%{wVG^AQ+VwDkr;;XhY3UKY$&aec$q6!+D1dOJyP+GAOMq>OSm{5+ji zfU4AV>59-oVotkLHJKSn)Kbf=^mb__FtyZ}Ue6HE`G&_65YD5O4%mY}A>C4;54Afn zjVrPXVYzq0D6+@Ga z^yfB_%BQ{Pkst1a!a7)o7k+=)qj1p6x7p9&Y3+5G_xZ564}3uU39-aytPmrX{_WrQ zIt5=GIknu7x%tv*1~14-wcOCi`NJ)ydx$nYUnDyfeSq5iPY(rO+=p`ezS|RRin>ie zE8+&!3Di~l3*lRlAFO{xE`#uU)IeEo7+iV0!yi-)ITb2(Nyh`BU8`)=GBTPF=HjKu zz{B3XL#f{Qz=KI?rKA3yF{P^S&%aHoZM}F22N2TrVwXT8b5e_zAG~dr{9@sF$9hn+ z=N!|u$SvdMYFC$iw4iVNokL)dDo3n_gK?>IDW@w73yA7IO*sD|# z@}NJ!CTBUaDk&WT&DI~MgtG2K^OZ&&`+Z81oS-x6e2bD$D8v(slavi1`d6TcBhOlo zO^Wm^cDd2yT62jVUP76)uhf^#^U|9xUKe!zSUFzW+4R78_bLsjZfjTDAdFtx>ng@l zT{DneB~X2#cbhf}3@bX8r&#&%qz=oiw~r-_+E-okCMNd$24H z$}(iU71Hyr*gcssn|S~EC9Zv`xab{qZ+mr4CUNb>dqU)Lti8?c`QwIlBtSk%oA=JZ zh=9-~=Qe_cE+*b(%v7Xz$3P6K&jN1x{BtcBISOa?H<`?4{49=GeTPnpu)5|fXe2PI$`RNY%QeU1wVnWU*V(`$$jc8uuo##DU7ykb4{G% z#S^B>D?V;fEpf7cQ|d;vFsT>bY--R9hOAwyq_lh0EbeWp7kcF8GM1KCq`pEJ0PFeH zrkzcR8l7%To%-CNyd~L#In#3HQ&y)-Fe{#CKhK38THKIcB|6i5i**Sxi-h=cUz7An zo?9{XcCkr5a}cJa)f5eh&r+)jdgtp>^=Vws;4Q>2$Vy$w*GB2%*~f?33^8ALyOZ?A zK6$BMqwJG#rk?f**-#FNRhalw2~YeJe+#{}V9G@KrPA!4U-kBxb(Td=6vpf(U6=P) z75RB)4Hzjg6>1L+k7`9-+p6JugMEH*uq?X}$z@V#W9X9m|HhOn9{Me*TTfn}Z`N2s zhdF8_3oHz6BbqAogpCr{1dhaPs^Wk+vwle^B3t93msz5bm z44asKy0R5(V(9wj%!|d-r{(c944{$l+7%fr0P=O`XVnVvJ(f?n0>WHPJ9Js9jv4pg z77zRLqW2s-RNcqzo~X&ue1!>Bmx-hmE&$#2+gogT(g%bX+amdW$nes85i#F=8QsDM z3z=3iMHV8*k~4)h+qtKKMwjE$B=wjr62!^jOyox04LJ(oMS)bp!hb4tq43TjB^K;J zYu#W>EL(x!&*3qu*CTX%*=1(j1mhPVD;3XjO4ft3eCV?Z&joQk@O27!ziT)DaVUI1 zTr1#(cDIb}^ub^DTKcK!9@PheUO*M3_+|mepgS5Yxx-~seVb}hd zgl=YEf<2dIllBgy{kvf*-Snu@{J^JO?K>TXz-c|- zB{KQ(>wK}xjNW>)!M*u1KJ#;kZ_dx4+ls$|ze%5C(Qm)x0sFG%eR6#TpGTOx2kKN{ zYWGPa`&LMITeM?P+BG{juhS#l?gpAyO)B_P5TOl0ZHZ}1v8=(g=eAD6sSC2US7+pz z%LiOE;TDb!uj7`w42oI=UG>30+5n|HK{w2_QV}>OzChKHBRhLDyVQ=DgqAT$7er-= zi*e>ek=XJ(cpa2}H?3d}9I4Kbj&g`kTF5i_dfKPPwcll>tvZdNe&9nloAdp_=0EfmBPFOf!|5 zr@&vc#_Af*>3d7Keom!!dH;SpVAwGn=UGnX#~-vjnWt!guEi)iXl5R_7v@bA3LycG z*OBTL+@H*Ksd+i7#tOLDlbM+%%pwwY`KQjI#(qM&Y-W!6lB^oX8Imv=&mq zxvBG_mbCg6_~WI8o@N@7U=Y)#7uTPrO$suha#oBHe7A3Z!|mP>GL-X%z!p(@^E(OE z9s{&5K`6bLaEeO>N^+owjx6IUAA=aZxMb$P9;&_YzaRM;rf(o%-GNM3A%ryE!?uY` zg-m#%*~~X?L;5nDErj)fy)Z15B7~LRAzkUeTRbUD1i`+d?rP(qG*=r5q%c*=5V(6KkzdmxuaZNaSuqas=z@tY=dN}w?!fDHr@ z24m$Gfhv+h)YJPJ6HNiT4qb&|=MZXj*L|x#zu{kW7E2%9x_m;8OQ?HA_Gp81zDT?* znjJp@#?6UYDr?f!RsNW~?v6^T)Tkt5kK7IQ_rL!vI|ev)>7)*Y8tLc>+V;rZl{qtW zypAkZP`>jprs_ki1D*38X<|$cCryk?6AGmrI6*2z3^q>>(F&VV^(cWHcG-{>-lV5Z=WOJdg@17mX zyAUP!IhG3W5!g>7^JV!#Bu#$sRHpXAbl~gFf?bv9fn1&>Uqy7mb_sZF9xtTQ-O={h zv^cEK(3b9%j!x3?JN^K40biOVIjG-2r1Q{ zNcuXw-8tj7@5*Df=yzOKN7N4PSO#fb$m#AsnJ%qNHWCd&{j8qKO7JOsN?lG$`UoW7 zu#o)=bg;G#+P*qYy;4?kCM(P$f(o!)cDW@gecFIJ&L zHNYORz$Qk*m&R9XX)Nc|4n>T!c)UB^V_{serQ0nx=vZpjih2v2yryh`x|tkH&a z-A{8mtc|rPoaRWlAis5(STgJDim04Tg>93_+mn~X02~*JW*Mf7FK*h)a+~7ewpevo z{L3?gX!kd%yGVnWE|7}5$b7|aaLq#{4(ZMB=*Ou*v3KY;scvLD!GkX8Zs>=Y%4R`b zv$2Bfkj6PhC|q4AOR;(twKOTaA!7BSam~wRrZ;76r@g5Zm5rpewTDhfk`5&KT zSp;DiA{OPy47j`1I5RgP{&zWyqD_ckMbN#I>ftrp;k8afzy>_bowq@RAN}7`?=94K zzBYw!{FYOM-s%^iL+;0So>G2D`=i$_VqborLjH)RYt++ne&EZ|R3pth1e?evFlI&{ z-g^Ia`o${M=pGIg=24>l1xcoLOsy~Y0sD_&S+0Dt+mb=a>S1TQ1SxTm8Xj2p7`hLM zSyxJdb};5u1nN2$jewv}6Hl`?Xzi7EaZinSzIWqqGl7*KtKT@;<{7)fHqCQsc;ycJ zT)50~=kkmrCa3LNZV#bxVz>?F80y{a2lka#G>LdiUs$lSr_b09 z9v^aX24fnv%POw2!SNrn>`K-nG}_FCExF!dhly8Kgdc+}!6Hc6`8G z4A%}1bh}=+*rFC)zb;p|rTFwSEH^;coCKCNN+d7PUBddU!q&TZxzn$4&(I41ozs?9^p7BDKLw=JEDLx(K43-;mb*g_{t*5Py7 zny&t!6^aa<#_drMUd@}X5bEWwWtrswI z0W_~&2AoCG{(S+e;j5Kt_jtF0U5kU~of^VZcwHButtNbrv@o9E6JO(j0xyCD4>XSg z%}Pgj7BfMTms0B3N|N?L8qd~HF5JNj$ul$5;mLOGRdX-iDqNWNWuX?hcaIh%usmA% zS*o8Ogo$1LO9hwoa9%~*@f6=Ql@f&UbS1P>az;z<0!L~w7~D->Q-tN$y7=0BeH~vR z1uEh}e4_*zdai_0;vqQ2*ko7$0uhX;qfv%!uE6{e4y*;tp`HOTIvvZXAlgBTwhat0 zcC6j}iL`It(Ghi z&$?Z?l-Lejt|7QfKk0!NKCQmG>Eee!cbSw|x5Yh)Q=8xbB>=xw@a1u?;UfpYcJj~& zAtOrf$F~NtXox&4m|jzwAaG;GJ0`gRSmPf|Q%V@7Pl&G{SM$d7M?m~Wdi2{qj`7BI z{hxzUi#fX$&QE-=QpWyIUH2ZZyhgQUz>DCicJB9>0L6$#ZAdv|P8W8$5Iix~BFtvR zvXh@;^Sf^ma{42M%RsLpo8rqJZOvG@TKwpr1{n8<##zYsx}Hx3kn11h`vZY_pY#1@ zYWx>$jHfZXULZEF&`4r-8?Sp1Jx6gU&lXcM1XX3%+>YT zxXs6T*f7s}OB%5}ZhSQlplkaugv)K;XQLwt=h|Rn*w_lbuYsR3`qvZke+W*E_T%Q- z`xXSdI2F9>@Iq!hGrwuBrGsauce8Hv>eu-z zn1#JTYR6NS$|`c7QR9kzYD%GZyZ5|I(_<6nyyE>9iwt$c*?EN5+o6{heV4-cIAzaYX}pN;d$v;GIMAHa6Jp_{2Voz4#{@4nrKDV^Fq1Dfq$&Y*%No zPjNU6GqdNeLe2A0W@Zv{#(v{FRXEqlaQ-g%opHM(IY(5d0fp3hycl(qm~X0ilW?FT zJu3Di&}J8eW5WaSZBQ@C=e0n^-POZ&{^5j!=CD?apGf4hIZC#^b$Mel^6pqqGUX8x zm6mk$$?f3YthlLOhHG#g%A7p1>U29QsqJFbfCe{XkR)=Q#u|N0EI746(@kz{CCm=) zg=uj|uBpCv_Y1%^I1kq=LO^Oa%XT_`kKd_J-iZ)>!S_vETuxSyo(7x?gitBI1CBE- zV@$qPd1bkdjg5ykXcC%4kReAz@ESF3kQvdMCk*@p^p5!hMsL>?)ws3?byqdb^fzQ= z6uUwBHJS?MWuMh9uL{W}@r?hs%&1s{%IhCC?0liCQB(QzPoO_X)UVR6;dl&vVCXS6 z!*J&n8REL>Bwe9NZrO_l^>OL6(dmSn!dj0-Kgb&W_VzTNe`1Rh-leTEK$!c}`@@VK z3GS`F;d-A!uF^BpkF6oly@r8CHcs1(t6b@0W5>5MGsA=mQI8F#-CLQ8D@Ud5Frt>W zHsDm*QBR~aSc$bfdZnevf=Zjv^-mD|j@6O+%7kIrcS=S6K8`Egt|;tjm-3DfbDx*xMUKkft93(LQN=o9Aplf5DVjA5nMASf8<5(YZN z1y18wrm#D`MG^*o$c5t&5B!nJp<}4(Oyd=mO3`Xr&v~JHaq=+8)ljDc+K((TgFrT@r3)ngm)OE~7+>u1M60ISU(C4<2 zMucV@lmZ(b}h<_o7%ffyFz%K+9(ZAKl``KQur@gzXz zhW2>P5GT8ur0!ZffBFTJ<~j7-g8u#6g3gO$5Sxbw^WCk|4%V|Gr-u+4o_LGY0<-em z$`bf9v1V-B{8N*yK?g+dCS*EC&sW_pWKc?p5C)Ce>=R7}Bvmrn5pY~S9O~bYFi3Co zhGx)N#Qhm?!H~Q$<1R43G2!W9T}^~)h+%%=EVpf9GHfy;Q{nFBEimE*#Y9Y>rGcAs zLOWcN?{3J$-Kx=%Xp=w01^VHfGp^h*%zP|U_KT&Vv0cR;4H=o9$i8m)gMDgL{Dhm_ z&6Q|2D(HJj`noWRHpup{mmB71mf|0%@tNRnYKZ$lfV0!Vc*iHS;~s*p8{1yIjNE>F zr#Z!%@>ixP*4<_eYq^a7X5ToXl<0dxseX*+mdiMRV+d#Mt$lio5dpw)0G!d_TXED$ zvP~vIm*fAvC{LHwbw3QpZyEj)N@l&S2!l0eD5zgJaRc|cfJV%W1mDiuynwxidjD5; zS{9RjI&%7Gi+-W{$EQaQu}4gXn0@B)pJ5XEcZOb_0>bt)SbEZ$e0sPKedER36%oYH z&2gJV-_Sv+?--c^tWbjIqGen8fxj%P>fx$aFn&_vHKD;R=%d$a`ELzGvJ0YK?+JoE zAo7NP-|6iZh4}fV+Wp8>BV1=dXFqb&mHqs1p2T!0c@Tu%mj6h0GX5)~@>#9yh#SW+jg z_WqWhyXy0xKqg7zP@y^1I@Khh(*}5xrRC&eS!}A{s_W1{Y{mrz zttm^s2n0XO#H`zS8|<6uc^fM1e9^8dDr~MR$x8KUB2C|ZQQMq&77M(@%`L**x-yJX|G z4}37B0i>~c)_a(9ZPzZ=V6}o*UYAiW@GIJ*&HM5 z+S0DI`Wuw;;~BxogAXH_NT9h?Eq z2!;qdujF-MO7-c%wmo?gG)g zc*p)%bY>kf)6#*`w{NF8|95oeKM_v<6KDB9XniXG2jN8WkH7y#Kol}`HvKo+Nl8~4 zR1lSScX6e}x2!lh89`8O8u`u)KMfIFDgNNKELb+GbL^t*y;=|2>j>(uu%I&&RZ?gg zINts^*?zdez1I4es{Rd%B0b!2q@U>qQVq5WOT$I)GTosoTq-pW4!f zbGO=OebZ7PQSueyX5}ak`N4rP=RRvbtbdD#RIFBz&wH$Qr|UZCOH@Q>qwT>u;H!^V zuXX6Q=xnlh166bCv4VxCB}^%{5Yo4RIsh#^iQYkYo`WnHt6FTeMtW@YEbUFw$(vtY z;xSD-TNC1Jd4r)=l7KM|V7}to(Sc0dC&OCmJ`~Oo0tE!#qq2dnnQ*)x^1#9b))lv{ zH`c5?76{9#eGrbuy|ZTIGO-K44EZzJeAaVGh0h8x_FHxmxg6OKODC8jG4(xNFfSQD z@t`0FZNbTODCdHY8^y$-!NctC8TSd$bv=d*yEkA$W~yAXp=x}PL_>gDBc(I2Vjt|q zk&Vaw6b&3DjZhR|jDPz|M}_*HdSlxh@I~!H{4Yedf3{rge@IJ}wRf?!w-a?UwQ~`+ zw{vQ8RUN{`&8~`u?9ik5=H71`|Z|MVadK$YEqlQ9~=aMm)0#F)$ERL=+ig zx53?8S|Ee#9 zC;a`{SM@T#YW%M>TIjFezkT~>eZS&rzZu$@IN4j8&^x<2IM_S6(7UnF+dI?$KMA(~ zqzuhx~L|Ss)40utpqkp@Fa1={*!S)om5DWvH%uHv$HCxDBWdDZF z@xuXiE6p&;T2M`O(tzRy! zh#fJYw<=5B1e+G)$v>mG-1w3D+NYBB4?`BfeRoI~1vGa_EsXv6{_@ud-K;|i7Q3I8 zROx9|vQRo|z1D(>u|HI?aRO7}+ep?cJghqYiLCOXly+Cgo7SFv3-_5k1TQ22{_WHS z^I_W6W0Uv}2Y&jqAI!X(y}$Q?-v{bnO)2$F$bS4PU&p_jg8J?I*Uvwj^54+E|J9U# z6qw|{)cHS!o~^R_FNi#EW|1RuC%P7vmK0^`^nsAEl(0%XVjz*~FH}eCzvww^5vn>k z+*;hC`;`Kq`8PdKSBl}9ucwN! z<}5O;X%vp1PR{n|)o0+rNG#JnL!tVeT8qtgu96{Xwh=yw(=1#in@zS+gWY!5wRVn0 zMA(giW-%MBHKv_m|IvVP$CpJi=ov`>vf6AFP^Pu!3P*)r%c)=mE_O24k-*70>c8

* This should only be used on AdapterView's such as ListView as it just * calls through to overScrollBy() with the scrollRange = 0. AdapterView's * do not have a scroll range (i.e. getScrollY() doesn't work). - * - * @param view - * - PullToRefreshView that is calling this. - * @param deltaX - * - Change in X in pixels, passed through from from overScrollBy - * call - * @param scrollX - * - Current X scroll value in pixels before applying deltaY, - * passed through from from overScrollBy call - * @param deltaY - * - Change in Y in pixels, passed through from from overScrollBy - * call - * @param scrollY - * - Current Y scroll value in pixels before applying deltaY, - * passed through from from overScrollBy call - * @param isTouchEvent - * - true if this scroll operation is the result of a touch - * event, passed through from from overScrollBy call + * + * @param view - PullToRefreshView that is calling this. + * @param deltaX - Change in X in pixels, passed through from from overScrollBy + * call + * @param scrollX - Current X scroll value in pixels before applying deltaY, + * passed through from from overScrollBy call + * @param deltaY - Change in Y in pixels, passed through from from overScrollBy + * call + * @param scrollY - Current Y scroll value in pixels before applying deltaY, + * passed through from from overScrollBy call + * @param isTouchEvent - true if this scroll operation is the result of a touch + * event, passed through from from overScrollBy call */ - public static void overScrollBy(final PullToRefreshBase view, final int deltaX, final int scrollX, final int deltaY, - final int scrollY, final boolean isTouchEvent) { + public static void overScrollBy(final PullToRefreshBase view, final int deltaX, final int scrollX, + final int deltaY, final int scrollY, final boolean isTouchEvent) { overScrollBy(view, deltaX, scrollX, deltaY, scrollY, 0, isTouchEvent); } @@ -62,65 +56,49 @@ public static void overScrollBy(final PullToRefreshBase view, final int delta * Helper method for Overscrolling that encapsulates all of the necessary * function. This version of the call is used for Views that need to specify * a Scroll Range but scroll back to it's edge correctly. - * - * @param view - * - PullToRefreshView that is calling this. - * @param deltaX - * - Change in X in pixels, passed through from from overScrollBy - * call - * @param scrollX - * - Current X scroll value in pixels before applying deltaY, - * passed through from from overScrollBy call - * @param deltaY - * - Change in Y in pixels, passed through from from overScrollBy - * call - * @param scrollY - * - Current Y scroll value in pixels before applying deltaY, - * passed through from from overScrollBy call - * @param scrollRange - * - Scroll Range of the View, specifically needed for ScrollView - * @param isTouchEvent - * - true if this scroll operation is the result of a touch - * event, passed through from from overScrollBy call + * + * @param view - PullToRefreshView that is calling this. + * @param deltaX - Change in X in pixels, passed through from from overScrollBy + * call + * @param scrollX - Current X scroll value in pixels before applying deltaY, + * passed through from from overScrollBy call + * @param deltaY - Change in Y in pixels, passed through from from overScrollBy + * call + * @param scrollY - Current Y scroll value in pixels before applying deltaY, + * passed through from from overScrollBy call + * @param scrollRange - Scroll Range of the View, specifically needed for ScrollView + * @param isTouchEvent - true if this scroll operation is the result of a touch + * event, passed through from from overScrollBy call */ - public static void overScrollBy(final PullToRefreshBase view, final int deltaX, final int scrollX, final int deltaY, - final int scrollY, final int scrollRange, final boolean isTouchEvent) { + public static void overScrollBy(final PullToRefreshBase view, final int deltaX, final int scrollX, + final int deltaY, final int scrollY, final int scrollRange, final boolean isTouchEvent) { overScrollBy(view, deltaX, scrollX, deltaY, scrollY, scrollRange, 0, DEFAULT_OVERSCROLL_SCALE, isTouchEvent); } /** * Helper method for Overscrolling that encapsulates all of the necessary * function. This is the advanced version of the call. - * - * @param view - * - PullToRefreshView that is calling this. - * @param deltaX - * - Change in X in pixels, passed through from from overScrollBy - * call - * @param scrollX - * - Current X scroll value in pixels before applying deltaY, - * passed through from from overScrollBy call - * @param deltaY - * - Change in Y in pixels, passed through from from overScrollBy - * call - * @param scrollY - * - Current Y scroll value in pixels before applying deltaY, - * passed through from from overScrollBy call - * @param scrollRange - * - Scroll Range of the View, specifically needed for ScrollView - * @param fuzzyThreshold - * - Threshold for which the values how fuzzy we should treat the - * other values. Needed for WebView as it doesn't always scroll - * back to it's edge. 0 = no fuzziness. - * @param scaleFactor - * - Scale Factor for overscroll amount - * @param isTouchEvent - * - true if this scroll operation is the result of a touch - * event, passed through from from overScrollBy call + * + * @param view - PullToRefreshView that is calling this. + * @param deltaX - Change in X in pixels, passed through from from overScrollBy + * call + * @param scrollX - Current X scroll value in pixels before applying deltaY, + * passed through from from overScrollBy call + * @param deltaY - Change in Y in pixels, passed through from from overScrollBy + * call + * @param scrollY - Current Y scroll value in pixels before applying deltaY, + * passed through from from overScrollBy call + * @param scrollRange - Scroll Range of the View, specifically needed for ScrollView + * @param fuzzyThreshold - Threshold for which the values how fuzzy we should treat the + * other values. Needed for WebView as it doesn't always scroll + * back to it's edge. 0 = no fuzziness. + * @param scaleFactor - Scale Factor for overscroll amount + * @param isTouchEvent - true if this scroll operation is the result of a touch + * event, passed through from from overScrollBy call */ - public static void overScrollBy(final PullToRefreshBase view, final int deltaX, final int scrollX, final int deltaY, - final int scrollY, final int scrollRange, final int fuzzyThreshold, final float scaleFactor, - final boolean isTouchEvent) { + public static void overScrollBy(final PullToRefreshBase view, final int deltaX, final int scrollX, + final int deltaY, final int scrollY, final int scrollRange, final int fuzzyThreshold, + final float scaleFactor, final boolean isTouchEvent) { final int deltaValue, currentScrollValue, scrollValue; switch (view.getPullToRefreshScrollDirection()) { @@ -147,8 +125,9 @@ public static void overScrollBy(final PullToRefreshBase view, final int delta final int newScrollValue = (deltaValue + scrollValue); if (PullToRefreshBase.DEBUG) { - Log.d(LOG_TAG, "OverScroll. DeltaX: " + deltaX + ", ScrollX: " + scrollX + ", DeltaY: " + deltaY - + ", ScrollY: " + scrollY + ", NewY: " + newScrollValue + ", ScrollRange: " + scrollRange + ", CurrentScroll: " + currentScrollValue); + Log.d(LOG_TAG, "OverScroll. DeltaX: " + deltaX + ", ScrollX: " + scrollX + ", DeltaY: " + deltaY + + ", ScrollY: " + scrollY + ", NewY: " + newScrollValue + ", ScrollRange: " + scrollRange + + ", CurrentScroll: " + currentScrollValue); } if (newScrollValue < (0 - fuzzyThreshold)) { @@ -161,9 +140,11 @@ public static void overScrollBy(final PullToRefreshBase view, final int delta // Check the mode supports the overscroll direction, and // then move scroll if (mode.showFooterLoadingLayout()) { - view.setHeaderScroll((int) (scaleFactor * (currentScrollValue + newScrollValue - scrollRange))); + view.setHeaderScroll((int) (scaleFactor * (currentScrollValue + newScrollValue - + scrollRange))); } - } else if (Math.abs(newScrollValue) <= fuzzyThreshold || Math.abs(newScrollValue - scrollRange) <= fuzzyThreshold) { + } else if (Math.abs(newScrollValue) <= fuzzyThreshold || Math.abs(newScrollValue - scrollRange) <= + fuzzyThreshold) { // Means we've stopped overscrolling, so scroll back to 0 view.smoothScrollToLonger(0); } diff --git a/library/src/com/handmark/pulltorefresh/library/PullToRefreshAdapterViewBase.java b/library/src/com/handmark/pulltorefresh/library/PullToRefreshAdapterViewBase.java index caab8ec7f..3d9ba31a9 100644 --- a/library/src/com/handmark/pulltorefresh/library/PullToRefreshAdapterViewBase.java +++ b/library/src/com/handmark/pulltorefresh/library/PullToRefreshAdapterViewBase.java @@ -64,10 +64,10 @@ public PullToRefreshAdapterViewBase(Context context, Mode mode) { mRefreshableView.setOnScrollListener(this); } - public PullToRefreshAdapterViewBase(Context context, Mode mode, AnimationStyle animStyle) { - super(context, mode, animStyle); - mRefreshableView.setOnScrollListener(this); - } + public PullToRefreshAdapterViewBase(Context context, Mode mode, AnimationStyle animStyle) { + super(context, mode, animStyle); + mRefreshableView.setOnScrollListener(this); + } abstract public ContextMenuInfo getContextMenuInfo(); @@ -78,7 +78,7 @@ public PullToRefreshAdapterViewBase(Context context, Mode mode, AnimationStyle a * {@link Mode#PULL_FROM_START}. The default value is true * if {@link PullToRefreshBase#isPullToRefreshOverScrollEnabled() * isPullToRefreshOverScrollEnabled()} returns false. - * + * * @return true if the indicators will be shown */ public boolean getShowIndicator() { @@ -89,8 +89,9 @@ public final void onScroll(final AbsListView view, final int firstVisibleItem, f final int totalItemCount) { if (DEBUG) { - Log.d(LOG_TAG, "First Visible: " + firstVisibleItem + ". Visible Count: " + visibleItemCount - + ". Total Items: " + totalItemCount); + Log.d(LOG_TAG, + "First Visible: " + firstVisibleItem + ". Visible Count: " + visibleItemCount + ". Total Items:" + + totalItemCount); } // If we have a OnItemVisibleListener, do check... @@ -133,9 +134,8 @@ public final void onScrollStateChanged(final AbsListView view, final int scrollS * Pass-through method for {@link PullToRefreshBase#getRefreshableView() * getRefreshableView()}.{@link AdapterView#setAdapter(android.widget.Adapter)} * setAdapter(adapter)}. This is just for convenience! - * - * @param adapter - * - Adapter to set + * + * @param adapter - Adapter to set */ public void setAdapter(ListAdapter adapter) { ((AdapterView) mRefreshableView).setAdapter(adapter); @@ -143,17 +143,16 @@ public void setAdapter(ListAdapter adapter) { /** * Sets the Empty View to be used by the Adapter View. - * + *

* We need it handle it ourselves so that we can Pull-to-Refresh when the * Empty View is shown. - * + *

* Please note, you do not usually need to call this method * yourself. Calling setEmptyView on the AdapterView will automatically call * this method and set everything up. This includes when the Android * Framework automatically sets the Empty View based on it's ID. - * - * @param newEmptyView - * - Empty View to be used + * + * @param newEmptyView - Empty View to be used */ public final void setEmptyView(View newEmptyView) { FrameLayout refreshableViewWrapper = getRefreshableViewWrapper(); @@ -190,9 +189,8 @@ public final void setEmptyView(View newEmptyView) { * getRefreshableView()}. * {@link AdapterView#setOnItemClickListener(OnItemClickListener) * setOnItemClickListener(listener)}. This is just for convenience! - * - * @param listener - * - OnItemClickListener to use + * + * @param listener - OnItemClickListener to use */ public void setOnItemClickListener(OnItemClickListener listener) { mRefreshableView.setOnItemClickListener(listener); @@ -215,9 +213,8 @@ public final void setScrollEmptyView(boolean doScroll) { * a state where a Pull-to-Refresh can happen. An example of this state is * when the Adapter View is scrolled to the top and the mode is set to * {@link Mode#PULL_FROM_START} - * - * @param showIndicator - * - true if the indicators should be shown. + * + * @param showIndicator - true if the indicators should be shown. */ public void setShowIndicator(boolean showIndicator) { mShowIndicator = showIndicator; @@ -229,7 +226,9 @@ public void setShowIndicator(boolean showIndicator) { // If not, then remove then removeIndicatorViews(); } - }; + } + + ; @Override void onPullToRefresh() { @@ -395,8 +394,8 @@ private boolean isLastItemVisible() { final int lastVisiblePosition = mRefreshableView.getLastVisiblePosition(); if (DEBUG) { - Log.d(LOG_TAG, "isLastItemVisible. Last Item Position: " + lastItemPosition + " Last Visible Pos: " - + lastVisiblePosition); + Log.d(LOG_TAG, "isLastItemVisible. Last Item Position: " + lastItemPosition + " Last Visible Pos: " + + lastVisiblePosition); } /** diff --git a/library/src/com/handmark/pulltorefresh/library/PullToRefreshBase.java b/library/src/com/handmark/pulltorefresh/library/PullToRefreshBase.java index 8ed2a2bce..6867b288b 100644 --- a/library/src/com/handmark/pulltorefresh/library/PullToRefreshBase.java +++ b/library/src/com/handmark/pulltorefresh/library/PullToRefreshBase.java @@ -122,12 +122,12 @@ public PullToRefreshBase(Context context, Mode mode) { init(context, null); } - public PullToRefreshBase(Context context, Mode mode, AnimationStyle animStyle) { - super(context); - mMode = mode; - mLoadingAnimationStyle = animStyle; - init(context, null); - } + public PullToRefreshBase(Context context, Mode mode, AnimationStyle animStyle) { + super(context); + mMode = mode; + mLoadingAnimationStyle = animStyle; + init(context, null); + } @Override public void addView(View child, int index, ViewGroup.LayoutParams params) { @@ -188,8 +188,8 @@ public final State getState() { } /** - * @deprecated Use the value from getCurrentMode() instead * @return true if the current mode is Mode.PULL_FROM_START + * @deprecated Use the value from getCurrentMode() instead */ public final boolean hasPullFromTop() { return mCurrentMode == Mode.PULL_FROM_START; @@ -207,8 +207,8 @@ public final boolean isPullToRefreshEnabled() { @Override public final boolean isPullToRefreshOverScrollEnabled() { - return VERSION.SDK_INT >= VERSION_CODES.GINGERBREAD && mOverScrollEnabled - && OverscrollHelper.isAndroidOverScrollEnabled(mRefreshableView); + return VERSION.SDK_INT >= VERSION_CODES.GINGERBREAD && mOverScrollEnabled && + OverscrollHelper.isAndroidOverScrollEnabled(mRefreshableView); } @Override @@ -461,11 +461,9 @@ public void setPullLabel(CharSequence pullLabel, Mode mode) { } /** + * @param enable Whether Pull-To-Refresh should be used * @deprecated This simple calls setMode with an appropriate mode based on * the passed value. - * - * @param enable - * Whether Pull-To-Refresh should be used */ public final void setPullToRefreshEnabled(boolean enable) { setMode(enable ? Mode.getDefaultMode() : Mode.DISABLED); @@ -551,9 +549,8 @@ void onPullToRefresh() { /** * Called when the UI has been to be updated to be in the * {@link State#REFRESHING} or {@link State#MANUAL_REFRESHING} state. - * - * @param doScroll - * - Whether the UI should scroll for this event. + * + * @param doScroll - Whether the UI should scroll for this event. */ void onRefreshing(final boolean doScroll) { if (mMode.showHeaderLoadingLayout()) { @@ -640,16 +637,14 @@ protected LoadingLayout createLoadingLayout(Context context, Mode mode, TypedArr * This is implemented by derived classes to return the created View. If you * need to use a custom View (such as a custom ListView), override this * method and return an instance of your custom class. - * + *

* Be sure to set the ID of the view in this method, especially if you're * using a ListActivity or ListFragment. - * - * @param context - * Context to create view with - * @param attrs - * AttributeSet from wrapped class. Means that anything you - * include in the XML layout declaration will be routed to the - * created View + * + * @param context Context to create view with + * @param attrs AttributeSet from wrapped class. Means that anything you + * include in the XML layout declaration will be routed to the + * created View * @return New instance of the Refreshable View */ protected abstract T createRefreshableView(Context context, AttributeSet attrs); @@ -685,9 +680,8 @@ protected FrameLayout getRefreshableViewWrapper() { /** * Allows Derivative classes to handle the XML Attrs without creating a * TypedArray themsevles - * - * @param a - * - TypedArray of PullToRefresh Attributes + * + * @param a - TypedArray of PullToRefresh Attributes */ protected void handleStyledAttributes(TypedArray a) { } @@ -695,7 +689,7 @@ protected void handleStyledAttributes(TypedArray a) { /** * Implemented by derived class to return whether the View is in a state * where the user can Pull to Refresh by scrolling from the start. - * + * * @return true if the View is currently the correct state (for example, top * of a ListView) */ @@ -704,7 +698,7 @@ protected void handleStyledAttributes(TypedArray a) { /** * Implemented by derived class to return whether the View is in a state * where the user can Pull to Refresh by scrolling from the end. - * + * * @return true if the View is currently in the correct state (for example, * bottom of a ListView) */ @@ -713,9 +707,8 @@ protected void handleStyledAttributes(TypedArray a) { /** * Called by {@link #onRestoreInstanceState(Parcelable)} so that derivative * classes can handle their saved instance state. - * - * @param savedInstanceState - * - Bundle which contains saved instance state. + * + * @param savedInstanceState - Bundle which contains saved instance state. */ protected void onPtrRestoreInstanceState(Bundle savedInstanceState) { } @@ -723,9 +716,8 @@ protected void onPtrRestoreInstanceState(Bundle savedInstanceState) { /** * Called by {@link #onSaveInstanceState()} so that derivative classes can * save their instance state. - * - * @param saveState - * - Bundle to be updated with saved state. + * + * @param saveState - Bundle to be updated with saved state. */ protected void onPtrSaveInstanceState(Bundle saveState) { } @@ -789,9 +781,8 @@ protected void resetHeader() { /** * Helper method which just calls scrollTo() in the correct scrolling * direction. - * - * @param value - * - New Scroll value + * + * @param value - New Scroll value */ protected final void setHeaderScroll(final int value) { switch (getPullToRefreshScrollDirection()) { @@ -819,9 +810,8 @@ protected void setRefreshingInternal(final boolean doScroll) { /** * Smooth Scroll to position using the default duration of * {@value #SMOOTH_SCROLL_DURATION_MS} ms. - * - * @param scrollValue - * - Position to scroll to + * + * @param scrollValue - Position to scroll to */ protected final void smoothScrollTo(int scrollValue) { smoothScrollTo(scrollValue, getPullToRefreshScrollDuration()); @@ -830,9 +820,8 @@ protected final void smoothScrollTo(int scrollValue) { /** * Smooth Scroll to position using the longer default duration of * {@value #SMOOTH_SCROLL_LONG_DURATION_MS} ms. - * - * @param scrollValue - * - Position to scroll to + * + * @param scrollValue - Position to scroll to */ protected final void smoothScrollToLonger(int scrollValue) { smoothScrollTo(scrollValue, getPullToRefreshScrollDurationLonger()); @@ -924,10 +913,10 @@ private void init(Context context, AttributeSet attrs) { mMode = Mode.mapIntToValue(a.getInteger(R.styleable.PullToRefresh_ptrMode, 0)); } - if (a.hasValue(R.styleable.PullToRefresh_ptrAnimationStyle)) { - mLoadingAnimationStyle = AnimationStyle.mapIntToValue(a.getInteger(R.styleable.PullToRefresh_ptrAnimationStyle, - 0)); - } + if (a.hasValue(R.styleable.PullToRefresh_ptrAnimationStyle)) { + mLoadingAnimationStyle = AnimationStyle.mapIntToValue(a.getInteger( + R.styleable.PullToRefresh_ptrAnimationStyle, 0)); + } // Refreshable View // By passing the attrs, we can add ListView/GridView params via XML @@ -1003,7 +992,7 @@ private void measureView(View child) { /** * Actions a Pull Event - * + * * @return true if the Event has been handled, false if there has been no * change */ @@ -1131,11 +1120,9 @@ private void setState(State state, final boolean... params) { /** * Smooth Scroll to position using the specific duration - * - * @param scrollValue - * - Position to scroll to - * @param duration - * - Duration of animation in milliseconds + * + * @param scrollValue - Position to scroll to + * @param duration - Duration of animation in milliseconds */ private final void smoothScrollTo(int scrollValue, long duration) { smoothScrollTo(scrollValue, duration, 0, null); @@ -1200,9 +1187,8 @@ public static enum AnimationStyle { * Maps an int to a specific mode. This is needed when saving state, or * inflating the view from XML where the mode is given through a attr * int. - * - * @param modeInt - * - int to map a Mode to + * + * @param modeInt - int to map a Mode to * @return Mode that modeInt maps to, or ROTATE by default. */ static AnimationStyle mapIntToValue(int modeInt) { @@ -1273,9 +1259,8 @@ public static enum Mode { * Maps an int to a specific mode. This is needed when saving state, or * inflating the view from XML where the mode is given through a attr * int. - * - * @param modeInt - * - int to map a Mode to + * + * @param modeInt - int to map a Mode to * @return Mode that modeInt maps to, or PULL_FROM_START by default. */ static Mode mapIntToValue(final int modeInt) { @@ -1331,9 +1316,8 @@ int getIntValue() { * Simple Listener that allows you to be notified when the user has scrolled * to the end of the AdapterView. See ( * {@link PullToRefreshAdapterViewBase#setOnLastItemVisibleListener}. - * + * * @author Chris Banes - * */ public static interface OnLastItemVisibleListener { @@ -1353,26 +1337,22 @@ public static interface OnLastItemVisibleListener { * finished a touch event. Useful when you want to append extra UI events * (such as sounds). See ( * {@link PullToRefreshAdapterViewBase#setOnPullEventListener}. - * + * * @author Chris Banes - * */ public static interface OnPullEventListener { /** * Called when the internal state has been changed, usually by the user * pulling. - * - * @param refreshView - * - View which has had it's state change. - * @param state - * - The new state of View. - * @param direction - * - One of {@link Mode#PULL_FROM_START} or - * {@link Mode#PULL_FROM_END} depending on which direction - * the user is pulling. Only useful when state is - * {@link State#PULL_TO_REFRESH} or - * {@link State#RELEASE_TO_REFRESH}. + * + * @param refreshView - View which has had it's state change. + * @param state - The new state of View. + * @param direction - One of {@link Mode#PULL_FROM_START} or + * {@link Mode#PULL_FROM_END} depending on which direction + * the user is pulling. Only useful when state is + * {@link State#PULL_TO_REFRESH} or + * {@link State#RELEASE_TO_REFRESH}. */ public void onPullEvent(final PullToRefreshBase refreshView, State state, Mode direction); @@ -1380,7 +1360,7 @@ public static interface OnPullEventListener { /** * Simple Listener to listen for any callbacks to Refresh. - * + * * @author Chris Banes */ public static interface OnRefreshListener { @@ -1397,7 +1377,7 @@ public static interface OnRefreshListener { * An advanced version of the Listener to listen for callbacks to Refresh. * This listener is different as it allows you to differentiate between Pull * Ups, and Pull Downs. - * + * * @author Chris Banes */ public static interface OnRefreshListener2 { @@ -1450,9 +1430,8 @@ public static enum State { /** * Maps an int to a specific state. This is needed when saving state. - * - * @param stateInt - * - int to map a State to + * + * @param stateInt - int to map a State to * @return State that stateInt maps to */ static State mapIntToValue(final int stateInt) { @@ -1518,8 +1497,8 @@ public void run() { long normalizedTime = (1000 * (System.currentTimeMillis() - mStartTime)) / mDuration; normalizedTime = Math.max(Math.min(normalizedTime, 1000), 0); - final int deltaY = Math.round((mScrollFromY - mScrollToY) - * mInterpolator.getInterpolation(normalizedTime / 1000f)); + final int deltaY = Math.round((mScrollFromY - mScrollToY) * mInterpolator.getInterpolation( + normalizedTime / 1000f)); mCurrentY = mScrollFromY - deltaY; setHeaderScroll(mCurrentY); } diff --git a/library/src/com/handmark/pulltorefresh/library/PullToRefreshExpandableListView.java b/library/src/com/handmark/pulltorefresh/library/PullToRefreshExpandableListView.java index c861c6bc1..b66e089ae 100644 --- a/library/src/com/handmark/pulltorefresh/library/PullToRefreshExpandableListView.java +++ b/library/src/com/handmark/pulltorefresh/library/PullToRefreshExpandableListView.java @@ -40,9 +40,9 @@ public PullToRefreshExpandableListView(Context context, Mode mode) { super(context, mode); } - public PullToRefreshExpandableListView(Context context, Mode mode, AnimationStyle style) { - super(context, mode, style); - } + public PullToRefreshExpandableListView(Context context, Mode mode, AnimationStyle style) { + super(context, mode, style); + } @Override public ContextMenuInfo getContextMenuInfo() { @@ -53,7 +53,7 @@ public ContextMenuInfo getContextMenuInfo() { public final int getPullToRefreshScrollDirection() { return VERTICAL_SCROLL; } - + @Override protected ExpandableListView createRefreshableView(Context context, AttributeSet attrs) { final ExpandableListView lv; @@ -100,8 +100,8 @@ public InternalExpandableListViewSDK9(Context context, AttributeSet attrs) { 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); + final boolean returnValue = super.overScrollBy(deltaX, deltaY, scrollX, scrollY, scrollRangeX, scrollRangeY, + maxOverScrollX, maxOverScrollY, isTouchEvent); // Does all of the hard work... OverscrollHelper.overScrollBy(PullToRefreshExpandableListView.this, deltaX, scrollX, deltaY, scrollY, diff --git a/library/src/com/handmark/pulltorefresh/library/PullToRefreshGridView.java b/library/src/com/handmark/pulltorefresh/library/PullToRefreshGridView.java index f7c5f2618..dea4d08c4 100644 --- a/library/src/com/handmark/pulltorefresh/library/PullToRefreshGridView.java +++ b/library/src/com/handmark/pulltorefresh/library/PullToRefreshGridView.java @@ -40,9 +40,9 @@ public PullToRefreshGridView(Context context, Mode mode) { super(context, mode); } - public PullToRefreshGridView(Context context, Mode mode, AnimationStyle style) { - super(context, mode, style); - } + public PullToRefreshGridView(Context context, Mode mode, AnimationStyle style) { + super(context, mode, style); + } @Override public ContextMenuInfo getContextMenuInfo() { @@ -101,8 +101,8 @@ public InternalGridViewSDK9(Context context, AttributeSet attrs) { 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); + final boolean returnValue = super.overScrollBy(deltaX, deltaY, scrollX, scrollY, scrollRangeX, scrollRangeY, + maxOverScrollX, maxOverScrollY, isTouchEvent); // Does all of the hard work... OverscrollHelper.overScrollBy(PullToRefreshGridView.this, deltaX, scrollX, deltaY, scrollY, isTouchEvent); diff --git a/library/src/com/handmark/pulltorefresh/library/PullToRefreshHorizontalScrollView.java b/library/src/com/handmark/pulltorefresh/library/PullToRefreshHorizontalScrollView.java index 84442364e..e64005b4b 100644 --- a/library/src/com/handmark/pulltorefresh/library/PullToRefreshHorizontalScrollView.java +++ b/library/src/com/handmark/pulltorefresh/library/PullToRefreshHorizontalScrollView.java @@ -25,21 +25,21 @@ public class PullToRefreshHorizontalScrollView extends PullToRefreshBase { - public PullToRefreshHorizontalScrollView(Context context) { - super(context); - } + public PullToRefreshHorizontalScrollView(Context context) { + super(context); + } - public PullToRefreshHorizontalScrollView(Context context, AttributeSet attrs) { - super(context, attrs); - } + public PullToRefreshHorizontalScrollView(Context context, AttributeSet attrs) { + super(context, attrs); + } - public PullToRefreshHorizontalScrollView(Context context, Mode mode) { - super(context, mode); - } + public PullToRefreshHorizontalScrollView(Context context, Mode mode) { + super(context, mode); + } - public PullToRefreshHorizontalScrollView(Context context, Mode mode, AnimationStyle style) { - super(context, mode, style); - } + public PullToRefreshHorizontalScrollView(Context context, Mode mode, AnimationStyle style) { + super(context, mode, style); + } @Override public final int getPullToRefreshScrollDirection() { @@ -85,8 +85,8 @@ public InternalHorizontalScrollViewSDK9(Context context, AttributeSet attrs) { 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); + final boolean returnValue = super.overScrollBy(deltaX, deltaY, scrollX, scrollY, scrollRangeX, scrollRangeY, + maxOverScrollX, maxOverScrollY, isTouchEvent); // Does all of the hard work... OverscrollHelper.overScrollBy(PullToRefreshHorizontalScrollView.this, deltaX, scrollX, deltaY, scrollY, diff --git a/library/src/com/handmark/pulltorefresh/library/PullToRefreshListView.java b/library/src/com/handmark/pulltorefresh/library/PullToRefreshListView.java index 60c7b6fb1..24ee5c50e 100644 --- a/library/src/com/handmark/pulltorefresh/library/PullToRefreshListView.java +++ b/library/src/com/handmark/pulltorefresh/library/PullToRefreshListView.java @@ -57,10 +57,10 @@ public PullToRefreshListView(Context context, Mode mode) { setDisableScrollingWhileRefreshing(false); } - public PullToRefreshListView(Context context, Mode mode, AnimationStyle style) { - super(context, mode, style); - setDisableScrollingWhileRefreshing(false); - } + public PullToRefreshListView(Context context, Mode mode, AnimationStyle style) { + super(context, mode, style); + setDisableScrollingWhileRefreshing(false); + } @Override public ContextMenuInfo getContextMenuInfo() { @@ -167,7 +167,7 @@ void onRefreshing(final boolean doScroll) { // Hide our original Loading View origLoadingView.setVisibility(View.INVISIBLE); - + // Make sure the opposite end is hidden too oppositeListViewLoadingView.setVisibility(View.GONE); @@ -179,7 +179,7 @@ void onRefreshing(final boolean doScroll) { listViewLoadingView.setLayoutParams(lp); } listViewLoadingView.setVisibility(View.VISIBLE); - + listViewLoadingView.refreshing(); if (doScroll) { @@ -296,8 +296,8 @@ public InternalListViewSDK9(Context context, AttributeSet attrs) { 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); + final boolean returnValue = super.overScrollBy(deltaX, deltaY, scrollX, scrollY, scrollRangeX, scrollRangeY, + maxOverScrollX, maxOverScrollY, isTouchEvent); // Does all of the hard work... OverscrollHelper.overScrollBy(PullToRefreshListView.this, deltaX, scrollX, deltaY, scrollY, isTouchEvent); diff --git a/library/src/com/handmark/pulltorefresh/library/PullToRefreshScrollView.java b/library/src/com/handmark/pulltorefresh/library/PullToRefreshScrollView.java index 1df146df2..2b5a80461 100644 --- a/library/src/com/handmark/pulltorefresh/library/PullToRefreshScrollView.java +++ b/library/src/com/handmark/pulltorefresh/library/PullToRefreshScrollView.java @@ -25,21 +25,21 @@ public class PullToRefreshScrollView extends PullToRefreshBase { - public PullToRefreshScrollView(Context context) { - super(context); - } + public PullToRefreshScrollView(Context context) { + super(context); + } - public PullToRefreshScrollView(Context context, AttributeSet attrs) { - super(context, attrs); - } + public PullToRefreshScrollView(Context context, AttributeSet attrs) { + super(context, attrs); + } - public PullToRefreshScrollView(Context context, Mode mode) { - super(context, mode); - } + public PullToRefreshScrollView(Context context, Mode mode) { + super(context, mode); + } - public PullToRefreshScrollView(Context context, Mode mode, AnimationStyle style) { - super(context, mode, style); - } + public PullToRefreshScrollView(Context context, Mode mode, AnimationStyle style) { + super(context, mode, style); + } @Override public final int getPullToRefreshScrollDirection() { @@ -84,8 +84,8 @@ public InternalScrollViewSDK9(Context context, AttributeSet attrs) { 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); + final boolean returnValue = super.overScrollBy(deltaX, deltaY, scrollX, scrollY, scrollRangeX, scrollRangeY, + maxOverScrollX, maxOverScrollY, isTouchEvent); // Does all of the hard work... OverscrollHelper.overScrollBy(PullToRefreshScrollView.this, deltaX, scrollX, deltaY, scrollY, diff --git a/library/src/com/handmark/pulltorefresh/library/PullToRefreshWebView.java b/library/src/com/handmark/pulltorefresh/library/PullToRefreshWebView.java index 5fc72e242..046bb8e44 100644 --- a/library/src/com/handmark/pulltorefresh/library/PullToRefreshWebView.java +++ b/library/src/com/handmark/pulltorefresh/library/PullToRefreshWebView.java @@ -77,18 +77,16 @@ public PullToRefreshWebView(Context context, Mode mode) { 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); - } + 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 int getPullToRefreshScrollDirection() { return VERTICAL_SCROLL; @@ -149,19 +147,21 @@ public InternalWebViewSDK9(Context context, AttributeSet attrs) { 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); + 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); + 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, FloatMath.floor(mRefreshableView.getContentHeight() * mRefreshableView.getScale()) - - (getHeight() - getPaddingBottom() - getPaddingTop())); + return (int) Math.max(0, FloatMath.floor( + mRefreshableView.getContentHeight() * mRefreshableView.getScale()) - + (getHeight() - getPaddingBottom() - + getPaddingTop())); } } } diff --git a/library/src/com/handmark/pulltorefresh/library/extras/PullToRefreshWebView2.java b/library/src/com/handmark/pulltorefresh/library/extras/PullToRefreshWebView2.java index adc249b7f..cb8acf65e 100644 --- a/library/src/com/handmark/pulltorefresh/library/extras/PullToRefreshWebView2.java +++ b/library/src/com/handmark/pulltorefresh/library/extras/PullToRefreshWebView2.java @@ -27,7 +27,7 @@ * An advanced version of {@link PullToRefreshWebView} which delegates the * triggering of the PullToRefresh gesture to the Javascript running within the * WebView. This means that you should only use this class if: - * + *

*

- *

- * + *

+ *

* The way this call works is that when a PullToRefresh gesture is in action, * the following Javascript methods will be called: * isReadyForPullDown() and isReadyForPullUp(), it is * your job to calculate whether the view is in a state where a PullToRefresh * can happen, and return the result via the callback mechanism. An example can * be seen below: - * + *

*

  * function isReadyForPullDown() {
  *   var result = ...  // Probably using the .scrollTop DOM attribute
  *   ptr.isReadyForPullDownResponse(result);
  * }
- * 
+ *
  * function isReadyForPullUp() {
  *   var result = ...  // Probably using the .scrollBottom DOM attribute
  *   ptr.isReadyForPullUpResponse(result);
  * }
  * 
- * + * * @author Chris Banes */ public class PullToRefreshWebView2 extends PullToRefreshWebView { @@ -115,7 +115,7 @@ protected boolean isReadyForPullEnd() { /** * Used for response from Javascript - * + * * @author Chris Banes */ final class JsValueCallback { diff --git a/library/src/com/handmark/pulltorefresh/library/extras/SoundPullEventListener.java b/library/src/com/handmark/pulltorefresh/library/extras/SoundPullEventListener.java index 58a9fe899..fb483c449 100644 --- a/library/src/com/handmark/pulltorefresh/library/extras/SoundPullEventListener.java +++ b/library/src/com/handmark/pulltorefresh/library/extras/SoundPullEventListener.java @@ -34,9 +34,8 @@ public class SoundPullEventListener implements PullToRefreshBase /** * Constructor - * - * @param context - * - Context + * + * @param context - Context */ public SoundPullEventListener(Context context) { mContext = context; @@ -55,15 +54,13 @@ public final void onPullEvent(PullToRefreshBase refreshView, State event, Mod * Set the Sounds to be played when a Pull Event happens. You specify which * sound plays for which events by calling this method multiple times for * each event. - * + *

* If you've already set a sound for a certain event, and add another sound * for that event, only the new sound will be played. - * - * @param event - * - The event for which the sound will be played. - * @param resId - * - Resource Id of the sound file to be played (e.g. - * R.raw.pull_sound) + * + * @param event - The event for which the sound will be played. + * @param resId - Resource Id of the sound file to be played (e.g. + * R.raw.pull_sound) */ public void addSoundEvent(State event, int resId) { mSoundMap.put(event, resId); diff --git a/library/src/com/handmark/pulltorefresh/library/internal/EmptyViewMethodAccessor.java b/library/src/com/handmark/pulltorefresh/library/internal/EmptyViewMethodAccessor.java index 1a7940d75..8785829e5 100644 --- a/library/src/com/handmark/pulltorefresh/library/internal/EmptyViewMethodAccessor.java +++ b/library/src/com/handmark/pulltorefresh/library/internal/EmptyViewMethodAccessor.java @@ -20,25 +20,25 @@ /** * Interface that allows PullToRefreshBase to hijack the call to * AdapterView.setEmptyView() - * + * * @author chris */ public interface EmptyViewMethodAccessor { /** * Calls upto AdapterView.setEmptyView() - * + * * @param emptyView - - * to set as Empty View + * to set as Empty View */ public void setEmptyViewInternal(View emptyView); /** * Should call PullToRefreshBase.setEmptyView() which will then * automatically call through to setEmptyViewInternal() - * + * * @param emptyView - - * to set as Empty View + * to set as Empty View */ public void setEmptyView(View emptyView); From d2a010a62d346848a7a16f21860c90bba987ed06 Mon Sep 17 00:00:00 2001 From: Chris Banes Date: Thu, 6 Dec 2012 15:41:29 +0000 Subject: [PATCH 052/120] Fix typo --- .../pulltorefresh/library/internal/LoadingLayout.java | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/library/src/com/handmark/pulltorefresh/library/internal/LoadingLayout.java b/library/src/com/handmark/pulltorefresh/library/internal/LoadingLayout.java index 613d555b6..9efc48869 100644 --- a/library/src/com/handmark/pulltorefresh/library/internal/LoadingLayout.java +++ b/library/src/com/handmark/pulltorefresh/library/internal/LoadingLayout.java @@ -49,7 +49,7 @@ public abstract class LoadingLayout extends LinearLayout { protected final ImageView mHeaderImage; protected final ProgressBar mHeaderProgress; - private boolean mUseIntrinisicAnimation; + private boolean mUseIntrinsicAnimation; private final TextView mHeaderText; private final TextView mSubHeaderText; @@ -178,7 +178,7 @@ public LoadingLayout(Context context, final Mode mode, final int scrollDirection } public final void onPull(float scaleOfLayout) { - if (!mUseIntrinisicAnimation) { + if (!mUseIntrinsicAnimation) { onPullImpl(scaleOfLayout); } } @@ -197,7 +197,7 @@ public final void refreshing() { mHeaderText.setText(mRefreshingLabel); } - if (mUseIntrinisicAnimation) { + if (mUseIntrinsicAnimation) { ((AnimationDrawable) mHeaderImage.getDrawable()).start(); } else { // Now call the callback @@ -224,7 +224,7 @@ public final void reset() { } mHeaderImage.setVisibility(View.VISIBLE); - if (mUseIntrinisicAnimation) { + if (mUseIntrinsicAnimation) { ((AnimationDrawable) mHeaderImage.getDrawable()).stop(); } else { // Now call the callback @@ -255,7 +255,7 @@ protected void onSizeChanged(final int w, int h, int oldw, int oldh) { public final void setLoadingDrawable(Drawable imageDrawable) { // Set Drawable mHeaderImage.setImageDrawable(imageDrawable); - mUseIntrinisicAnimation = (imageDrawable instanceof AnimationDrawable); + mUseIntrinsicAnimation = (imageDrawable instanceof AnimationDrawable); // Now call the callback onLoadingDrawableSet(imageDrawable); From fb86c368088e4ebfbe0298844fd94597dca93114 Mon Sep 17 00:00:00 2001 From: Chris Banes Date: Thu, 6 Dec 2012 17:06:46 +0000 Subject: [PATCH 053/120] Fix Force Close FC due to commit 0aa78bc3b7173d4d2c74197502f7318e881bc4b0 --- .../pulltorefresh/library/PullToRefreshBase.java | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/library/src/com/handmark/pulltorefresh/library/PullToRefreshBase.java b/library/src/com/handmark/pulltorefresh/library/PullToRefreshBase.java index 6867b288b..3686b457f 100644 --- a/library/src/com/handmark/pulltorefresh/library/PullToRefreshBase.java +++ b/library/src/com/handmark/pulltorefresh/library/PullToRefreshBase.java @@ -76,7 +76,7 @@ public abstract class PullToRefreshBase extends LinearLayout imp private boolean mIsBeingDragged = false; private State mState = State.RESET; - private Mode mMode = Mode.getDefaultMode(); + private Mode mMode = Mode.getDefault(); private Mode mCurrentMode; T mRefreshableView; @@ -88,7 +88,7 @@ public abstract class PullToRefreshBase extends LinearLayout imp private boolean mOverScrollEnabled = true; private Interpolator mScrollAnimationInterpolator; - private AnimationStyle mLoadingAnimationStyle; + private AnimationStyle mLoadingAnimationStyle = AnimationStyle.getDefault(); private LoadingLayout mHeaderLayout; private LoadingLayout mFooterLayout; @@ -466,7 +466,7 @@ public void setPullLabel(CharSequence pullLabel, Mode mode) { * the passed value. */ public final void setPullToRefreshEnabled(boolean enable) { - setMode(enable ? Mode.getDefaultMode() : Mode.DISABLED); + setMode(enable ? Mode.getDefault() : Mode.DISABLED); } @Override @@ -1183,6 +1183,10 @@ public static enum AnimationStyle { */ FLIP; + static AnimationStyle getDefault() { + return ROTATE; + } + /** * Maps an int to a specific mode. This is needed when saving state, or * inflating the view from XML where the mode is given through a attr @@ -1271,11 +1275,11 @@ static Mode mapIntToValue(final int modeInt) { } // If not, return default - return getDefaultMode(); + return getDefault(); } - static Mode getDefaultMode() { - return Mode.PULL_FROM_START; + static Mode getDefault() { + return PULL_FROM_START; } private int mIntValue; From 320680b8319f65582535524f0c0f2c2144e66d8a Mon Sep 17 00:00:00 2001 From: Chris Banes Date: Thu, 6 Dec 2012 17:21:43 +0000 Subject: [PATCH 054/120] Change Header/Footer Background function so that we're now overdrawing. --- .../pull_to_refresh_header_vertical.xml | 53 ++++++++ .../library/PullToRefreshBase.java | 114 +++++++++++------- .../library/PullToRefreshListView.java | 22 ++-- .../library/internal/LoadingLayout.java | 53 +++++--- .../layout/activity_ptr_expandable_list.xml | 3 +- sample/res/layout/activity_ptr_viewpager.xml | 3 +- 6 files changed, 163 insertions(+), 85 deletions(-) create mode 100644 library/res/layout-large/pull_to_refresh_header_vertical.xml diff --git a/library/res/layout-large/pull_to_refresh_header_vertical.xml b/library/res/layout-large/pull_to_refresh_header_vertical.xml new file mode 100644 index 000000000..1840751ea --- /dev/null +++ b/library/res/layout-large/pull_to_refresh_header_vertical.xml @@ -0,0 +1,53 @@ + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/library/src/com/handmark/pulltorefresh/library/PullToRefreshBase.java b/library/src/com/handmark/pulltorefresh/library/PullToRefreshBase.java index 3686b457f..1aaf77d2e 100644 --- a/library/src/com/handmark/pulltorefresh/library/PullToRefreshBase.java +++ b/library/src/com/handmark/pulltorefresh/library/PullToRefreshBase.java @@ -207,8 +207,8 @@ public final boolean isPullToRefreshEnabled() { @Override public final boolean isPullToRefreshOverScrollEnabled() { - return VERSION.SDK_INT >= VERSION_CODES.GINGERBREAD && mOverScrollEnabled && - OverscrollHelper.isAndroidOverScrollEnabled(mRefreshableView); + return VERSION.SDK_INT >= VERSION_CODES.GINGERBREAD && mOverScrollEnabled + && OverscrollHelper.isAndroidOverScrollEnabled(mRefreshableView); } @Override @@ -549,7 +549,7 @@ void onPullToRefresh() { /** * Called when the UI has been to be updated to be in the * {@link State#REFRESHING} or {@link State#MANUAL_REFRESHING} state. - * + * * @param doScroll - Whether the UI should scroll for this event. */ void onRefreshing(final boolean doScroll) { @@ -640,11 +640,11 @@ protected LoadingLayout createLoadingLayout(Context context, Mode mode, TypedArr *

* Be sure to set the ID of the view in this method, especially if you're * using a ListActivity or ListFragment. - * + * * @param context Context to create view with - * @param attrs AttributeSet from wrapped class. Means that anything you - * include in the XML layout declaration will be routed to the - * created View + * @param attrs AttributeSet from wrapped class. Means that anything you + * include in the XML layout declaration will be routed to the + * created View * @return New instance of the Refreshable View */ protected abstract T createRefreshableView(Context context, AttributeSet attrs); @@ -680,7 +680,7 @@ protected FrameLayout getRefreshableViewWrapper() { /** * Allows Derivative classes to handle the XML Attrs without creating a * TypedArray themsevles - * + * * @param a - TypedArray of PullToRefresh Attributes */ protected void handleStyledAttributes(TypedArray a) { @@ -689,7 +689,7 @@ protected void handleStyledAttributes(TypedArray a) { /** * Implemented by derived class to return whether the View is in a state * where the user can Pull to Refresh by scrolling from the start. - * + * * @return true if the View is currently the correct state (for example, top * of a ListView) */ @@ -698,7 +698,7 @@ protected void handleStyledAttributes(TypedArray a) { /** * Implemented by derived class to return whether the View is in a state * where the user can Pull to Refresh by scrolling from the end. - * + * * @return true if the View is currently in the correct state (for example, * bottom of a ListView) */ @@ -707,7 +707,7 @@ protected void handleStyledAttributes(TypedArray a) { /** * Called by {@link #onRestoreInstanceState(Parcelable)} so that derivative * classes can handle their saved instance state. - * + * * @param savedInstanceState - Bundle which contains saved instance state. */ protected void onPtrRestoreInstanceState(Bundle savedInstanceState) { @@ -716,7 +716,7 @@ protected void onPtrRestoreInstanceState(Bundle savedInstanceState) { /** * Called by {@link #onSaveInstanceState()} so that derivative classes can * save their instance state. - * + * * @param saveState - Bundle to be updated with saved state. */ protected void onPtrSaveInstanceState(Bundle saveState) { @@ -767,6 +767,12 @@ protected final Parcelable onSaveInstanceState() { return bundle; } + @Override + protected void onSizeChanged(int w, int h, int oldw, int oldh) { + // We need to update the header/footer when our size changes + refreshLoadingViewsSize(); + } + /** * @deprecated This is a deprecated callback. If you're overriding this * method then use @@ -781,7 +787,7 @@ protected void resetHeader() { /** * Helper method which just calls scrollTo() in the correct scrolling * direction. - * + * * @param value - New Scroll value */ protected final void setHeaderScroll(final int value) { @@ -810,7 +816,7 @@ protected void setRefreshingInternal(final boolean doScroll) { /** * Smooth Scroll to position using the default duration of * {@value #SMOOTH_SCROLL_DURATION_MS} ms. - * + * * @param scrollValue - Position to scroll to */ protected final void smoothScrollTo(int scrollValue) { @@ -820,7 +826,7 @@ protected final void smoothScrollTo(int scrollValue) { /** * Smooth Scroll to position using the longer default duration of * {@value #SMOOTH_SCROLL_LONG_DURATION_MS} ms. - * + * * @param scrollValue - Position to scroll to */ protected final void smoothScrollToLonger(int scrollValue) { @@ -927,14 +933,9 @@ private void init(Context context, AttributeSet attrs) { mHeaderLayout = createLoadingLayout(context, Mode.PULL_FROM_START, a); mFooterLayout = createLoadingLayout(context, Mode.PULL_FROM_END, a); - // Styleables from XML - if (a.hasValue(R.styleable.PullToRefresh_ptrHeaderBackground)) { - Drawable background = a.getDrawable(R.styleable.PullToRefresh_ptrHeaderBackground); - if (null != background) { - setBackgroundDrawable(background); - } - } - + /** + * Styleables from XML + */ if (a.hasValue(R.styleable.PullToRefresh_ptrRefreshableViewBackground)) { Drawable background = a.getDrawable(R.styleable.PullToRefresh_ptrRefreshableViewBackground); if (null != background) { @@ -992,7 +993,7 @@ private void measureView(View child) { /** * Actions a Pull Event - * + * * @return true if the Event has been handled, false if there has been no * change */ @@ -1046,45 +1047,66 @@ private void pullEvent() { } } + private int getMaximumPullScroll() { + switch (getPullToRefreshScrollDirection()) { + case HORIZONTAL_SCROLL: + return Math.round(getWidth() / FRICTION); + case VERTICAL_SCROLL: + default: + return Math.round(getHeight() / FRICTION); + } + } + /** * Re-measure the Loading Views height, and adjust internal padding as * necessary */ private void refreshLoadingViewsSize() { + final int maximumPullScroll = getMaximumPullScroll(); + mHeaderDimension = mFooterDimension = 0; int pLeft, pTop, pRight, pBottom; pLeft = pTop = pRight = pBottom = 0; if (mMode.showHeaderLoadingLayout()) { + mHeaderLayout.resetForMeasure(); measureView(mHeaderLayout); switch (getPullToRefreshScrollDirection()) { case HORIZONTAL_SCROLL: mHeaderDimension = mHeaderLayout.getMeasuredWidth(); - pLeft = -mHeaderDimension; + pLeft = -maximumPullScroll; + mHeaderLayout.getLayoutParams().width = maximumPullScroll; break; case VERTICAL_SCROLL: default: mHeaderDimension = mHeaderLayout.getMeasuredHeight(); - pTop = -mHeaderDimension; + pTop = -maximumPullScroll; + mHeaderLayout.getLayoutParams().height = maximumPullScroll; break; } + mHeaderLayout.requestLayout(); } + if (mMode.showFooterLoadingLayout()) { + mFooterLayout.resetForMeasure(); measureView(mFooterLayout); switch (getPullToRefreshScrollDirection()) { case HORIZONTAL_SCROLL: mFooterDimension = mFooterLayout.getMeasuredWidth(); - pRight = -mFooterDimension; + pRight = -maximumPullScroll; + mFooterLayout.getLayoutParams().width = maximumPullScroll; break; case VERTICAL_SCROLL: default: mFooterDimension = mFooterLayout.getMeasuredHeight(); - pBottom = -mFooterDimension; + pBottom = -maximumPullScroll; + mFooterLayout.getLayoutParams().height = maximumPullScroll; break; } + mFooterLayout.requestLayout(); } setPadding(pLeft, pTop, pRight, pBottom); @@ -1120,9 +1142,9 @@ private void setState(State state, final boolean... params) { /** * Smooth Scroll to position using the specific duration - * + * * @param scrollValue - Position to scroll to - * @param duration - Duration of animation in milliseconds + * @param duration - Duration of animation in milliseconds */ private final void smoothScrollTo(int scrollValue, long duration) { smoothScrollTo(scrollValue, duration, 0, null); @@ -1191,7 +1213,7 @@ static AnimationStyle getDefault() { * Maps an int to a specific mode. This is needed when saving state, or * inflating the view from XML where the mode is given through a attr * int. - * + * * @param modeInt - int to map a Mode to * @return Mode that modeInt maps to, or ROTATE by default. */ @@ -1263,7 +1285,7 @@ public static enum Mode { * Maps an int to a specific mode. This is needed when saving state, or * inflating the view from XML where the mode is given through a attr * int. - * + * * @param modeInt - int to map a Mode to * @return Mode that modeInt maps to, or PULL_FROM_START by default. */ @@ -1320,7 +1342,7 @@ int getIntValue() { * Simple Listener that allows you to be notified when the user has scrolled * to the end of the AdapterView. See ( * {@link PullToRefreshAdapterViewBase#setOnLastItemVisibleListener}. - * + * * @author Chris Banes */ public static interface OnLastItemVisibleListener { @@ -1341,7 +1363,7 @@ public static interface OnLastItemVisibleListener { * finished a touch event. Useful when you want to append extra UI events * (such as sounds). See ( * {@link PullToRefreshAdapterViewBase#setOnPullEventListener}. - * + * * @author Chris Banes */ public static interface OnPullEventListener { @@ -1349,14 +1371,14 @@ public static interface OnPullEventListener { /** * Called when the internal state has been changed, usually by the user * pulling. - * + * * @param refreshView - View which has had it's state change. - * @param state - The new state of View. - * @param direction - One of {@link Mode#PULL_FROM_START} or - * {@link Mode#PULL_FROM_END} depending on which direction - * the user is pulling. Only useful when state is - * {@link State#PULL_TO_REFRESH} or - * {@link State#RELEASE_TO_REFRESH}. + * @param state - The new state of View. + * @param direction - One of {@link Mode#PULL_FROM_START} or + * {@link Mode#PULL_FROM_END} depending on which direction + * the user is pulling. Only useful when state is + * {@link State#PULL_TO_REFRESH} or + * {@link State#RELEASE_TO_REFRESH}. */ public void onPullEvent(final PullToRefreshBase refreshView, State state, Mode direction); @@ -1364,7 +1386,7 @@ public static interface OnPullEventListener { /** * Simple Listener to listen for any callbacks to Refresh. - * + * * @author Chris Banes */ public static interface OnRefreshListener { @@ -1381,7 +1403,7 @@ public static interface OnRefreshListener { * An advanced version of the Listener to listen for callbacks to Refresh. * This listener is different as it allows you to differentiate between Pull * Ups, and Pull Downs. - * + * * @author Chris Banes */ public static interface OnRefreshListener2 { @@ -1434,7 +1456,7 @@ public static enum State { /** * Maps an int to a specific state. This is needed when saving state. - * + * * @param stateInt - int to map a State to * @return State that stateInt maps to */ @@ -1501,8 +1523,8 @@ public void run() { long normalizedTime = (1000 * (System.currentTimeMillis() - mStartTime)) / mDuration; normalizedTime = Math.max(Math.min(normalizedTime, 1000), 0); - final int deltaY = Math.round((mScrollFromY - mScrollToY) * mInterpolator.getInterpolation( - normalizedTime / 1000f)); + final int deltaY = Math.round((mScrollFromY - mScrollToY) + * mInterpolator.getInterpolation(normalizedTime / 1000f)); mCurrentY = mScrollFromY - deltaY; setHeaderScroll(mCurrentY); } diff --git a/library/src/com/handmark/pulltorefresh/library/PullToRefreshListView.java b/library/src/com/handmark/pulltorefresh/library/PullToRefreshListView.java index 24ee5c50e..3873ce935 100644 --- a/library/src/com/handmark/pulltorefresh/library/PullToRefreshListView.java +++ b/library/src/com/handmark/pulltorefresh/library/PullToRefreshListView.java @@ -27,7 +27,6 @@ import android.view.Gravity; import android.view.MotionEvent; import android.view.View; -import android.view.ViewGroup; import android.widget.FrameLayout; import android.widget.ListAdapter; import android.widget.ListView; @@ -171,15 +170,8 @@ void onRefreshing(final boolean doScroll) { // Make sure the opposite end is hidden too oppositeListViewLoadingView.setVisibility(View.GONE); - // Show the ListView Loading View and set it to refresh. If it has a 0 - // height, then we need to set it to WRAP_CONTENT - if (listViewLoadingView.getHeight() == 0) { - ViewGroup.LayoutParams lp = listViewLoadingView.getLayoutParams(); - lp.height = ViewGroup.LayoutParams.WRAP_CONTENT; - listViewLoadingView.setLayoutParams(lp); - } + // Show the ListView Loading View and set it to refresh. listViewLoadingView.setVisibility(View.VISIBLE); - listViewLoadingView.refreshing(); if (doScroll) { @@ -263,19 +255,19 @@ protected ListView createRefreshableView(Context context, AttributeSet attrs) { // Get Styles from attrs TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.PullToRefresh); - // We use a 0 height (instead of View.GONE) for now so that it's still - // measured and laid out - final FrameLayout.LayoutParams lp = new FrameLayout.LayoutParams(FrameLayout.LayoutParams.MATCH_PARENT, 0, - Gravity.CENTER_HORIZONTAL); + final FrameLayout.LayoutParams lp = new FrameLayout.LayoutParams(FrameLayout.LayoutParams.MATCH_PARENT, + FrameLayout.LayoutParams.WRAP_CONTENT, Gravity.CENTER_HORIZONTAL); // Create Loading Views ready for use later FrameLayout frame = new FrameLayout(context); mHeaderLoadingView = createLoadingLayout(context, Mode.PULL_FROM_START, a); + mHeaderLoadingView.setVisibility(View.GONE); frame.addView(mHeaderLoadingView, lp); lv.addHeaderView(frame, null, false); mLvFooterLoadingFrame = new FrameLayout(context); mFooterLoadingView = createLoadingLayout(context, Mode.PULL_FROM_END, a); + mFooterLoadingView.setVisibility(View.GONE); mLvFooterLoadingFrame.addView(mFooterLoadingView, lp); a.recycle(); @@ -296,8 +288,8 @@ public InternalListViewSDK9(Context context, AttributeSet attrs) { 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); + final boolean returnValue = super.overScrollBy(deltaX, deltaY, scrollX, scrollY, scrollRangeX, + scrollRangeY, maxOverScrollX, maxOverScrollY, isTouchEvent); // Does all of the hard work... OverscrollHelper.overScrollBy(PullToRefreshListView.this, deltaX, scrollX, deltaY, scrollY, isTouchEvent); diff --git a/library/src/com/handmark/pulltorefresh/library/internal/LoadingLayout.java b/library/src/com/handmark/pulltorefresh/library/internal/LoadingLayout.java index 9efc48869..bd5aa924d 100644 --- a/library/src/com/handmark/pulltorefresh/library/internal/LoadingLayout.java +++ b/library/src/com/handmark/pulltorefresh/library/internal/LoadingLayout.java @@ -27,7 +27,6 @@ import android.view.Gravity; import android.view.LayoutInflater; import android.view.View; -import android.view.ViewGroup; import android.view.animation.Interpolator; import android.view.animation.LinearInterpolator; import android.widget.ImageView; @@ -61,14 +60,9 @@ public abstract class LoadingLayout extends LinearLayout { private CharSequence mRefreshingLabel; private CharSequence mReleaseLabel; - // Max Width that this can be - private int mMaxWidth; - public LoadingLayout(Context context, final Mode mode, final int scrollDirection, TypedArray attrs) { super(context); - setGravity(Gravity.CENTER_VERTICAL); - mMode = mode; mScrollDirection = scrollDirection; @@ -79,13 +73,31 @@ public LoadingLayout(Context context, final Mode mode, final int scrollDirection switch (scrollDirection) { case PullToRefreshBase.HORIZONTAL_SCROLL: LayoutInflater.from(context).inflate(R.layout.pull_to_refresh_header_horizontal, this); - mMaxWidth = getResources().getDimensionPixelSize(R.dimen.header_footer_max_width); + + switch (mMode) { + case PULL_FROM_END: + setGravity(Gravity.CENTER_VERTICAL | Gravity.LEFT); + break; + case PULL_FROM_START: + default: + setGravity(Gravity.CENTER_VERTICAL | Gravity.RIGHT); + break; + } break; case PullToRefreshBase.VERTICAL_SCROLL: default: LayoutInflater.from(context).inflate(R.layout.pull_to_refresh_header_vertical, this); - mMaxWidth = getResources().getDimensionPixelSize(R.dimen.header_footer_max_width); + + switch (mMode) { + case PULL_FROM_END: + setGravity(Gravity.CENTER_HORIZONTAL | Gravity.TOP); + break; + case PULL_FROM_START: + default: + setGravity(Gravity.CENTER_HORIZONTAL | Gravity.BOTTOM); + break; + } break; } @@ -148,6 +160,7 @@ public LoadingLayout(Context context, final Mode mode, final int scrollDirection // drawable attr above switch (mode) { case PULL_FROM_START: + default: if (attrs.hasValue(R.styleable.PullToRefresh_ptrDrawableStart)) { imageDrawable = attrs.getDrawable(R.styleable.PullToRefresh_ptrDrawableStart); } else if (attrs.hasValue(R.styleable.PullToRefresh_ptrDrawableTop)) { @@ -240,18 +253,6 @@ public final void reset() { } } - @Override - protected void onSizeChanged(final int w, int h, int oldw, int oldh) { - super.onSizeChanged(w, h, oldw, oldh); - - // If we're bigger than the Max Width, resize us - if (w > mMaxWidth) { - ViewGroup.LayoutParams lp = getLayoutParams(); - lp.width = mMaxWidth; - setLayoutParams(lp); - } - } - public final void setLoadingDrawable(Drawable imageDrawable) { // Set Drawable mHeaderImage.setImageDrawable(imageDrawable); @@ -340,4 +341,16 @@ public void setTextColor(int color) { protected abstract void resetImpl(); + public void resetForMeasure() { + switch (mScrollDirection) { + case PullToRefreshBase.HORIZONTAL_SCROLL: + getLayoutParams().width = LayoutParams.WRAP_CONTENT; + break; + case PullToRefreshBase.VERTICAL_SCROLL: + default: + getLayoutParams().height = LayoutParams.WRAP_CONTENT; + break; + } + } + } diff --git a/sample/res/layout/activity_ptr_expandable_list.xml b/sample/res/layout/activity_ptr_expandable_list.xml index aac369808..d366c3443 100755 --- a/sample/res/layout/activity_ptr_expandable_list.xml +++ b/sample/res/layout/activity_ptr_expandable_list.xml @@ -13,7 +13,6 @@ android:layout_height="fill_parent" ptr:ptrHeaderBackground="@android:color/darker_gray" ptr:ptrHeaderTextColor="@android:color/white" - ptr:ptrMode="pullUpFromBottom" - ptr:ptrRefreshableViewBackground="?android:attr/windowBackground" /> + ptr:ptrMode="pullUpFromBottom" /> \ No newline at end of file diff --git a/sample/res/layout/activity_ptr_viewpager.xml b/sample/res/layout/activity_ptr_viewpager.xml index 29f42b1e9..03c8eee7b 100755 --- a/sample/res/layout/activity_ptr_viewpager.xml +++ b/sample/res/layout/activity_ptr_viewpager.xml @@ -12,7 +12,6 @@ android:layout_height="fill_parent" ptr:ptrAnimationStyle="flip" ptr:ptrHeaderBackground="@android:color/darker_gray" - ptr:ptrMode="both" - ptr:ptrRefreshableViewBackground="?android:attr/windowBackground" /> + ptr:ptrMode="both" /> \ No newline at end of file From 620cf9a6bf529c0995f2006bb13762809f70d8db Mon Sep 17 00:00:00 2001 From: Chris Banes Date: Thu, 6 Dec 2012 17:57:33 +0000 Subject: [PATCH 055/120] Set the LoadingLayout's to INVISIBLE unless we're in a position to show them --- .../library/PullToRefreshBase.java | 22 ++++++++++++++++++- .../library/PullToRefreshListView.java | 3 +++ 2 files changed, 24 insertions(+), 1 deletion(-) diff --git a/library/src/com/handmark/pulltorefresh/library/PullToRefreshBase.java b/library/src/com/handmark/pulltorefresh/library/PullToRefreshBase.java index 1aaf77d2e..6ded114de 100644 --- a/library/src/com/handmark/pulltorefresh/library/PullToRefreshBase.java +++ b/library/src/com/handmark/pulltorefresh/library/PullToRefreshBase.java @@ -86,6 +86,7 @@ public abstract class PullToRefreshBase extends LinearLayout imp private boolean mDisableScrollingWhileRefreshing = true; private boolean mFilterTouchEvents = true; private boolean mOverScrollEnabled = true; + private boolean mLayoutVisibilityChangesEnabled = true; private Interpolator mScrollAnimationInterpolator; private AnimationStyle mLoadingAnimationStyle = AnimationStyle.getDefault(); @@ -602,6 +603,7 @@ void onReleaseToRefresh() { */ void onReset() { mIsBeingDragged = false; + mLayoutVisibilityChangesEnabled = true; // Always reset both layouts, just in case... mHeaderLayout.reset(); @@ -630,7 +632,10 @@ protected final void addViewInternal(View child, ViewGroup.LayoutParams params) } protected LoadingLayout createLoadingLayout(Context context, Mode mode, TypedArray attrs) { - return mLoadingAnimationStyle.createLoadingLayout(context, mode, getPullToRefreshScrollDirection(), attrs); + LoadingLayout layout = mLoadingAnimationStyle.createLoadingLayout(context, mode, + getPullToRefreshScrollDirection(), attrs); + layout.setVisibility(View.INVISIBLE); + return layout; } /** @@ -648,6 +653,10 @@ protected LoadingLayout createLoadingLayout(Context context, Mode mode, TypedArr * @return New instance of the Refreshable View */ protected abstract T createRefreshableView(Context context, AttributeSet attrs); + + protected final void disableLoadingLayoutVisibilityChanges() { + mLayoutVisibilityChangesEnabled = false; + } protected final int getFooterHeight() { return mFooterDimension; @@ -791,6 +800,17 @@ protected void resetHeader() { * @param value - New Scroll value */ protected final void setHeaderScroll(final int value) { + if (mLayoutVisibilityChangesEnabled) { + if (value < 0) { + mHeaderLayout.setVisibility(View.VISIBLE); + } else if (value > 0) { + mFooterLayout.setVisibility(View.VISIBLE); + } else { + mHeaderLayout.setVisibility(View.INVISIBLE); + mFooterLayout.setVisibility(View.INVISIBLE); + } + } + switch (getPullToRefreshScrollDirection()) { case VERTICAL_SCROLL: scrollTo(0, value); diff --git a/library/src/com/handmark/pulltorefresh/library/PullToRefreshListView.java b/library/src/com/handmark/pulltorefresh/library/PullToRefreshListView.java index 3873ce935..f04b3c4e6 100644 --- a/library/src/com/handmark/pulltorefresh/library/PullToRefreshListView.java +++ b/library/src/com/handmark/pulltorefresh/library/PullToRefreshListView.java @@ -175,6 +175,9 @@ void onRefreshing(final boolean doScroll) { listViewLoadingView.refreshing(); if (doScroll) { + // We need to disable the automatic visibility changes for now + disableLoadingLayoutVisibilityChanges(); + // We scroll slightly so that the ListView's header/footer is at the // same Y position as our normal header/footer setHeaderScroll(scrollToY); From 7c8b09f8756cf24dcfc8f3f81b581f54246d3657 Mon Sep 17 00:00:00 2001 From: Chris Banes Date: Thu, 6 Dec 2012 18:22:47 +0000 Subject: [PATCH 056/120] Change Loading View Height using Padding. Allows Gravity to still work within natural bounds --- .../library/PullToRefreshBase.java | 12 ++-- .../library/internal/LoadingLayout.java | 66 +++++++++---------- 2 files changed, 35 insertions(+), 43 deletions(-) diff --git a/library/src/com/handmark/pulltorefresh/library/PullToRefreshBase.java b/library/src/com/handmark/pulltorefresh/library/PullToRefreshBase.java index 6ded114de..18aeacbc6 100644 --- a/library/src/com/handmark/pulltorefresh/library/PullToRefreshBase.java +++ b/library/src/com/handmark/pulltorefresh/library/PullToRefreshBase.java @@ -653,7 +653,7 @@ protected LoadingLayout createLoadingLayout(Context context, Mode mode, TypedArr * @return New instance of the Refreshable View */ protected abstract T createRefreshableView(Context context, AttributeSet attrs); - + protected final void disableLoadingLayoutVisibilityChanges() { mLayoutVisibilityChangesEnabled = false; } @@ -1097,16 +1097,15 @@ private void refreshLoadingViewsSize() { case HORIZONTAL_SCROLL: mHeaderDimension = mHeaderLayout.getMeasuredWidth(); pLeft = -maximumPullScroll; - mHeaderLayout.getLayoutParams().width = maximumPullScroll; + mHeaderLayout.adjustWidthUsingLeftPadding(maximumPullScroll); break; case VERTICAL_SCROLL: default: mHeaderDimension = mHeaderLayout.getMeasuredHeight(); pTop = -maximumPullScroll; - mHeaderLayout.getLayoutParams().height = maximumPullScroll; + mHeaderLayout.adjustHeightUsingTopPadding(maximumPullScroll); break; } - mHeaderLayout.requestLayout(); } if (mMode.showFooterLoadingLayout()) { @@ -1117,16 +1116,15 @@ private void refreshLoadingViewsSize() { case HORIZONTAL_SCROLL: mFooterDimension = mFooterLayout.getMeasuredWidth(); pRight = -maximumPullScroll; - mFooterLayout.getLayoutParams().width = maximumPullScroll; + mFooterLayout.adjustWidthUsingRightPadding(maximumPullScroll); break; case VERTICAL_SCROLL: default: mFooterDimension = mFooterLayout.getMeasuredHeight(); pBottom = -maximumPullScroll; - mFooterLayout.getLayoutParams().height = maximumPullScroll; + mFooterLayout.adjustHeightUsingBottomPadding(maximumPullScroll); break; } - mFooterLayout.requestLayout(); } setPadding(pLeft, pTop, pRight, pBottom); diff --git a/library/src/com/handmark/pulltorefresh/library/internal/LoadingLayout.java b/library/src/com/handmark/pulltorefresh/library/internal/LoadingLayout.java index bd5aa924d..5c5b215d1 100644 --- a/library/src/com/handmark/pulltorefresh/library/internal/LoadingLayout.java +++ b/library/src/com/handmark/pulltorefresh/library/internal/LoadingLayout.java @@ -62,44 +62,20 @@ public abstract class LoadingLayout extends LinearLayout { public LoadingLayout(Context context, final Mode mode, final int scrollDirection, TypedArray attrs) { super(context); - mMode = mode; mScrollDirection = scrollDirection; - final int tbPadding = getResources().getDimensionPixelSize(R.dimen.header_footer_top_bottom_padding); - final int lrPadding = getResources().getDimensionPixelSize(R.dimen.header_footer_left_right_padding); - setPadding(lrPadding, tbPadding, lrPadding, tbPadding); + setGravity(Gravity.CENTER); + resetPadding(); switch (scrollDirection) { case PullToRefreshBase.HORIZONTAL_SCROLL: LayoutInflater.from(context).inflate(R.layout.pull_to_refresh_header_horizontal, this); - - switch (mMode) { - case PULL_FROM_END: - setGravity(Gravity.CENTER_VERTICAL | Gravity.LEFT); - break; - case PULL_FROM_START: - default: - setGravity(Gravity.CENTER_VERTICAL | Gravity.RIGHT); - break; - } break; - case PullToRefreshBase.VERTICAL_SCROLL: default: LayoutInflater.from(context).inflate(R.layout.pull_to_refresh_header_vertical, this); - - switch (mMode) { - case PULL_FROM_END: - setGravity(Gravity.CENTER_HORIZONTAL | Gravity.TOP); - break; - case PULL_FROM_START: - default: - setGravity(Gravity.CENTER_HORIZONTAL | Gravity.BOTTOM); - break; - } break; - } mHeaderText = (TextView) findViewById(R.id.pull_to_refresh_text); @@ -253,6 +229,10 @@ public final void reset() { } } + public void resetForMeasure() { + resetPadding(); + } + public final void setLoadingDrawable(Drawable imageDrawable) { // Set Drawable mHeaderImage.setImageDrawable(imageDrawable); @@ -341,16 +321,30 @@ public void setTextColor(int color) { protected abstract void resetImpl(); - public void resetForMeasure() { - switch (mScrollDirection) { - case PullToRefreshBase.HORIZONTAL_SCROLL: - getLayoutParams().width = LayoutParams.WRAP_CONTENT; - break; - case PullToRefreshBase.VERTICAL_SCROLL: - default: - getLayoutParams().height = LayoutParams.WRAP_CONTENT; - break; - } + public void adjustHeightUsingTopPadding(final int height) { + setPadding(getPaddingLeft(), getPaddingTop() + height - getMeasuredHeight(), getPaddingRight(), + getPaddingBottom()); + } + + public void adjustHeightUsingBottomPadding(final int height) { + setPadding(getPaddingLeft(), getPaddingTop(), getPaddingRight(), getPaddingBottom() + height + - getMeasuredHeight()); + } + + public void adjustWidthUsingLeftPadding(final int width) { + setPadding(getPaddingLeft() + width - getMeasuredWidth(), getPaddingTop(), getPaddingRight(), + getPaddingBottom()); + } + + public void adjustWidthUsingRightPadding(final int width) { + setPadding(getPaddingLeft(), getPaddingTop(), getPaddingRight() + width - getMeasuredWidth(), + getPaddingBottom()); + } + + private void resetPadding() { + final int tbPadding = getResources().getDimensionPixelSize(R.dimen.header_footer_top_bottom_padding); + final int lrPadding = getResources().getDimensionPixelSize(R.dimen.header_footer_left_right_padding); + setPadding(lrPadding, tbPadding, lrPadding, tbPadding); } } From 5781477246c0cb5e276ff72d17522c89e31572a9 Mon Sep 17 00:00:00 2001 From: Chris Banes Date: Thu, 6 Dec 2012 19:27:26 +0000 Subject: [PATCH 057/120] Change Header/Footer View Height so it's always large enough --- .../com/handmark/pulltorefresh/library/PullToRefreshBase.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/library/src/com/handmark/pulltorefresh/library/PullToRefreshBase.java b/library/src/com/handmark/pulltorefresh/library/PullToRefreshBase.java index 18aeacbc6..00ce002cb 100644 --- a/library/src/com/handmark/pulltorefresh/library/PullToRefreshBase.java +++ b/library/src/com/handmark/pulltorefresh/library/PullToRefreshBase.java @@ -1082,7 +1082,7 @@ private int getMaximumPullScroll() { * necessary */ private void refreshLoadingViewsSize() { - final int maximumPullScroll = getMaximumPullScroll(); + final int maximumPullScroll = (int) (getMaximumPullScroll() * 1.2f); mHeaderDimension = mFooterDimension = 0; From 0f4829ad19cf537f2a4375d408e9e2673d0a0b46 Mon Sep 17 00:00:00 2001 From: Steve Lhomme Date: Fri, 7 Dec 2012 13:27:49 +0100 Subject: [PATCH 058/120] update language strings --- library/res/values-ar/pull_refresh_strings.xml | 6 ++++++ library/res/values-cs/pull_refresh_strings.xml | 6 +++--- library/res/values-de/pull_refresh_strings.xml | 6 +++--- library/res/values-es/pull_refresh_strings.xml | 6 +++--- library/res/values-fr/pull_refresh_strings.xml | 6 +++--- library/res/values-he/pull_refresh_strings.xml | 6 ++++++ library/res/values-it/pull_refresh_strings.xml | 6 +++--- library/res/values-iw/pull_refresh_strings.xml | 6 ++++++ library/res/values-ja/pull_refresh_strings.xml | 6 +++--- library/res/values-ko/pull_refresh_strings.xml | 6 +++--- library/res/values-nl/pull_refresh_strings.xml | 6 +++--- library/res/values-pl/pull_refresh_strings.xml | 6 +++--- library/res/values-pt-rBR/pull_refresh_strings.xml | 6 +++--- library/res/values-pt/pull_refresh_strings.xml | 6 +++--- library/res/values-ro/pull_refresh_strings.xml | 6 ++++++ library/res/values-ru/pull_refresh_strings.xml | 6 +++--- library/res/values-zh/pull_refresh_strings.xml | 6 +++--- library/res/values/pull_refresh_strings.xml | 6 +++--- 18 files changed, 66 insertions(+), 42 deletions(-) create mode 100644 library/res/values-ar/pull_refresh_strings.xml create mode 100644 library/res/values-he/pull_refresh_strings.xml create mode 100644 library/res/values-iw/pull_refresh_strings.xml create mode 100644 library/res/values-ro/pull_refresh_strings.xml diff --git a/library/res/values-ar/pull_refresh_strings.xml b/library/res/values-ar/pull_refresh_strings.xml new file mode 100644 index 000000000..5b0b571cc --- /dev/null +++ b/library/res/values-ar/pull_refresh_strings.xml @@ -0,0 +1,6 @@ + + + اسحب للتحديث… + اترك للتحديث… + تحميل… + diff --git a/library/res/values-cs/pull_refresh_strings.xml b/library/res/values-cs/pull_refresh_strings.xml index 9ecf5b271..a8f0acea7 100755 --- a/library/res/values-cs/pull_refresh_strings.xml +++ b/library/res/values-cs/pull_refresh_strings.xml @@ -1,6 +1,6 @@ - Tažením aktualizujete… - Uvolněním aktualizujete… - Načítání… + Tažením aktualizujete… + Uvolněním aktualizujete… + Načítání… diff --git a/library/res/values-de/pull_refresh_strings.xml b/library/res/values-de/pull_refresh_strings.xml index 2f2746055..3f773deb0 100755 --- a/library/res/values-de/pull_refresh_strings.xml +++ b/library/res/values-de/pull_refresh_strings.xml @@ -1,6 +1,6 @@ - Ziehen zum Aktualisieren… - Loslassen zum Aktualisieren… - Laden… + Ziehen zum Aktualisieren… + Loslassen zum Aktualisieren… + Laden… diff --git a/library/res/values-es/pull_refresh_strings.xml b/library/res/values-es/pull_refresh_strings.xml index 922427b75..6f85c1008 100755 --- a/library/res/values-es/pull_refresh_strings.xml +++ b/library/res/values-es/pull_refresh_strings.xml @@ -1,6 +1,6 @@ - Tire para actualizar… - Deslice para actualizar… - Cargando… + Tirar para actualizar… + Soltar para actualizar… + Cargando… diff --git a/library/res/values-fr/pull_refresh_strings.xml b/library/res/values-fr/pull_refresh_strings.xml index 9fde6cd87..e59f07eca 100755 --- a/library/res/values-fr/pull_refresh_strings.xml +++ b/library/res/values-fr/pull_refresh_strings.xml @@ -1,6 +1,6 @@ - Tirez pour rafraîchir… - Relâcher pour rafraîchir… - Chargement… + Tirez pour rafraîchir… + Relâcher pour rafraîchir… + Chargement… diff --git a/library/res/values-he/pull_refresh_strings.xml b/library/res/values-he/pull_refresh_strings.xml new file mode 100644 index 000000000..f22f7853f --- /dev/null +++ b/library/res/values-he/pull_refresh_strings.xml @@ -0,0 +1,6 @@ + + + משוך לרענון… + שחרר לרענון… + טוען… + diff --git a/library/res/values-it/pull_refresh_strings.xml b/library/res/values-it/pull_refresh_strings.xml index d8b3b7aa2..9eaa74955 100755 --- a/library/res/values-it/pull_refresh_strings.xml +++ b/library/res/values-it/pull_refresh_strings.xml @@ -1,6 +1,6 @@ - Tira per aggiornare… - Rilascia per aggionare… - Caricamento… + Tira per aggiornare… + Rilascia per aggionare… + Caricamento… diff --git a/library/res/values-iw/pull_refresh_strings.xml b/library/res/values-iw/pull_refresh_strings.xml new file mode 100644 index 000000000..f22f7853f --- /dev/null +++ b/library/res/values-iw/pull_refresh_strings.xml @@ -0,0 +1,6 @@ + + + משוך לרענון… + שחרר לרענון… + טוען… + diff --git a/library/res/values-ja/pull_refresh_strings.xml b/library/res/values-ja/pull_refresh_strings.xml index 09cd05b94..124154433 100644 --- a/library/res/values-ja/pull_refresh_strings.xml +++ b/library/res/values-ja/pull_refresh_strings.xml @@ -1,6 +1,6 @@ - 画面を引っ張って… - 指を離すと更新… - 読み込み中… + 画面を引っ張って… + 指を離して更新… + 読み込み中… diff --git a/library/res/values-ko/pull_refresh_strings.xml b/library/res/values-ko/pull_refresh_strings.xml index 1ba619291..15d86d4dd 100755 --- a/library/res/values-ko/pull_refresh_strings.xml +++ b/library/res/values-ko/pull_refresh_strings.xml @@ -1,6 +1,6 @@ - 당겨서 새로 고침… - 놓아서 새로 고침… - 로딩 중… + 당겨서 새로 고침… + 놓아서 새로 고침… + 로드 중… diff --git a/library/res/values-nl/pull_refresh_strings.xml b/library/res/values-nl/pull_refresh_strings.xml index 8e7414784..0701c9b47 100755 --- a/library/res/values-nl/pull_refresh_strings.xml +++ b/library/res/values-nl/pull_refresh_strings.xml @@ -1,6 +1,6 @@ - Sleep om te vernieuwen… - Loslaten om te vernieuwen… - Laden… + Sleep om te vernieuwen… + Loslaten om te vernieuwen… + Laden… diff --git a/library/res/values-pl/pull_refresh_strings.xml b/library/res/values-pl/pull_refresh_strings.xml index 8b7f398bd..7d474c189 100755 --- a/library/res/values-pl/pull_refresh_strings.xml +++ b/library/res/values-pl/pull_refresh_strings.xml @@ -1,6 +1,6 @@ - Pociągnij, aby odświeżyć… - Puść, aby odświeżyć… - Trwa ładowanie… + Pociągnij, aby odświeżyć… + Puść, aby odświeżyć… + Wczytywanie… diff --git a/library/res/values-pt-rBR/pull_refresh_strings.xml b/library/res/values-pt-rBR/pull_refresh_strings.xml index bdd1cd4af..1a4359a86 100755 --- a/library/res/values-pt-rBR/pull_refresh_strings.xml +++ b/library/res/values-pt-rBR/pull_refresh_strings.xml @@ -1,6 +1,6 @@ - Puxe para atualizar… - Libere para atualizar… - Carregando… + Puxe para atualizar… + Libere para atualizar… + Carregando… diff --git a/library/res/values-pt/pull_refresh_strings.xml b/library/res/values-pt/pull_refresh_strings.xml index 8f5b27536..71eea31ac 100755 --- a/library/res/values-pt/pull_refresh_strings.xml +++ b/library/res/values-pt/pull_refresh_strings.xml @@ -1,6 +1,6 @@ - Puxe para atualizar… - Liberação para atualizar… - A carregar… + Puxe para atualizar… + Liberação para atualizar… + A carregar… diff --git a/library/res/values-ro/pull_refresh_strings.xml b/library/res/values-ro/pull_refresh_strings.xml new file mode 100644 index 000000000..c89e80a98 --- /dev/null +++ b/library/res/values-ro/pull_refresh_strings.xml @@ -0,0 +1,6 @@ + + + Trage pentru a reîmprospăta… + Eliberează pentru a reîmprospăta… + Încărcare… + diff --git a/library/res/values-ru/pull_refresh_strings.xml b/library/res/values-ru/pull_refresh_strings.xml index 4fdb8354b..ca364ff8e 100755 --- a/library/res/values-ru/pull_refresh_strings.xml +++ b/library/res/values-ru/pull_refresh_strings.xml @@ -1,6 +1,6 @@ - Потяните для обновления… - Отпустите для обновления… - Загрузка… + Потяните для обновления… + Отпустите для обновления… + Загрузка… diff --git a/library/res/values-zh/pull_refresh_strings.xml b/library/res/values-zh/pull_refresh_strings.xml index 2fff9e248..397376be9 100755 --- a/library/res/values-zh/pull_refresh_strings.xml +++ b/library/res/values-zh/pull_refresh_strings.xml @@ -1,6 +1,6 @@ - 下拉刷新… - 松手刷新… - 载入中… + 下拉刷新… + 放开以刷新… + 正在载入… diff --git a/library/res/values/pull_refresh_strings.xml b/library/res/values/pull_refresh_strings.xml index e89139feb..fe48f3bc0 100755 --- a/library/res/values/pull_refresh_strings.xml +++ b/library/res/values/pull_refresh_strings.xml @@ -1,9 +1,9 @@ - Pull to refresh… - Release to refresh… - Loading… + Pull to refresh… + Release to refresh… + Loading… @string/pull_to_refresh_pull_label From 23713ebbf9874fb63eb06eedcc1a298bc94693df Mon Sep 17 00:00:00 2001 From: Chris Banes Date: Fri, 7 Dec 2012 12:41:59 +0000 Subject: [PATCH 059/120] Fix Bug that can be caused by the user pressing on a View while we're overscrolling --- .../library/OverscrollHelper.java | 119 ++++++++++-------- .../library/PullToRefreshBase.java | 67 +++++----- 2 files changed, 107 insertions(+), 79 deletions(-) diff --git a/library/src/com/handmark/pulltorefresh/library/OverscrollHelper.java b/library/src/com/handmark/pulltorefresh/library/OverscrollHelper.java index c91e7234f..82da5e882 100644 --- a/library/src/com/handmark/pulltorefresh/library/OverscrollHelper.java +++ b/library/src/com/handmark/pulltorefresh/library/OverscrollHelper.java @@ -20,6 +20,7 @@ import android.view.View; import com.handmark.pulltorefresh.library.PullToRefreshBase.Mode; +import com.handmark.pulltorefresh.library.PullToRefreshBase.State; @TargetApi(9) public final class OverscrollHelper { @@ -34,18 +35,18 @@ public final class OverscrollHelper { * This should only be used on AdapterView's such as ListView as it just * calls through to overScrollBy() with the scrollRange = 0. AdapterView's * do not have a scroll range (i.e. getScrollY() doesn't work). - * - * @param view - PullToRefreshView that is calling this. - * @param deltaX - Change in X in pixels, passed through from from overScrollBy - * call - * @param scrollX - Current X scroll value in pixels before applying deltaY, - * passed through from from overScrollBy call - * @param deltaY - Change in Y in pixels, passed through from from overScrollBy - * call - * @param scrollY - Current Y scroll value in pixels before applying deltaY, - * passed through from from overScrollBy call - * @param isTouchEvent - true if this scroll operation is the result of a touch - * event, passed through from from overScrollBy call + * + * @param view - PullToRefreshView that is calling this. + * @param deltaX - Change in X in pixels, passed through from from + * overScrollBy call + * @param scrollX - Current X scroll value in pixels before applying deltaY, + * passed through from from overScrollBy call + * @param deltaY - Change in Y in pixels, passed through from from + * overScrollBy call + * @param scrollY - Current Y scroll value in pixels before applying deltaY, + * passed through from from overScrollBy call + * @param isTouchEvent - true if this scroll operation is the result of a + * touch event, passed through from from overScrollBy call */ public static void overScrollBy(final PullToRefreshBase view, final int deltaX, final int scrollX, final int deltaY, final int scrollY, final boolean isTouchEvent) { @@ -56,19 +57,20 @@ public static void overScrollBy(final PullToRefreshBase view, final int delta * Helper method for Overscrolling that encapsulates all of the necessary * function. This version of the call is used for Views that need to specify * a Scroll Range but scroll back to it's edge correctly. - * - * @param view - PullToRefreshView that is calling this. - * @param deltaX - Change in X in pixels, passed through from from overScrollBy - * call - * @param scrollX - Current X scroll value in pixels before applying deltaY, - * passed through from from overScrollBy call - * @param deltaY - Change in Y in pixels, passed through from from overScrollBy - * call - * @param scrollY - Current Y scroll value in pixels before applying deltaY, - * passed through from from overScrollBy call - * @param scrollRange - Scroll Range of the View, specifically needed for ScrollView - * @param isTouchEvent - true if this scroll operation is the result of a touch - * event, passed through from from overScrollBy call + * + * @param view - PullToRefreshView that is calling this. + * @param deltaX - Change in X in pixels, passed through from from + * overScrollBy call + * @param scrollX - Current X scroll value in pixels before applying deltaY, + * passed through from from overScrollBy call + * @param deltaY - Change in Y in pixels, passed through from from + * overScrollBy call + * @param scrollY - Current Y scroll value in pixels before applying deltaY, + * passed through from from overScrollBy call + * @param scrollRange - Scroll Range of the View, specifically needed for + * ScrollView + * @param isTouchEvent - true if this scroll operation is the result of a + * touch event, passed through from from overScrollBy call */ public static void overScrollBy(final PullToRefreshBase view, final int deltaX, final int scrollX, final int deltaY, final int scrollY, final int scrollRange, final boolean isTouchEvent) { @@ -78,23 +80,24 @@ public static void overScrollBy(final PullToRefreshBase view, final int delta /** * Helper method for Overscrolling that encapsulates all of the necessary * function. This is the advanced version of the call. - * - * @param view - PullToRefreshView that is calling this. - * @param deltaX - Change in X in pixels, passed through from from overScrollBy - * call - * @param scrollX - Current X scroll value in pixels before applying deltaY, - * passed through from from overScrollBy call - * @param deltaY - Change in Y in pixels, passed through from from overScrollBy - * call - * @param scrollY - Current Y scroll value in pixels before applying deltaY, - * passed through from from overScrollBy call - * @param scrollRange - Scroll Range of the View, specifically needed for ScrollView - * @param fuzzyThreshold - Threshold for which the values how fuzzy we should treat the - * other values. Needed for WebView as it doesn't always scroll - * back to it's edge. 0 = no fuzziness. - * @param scaleFactor - Scale Factor for overscroll amount - * @param isTouchEvent - true if this scroll operation is the result of a touch - * event, passed through from from overScrollBy call + * + * @param view - PullToRefreshView that is calling this. + * @param deltaX - Change in X in pixels, passed through from from + * overScrollBy call + * @param scrollX - Current X scroll value in pixels before applying deltaY, + * passed through from from overScrollBy call + * @param deltaY - Change in Y in pixels, passed through from from + * overScrollBy call + * @param scrollY - Current Y scroll value in pixels before applying deltaY, + * passed through from from overScrollBy call + * @param scrollRange - Scroll Range of the View, specifically needed for + * ScrollView + * @param fuzzyThreshold - Threshold for which the values how fuzzy we + * should treat the other values. Needed for WebView as it + * doesn't always scroll back to it's edge. 0 = no fuzziness. + * @param scaleFactor - Scale Factor for overscroll amount + * @param isTouchEvent - true if this scroll operation is the result of a + * touch event, passed through from from overScrollBy call */ public static void overScrollBy(final PullToRefreshBase view, final int deltaX, final int scrollX, final int deltaY, final int scrollY, final int scrollRange, final int fuzzyThreshold, @@ -125,29 +128,45 @@ public static void overScrollBy(final PullToRefreshBase view, final int delta final int newScrollValue = (deltaValue + scrollValue); if (PullToRefreshBase.DEBUG) { - Log.d(LOG_TAG, "OverScroll. DeltaX: " + deltaX + ", ScrollX: " + scrollX + ", DeltaY: " + deltaY + - ", ScrollY: " + scrollY + ", NewY: " + newScrollValue + ", ScrollRange: " + scrollRange + - ", CurrentScroll: " + currentScrollValue); + Log.d(LOG_TAG, "OverScroll. DeltaX: " + deltaX + ", ScrollX: " + scrollX + ", DeltaY: " + deltaY + + ", ScrollY: " + scrollY + ", NewY: " + newScrollValue + ", ScrollRange: " + scrollRange + + ", CurrentScroll: " + currentScrollValue); } if (newScrollValue < (0 - fuzzyThreshold)) { // Check the mode supports the overscroll direction, and // then move scroll if (mode.showHeaderLoadingLayout()) { + // If we're currently at zero, we're about to start + // overscrolling, so change the state + if (currentScrollValue == 0) { + view.setState(State.OVERSCROLLING); + } + view.setHeaderScroll((int) (scaleFactor * (currentScrollValue + newScrollValue))); } } else if (newScrollValue > (scrollRange + fuzzyThreshold)) { // Check the mode supports the overscroll direction, and // then move scroll if (mode.showFooterLoadingLayout()) { - view.setHeaderScroll((int) (scaleFactor * (currentScrollValue + newScrollValue - - scrollRange))); + // If we're currently at zero, we're about to start + // overscrolling, so change the state + if (currentScrollValue == 0) { + view.setState(State.OVERSCROLLING); + } + + view.setHeaderScroll((int) (scaleFactor * (currentScrollValue + newScrollValue - scrollRange))); } - } else if (Math.abs(newScrollValue) <= fuzzyThreshold || Math.abs(newScrollValue - scrollRange) <= - fuzzyThreshold) { + } else if (Math.abs(newScrollValue) <= fuzzyThreshold + || Math.abs(newScrollValue - scrollRange) <= fuzzyThreshold) { // Means we've stopped overscrolling, so scroll back to 0 - view.smoothScrollToLonger(0); + view.setState(State.RESET); } + } else if (isTouchEvent && State.OVERSCROLLING == view.getState()) { + // This condition means that we were overscrolling from a fling, + // but the user has touched the View and is now overscrolling + // from touch instead. We need to just reset. + view.setState(State.RESET); } } } diff --git a/library/src/com/handmark/pulltorefresh/library/PullToRefreshBase.java b/library/src/com/handmark/pulltorefresh/library/PullToRefreshBase.java index 00ce002cb..4c8c30a29 100644 --- a/library/src/com/handmark/pulltorefresh/library/PullToRefreshBase.java +++ b/library/src/com/handmark/pulltorefresh/library/PullToRefreshBase.java @@ -615,6 +615,37 @@ void onReset() { resetHeader(); } + final void setState(State state, final boolean... params) { + mState = state; + if (DEBUG) { + Log.d(LOG_TAG, "State: " + mState.name()); + } + + switch (mState) { + case RESET: + onReset(); + break; + case PULL_TO_REFRESH: + onPullToRefresh(); + break; + case RELEASE_TO_REFRESH: + onReleaseToRefresh(); + break; + case REFRESHING: + case MANUAL_REFRESHING: + onRefreshing(params[0]); + break; + case OVERSCROLLING: + // NO-OP + break; + } + + // Call OnPullEventListener + if (null != mOnPullEventListener) { + mOnPullEventListener.onPullEvent(this, mState, mCurrentMode); + } + } + /** * Used internally for adding view. Need because we override addView to * pass-through to the Refreshable View @@ -1130,34 +1161,6 @@ private void refreshLoadingViewsSize() { setPadding(pLeft, pTop, pRight, pBottom); } - private void setState(State state, final boolean... params) { - mState = state; - if (DEBUG) { - Log.d(LOG_TAG, "State: " + mState.name()); - } - - switch (mState) { - case RESET: - onReset(); - break; - case PULL_TO_REFRESH: - onPullToRefresh(); - break; - case RELEASE_TO_REFRESH: - onReleaseToRefresh(); - break; - case REFRESHING: - case MANUAL_REFRESHING: - onRefreshing(params[0]); - break; - } - - // Call OnPullEventListener - if (null != mOnPullEventListener) { - mOnPullEventListener.onPullEvent(this, mState, mCurrentMode); - } - } - /** * Smooth Scroll to position using the specific duration * @@ -1470,7 +1473,13 @@ public static enum State { * When the UI is currently refreshing, caused by a call to * {@link PullToRefreshBase#setRefreshing() setRefreshing()}. */ - MANUAL_REFRESHING(0x9); + MANUAL_REFRESHING(0x9), + + /** + * When the UI is currently overscrolling, caused by a fling on the + * Refreshable View. + */ + OVERSCROLLING(0x10); /** * Maps an int to a specific state. This is needed when saving state. From 9e341ef1b94dea372be24eeba876abd26a60d16c Mon Sep 17 00:00:00 2001 From: Chris Banes Date: Fri, 7 Dec 2012 12:52:06 +0000 Subject: [PATCH 060/120] Fix Some Lint warnings --- .../library/PullToRefreshAdapterViewBase.java | 32 ++++++++++------- .../library/PullToRefreshBase.java | 21 ++++++------ .../library/internal/FlipLoadingLayout.java | 5 +++ .../library/internal/LoadingLayout.java | 2 +- .../internal/{SDK16.java => ViewCompat.java} | 34 +++++++++++++++++-- 5 files changed, 67 insertions(+), 27 deletions(-) rename library/src/com/handmark/pulltorefresh/library/internal/{SDK16.java => ViewCompat.java} (54%) diff --git a/library/src/com/handmark/pulltorefresh/library/PullToRefreshAdapterViewBase.java b/library/src/com/handmark/pulltorefresh/library/PullToRefreshAdapterViewBase.java index 3d9ba31a9..f9410b78c 100644 --- a/library/src/com/handmark/pulltorefresh/library/PullToRefreshAdapterViewBase.java +++ b/library/src/com/handmark/pulltorefresh/library/PullToRefreshAdapterViewBase.java @@ -75,10 +75,10 @@ public PullToRefreshAdapterViewBase(Context context, Mode mode, AnimationStyle a * Gets whether an indicator graphic should be displayed when the View is in * a state where a Pull-to-Refresh can happen. An example of this state is * when the Adapter View is scrolled to the top and the mode is set to - * {@link Mode#PULL_FROM_START}. The default value is true - * if {@link PullToRefreshBase#isPullToRefreshOverScrollEnabled() + * {@link Mode#PULL_FROM_START}. The default value is true if + * {@link PullToRefreshBase#isPullToRefreshOverScrollEnabled() * isPullToRefreshOverScrollEnabled()} returns false. - * + * * @return true if the indicators will be shown */ public boolean getShowIndicator() { @@ -89,9 +89,8 @@ public final void onScroll(final AbsListView view, final int firstVisibleItem, f final int totalItemCount) { if (DEBUG) { - Log.d(LOG_TAG, - "First Visible: " + firstVisibleItem + ". Visible Count: " + visibleItemCount + ". Total Items:" + - totalItemCount); + Log.d(LOG_TAG, "First Visible: " + firstVisibleItem + ". Visible Count: " + visibleItemCount + + ". Total Items:" + totalItemCount); } // If we have a OnItemVisibleListener, do check... @@ -132,9 +131,10 @@ public final void onScrollStateChanged(final AbsListView view, final int scrollS /** * Pass-through method for {@link PullToRefreshBase#getRefreshableView() - * getRefreshableView()}.{@link AdapterView#setAdapter(android.widget.Adapter)} + * getRefreshableView()}. + * {@link AdapterView#setAdapter(android.widget.Adapter)} * setAdapter(adapter)}. This is just for convenience! - * + * * @param adapter - Adapter to set */ public void setAdapter(ListAdapter adapter) { @@ -151,7 +151,7 @@ public void setAdapter(ListAdapter adapter) { * yourself. Calling setEmptyView on the AdapterView will automatically call * this method and set everything up. This includes when the Android * Framework automatically sets the Empty View based on it's ID. - * + * * @param newEmptyView - Empty View to be used */ public final void setEmptyView(View newEmptyView) { @@ -189,7 +189,7 @@ public final void setEmptyView(View newEmptyView) { * getRefreshableView()}. * {@link AdapterView#setOnItemClickListener(OnItemClickListener) * setOnItemClickListener(listener)}. This is just for convenience! - * + * * @param listener - OnItemClickListener to use */ public void setOnItemClickListener(OnItemClickListener listener) { @@ -213,7 +213,7 @@ public final void setScrollEmptyView(boolean doScroll) { * a state where a Pull-to-Refresh can happen. An example of this state is * when the Adapter View is scrolled to the top and the mode is set to * {@link Mode#PULL_FROM_START} - * + * * @param showIndicator - true if the indicators should be shown. */ public void setShowIndicator(boolean showIndicator) { @@ -242,6 +242,9 @@ void onPullToRefresh() { case PULL_FROM_START: mIndicatorIvTop.pullToRefresh(); break; + default: + // NO-OP + break; } } } @@ -266,6 +269,9 @@ void onReleaseToRefresh() { case PULL_FROM_START: mIndicatorIvTop.releaseToRefresh(); break; + default: + // NO-OP + break; } } } @@ -394,8 +400,8 @@ private boolean isLastItemVisible() { final int lastVisiblePosition = mRefreshableView.getLastVisiblePosition(); if (DEBUG) { - Log.d(LOG_TAG, "isLastItemVisible. Last Item Position: " + lastItemPosition + " Last Visible Pos: " + - lastVisiblePosition); + Log.d(LOG_TAG, "isLastItemVisible. Last Item Position: " + lastItemPosition + " Last Visible Pos: " + + lastVisiblePosition); } /** diff --git a/library/src/com/handmark/pulltorefresh/library/PullToRefreshBase.java b/library/src/com/handmark/pulltorefresh/library/PullToRefreshBase.java index 4c8c30a29..de39439d4 100644 --- a/library/src/com/handmark/pulltorefresh/library/PullToRefreshBase.java +++ b/library/src/com/handmark/pulltorefresh/library/PullToRefreshBase.java @@ -37,8 +37,8 @@ import com.handmark.pulltorefresh.library.internal.FlipLoadingLayout; import com.handmark.pulltorefresh.library.internal.LoadingLayout; import com.handmark.pulltorefresh.library.internal.RotateLoadingLayout; -import com.handmark.pulltorefresh.library.internal.SDK16; import com.handmark.pulltorefresh.library.internal.Utils; +import com.handmark.pulltorefresh.library.internal.ViewCompat; public abstract class PullToRefreshBase extends LinearLayout implements IPullToRefresh { @@ -544,6 +544,9 @@ void onPullToRefresh() { case PULL_FROM_START: mHeaderLayout.pullToRefresh(); break; + default: + // NO-OP + break; } } @@ -594,6 +597,9 @@ void onReleaseToRefresh() { case PULL_FROM_START: mHeaderLayout.releaseToRefresh(); break; + default: + // NO-OP + break; } } @@ -1021,8 +1027,9 @@ private boolean isReadyForPull() { return isReadyForPullEnd(); case BOTH: return isReadyForPullEnd() || isReadyForPullStart(); + default: + return false; } - return false; } private void measureView(View child) { @@ -1086,6 +1093,7 @@ private void pullEvent() { mFooterLayout.onPull(scale); break; case PULL_FROM_START: + default: mHeaderLayout.onPull(scale); break; } @@ -1510,9 +1518,6 @@ int getIntValue() { } final class SmoothScrollRunnable implements Runnable { - - static final int ANIMATION_DELAY = 10; - private final Interpolator mInterpolator; private final int mScrollToY; private final int mScrollFromY; @@ -1558,11 +1563,7 @@ public void run() { // If we're not at the target Y, keep going... if (mContinueRunning && mScrollToY != mCurrentY) { - if (VERSION.SDK_INT >= VERSION_CODES.JELLY_BEAN) { - SDK16.postOnAnimation(PullToRefreshBase.this, this); - } else { - postDelayed(this, ANIMATION_DELAY); - } + ViewCompat.postOnAnimation(PullToRefreshBase.this, this); } else { if (null != mListener) { mListener.onSmoothScrollFinished(); diff --git a/library/src/com/handmark/pulltorefresh/library/internal/FlipLoadingLayout.java b/library/src/com/handmark/pulltorefresh/library/internal/FlipLoadingLayout.java index fc257fa5a..2f435522f 100644 --- a/library/src/com/handmark/pulltorefresh/library/internal/FlipLoadingLayout.java +++ b/library/src/com/handmark/pulltorefresh/library/internal/FlipLoadingLayout.java @@ -15,6 +15,7 @@ *******************************************************************************/ package com.handmark.pulltorefresh.library.internal; +import android.annotation.SuppressLint; import android.content.Context; import android.content.res.TypedArray; import android.graphics.Matrix; @@ -29,6 +30,7 @@ import com.handmark.pulltorefresh.library.PullToRefreshBase.Mode; import com.handmark.pulltorefresh.library.R; +@SuppressLint("ViewConstructor") public class FlipLoadingLayout extends LoadingLayout { static final int FLIP_ANIMATION_DURATION = 150; @@ -133,6 +135,9 @@ private float getDrawableRotationAngle() { angle = 270f; } break; + + default: + break; } return angle; diff --git a/library/src/com/handmark/pulltorefresh/library/internal/LoadingLayout.java b/library/src/com/handmark/pulltorefresh/library/internal/LoadingLayout.java index 5c5b215d1..df94142f3 100644 --- a/library/src/com/handmark/pulltorefresh/library/internal/LoadingLayout.java +++ b/library/src/com/handmark/pulltorefresh/library/internal/LoadingLayout.java @@ -111,7 +111,7 @@ public LoadingLayout(Context context, final Mode mode, final int scrollDirection if (attrs.hasValue(R.styleable.PullToRefresh_ptrHeaderBackground)) { Drawable background = attrs.getDrawable(R.styleable.PullToRefresh_ptrHeaderBackground); if (null != background) { - setBackgroundDrawable(background); + ViewCompat.setBackground(this, background); } } diff --git a/library/src/com/handmark/pulltorefresh/library/internal/SDK16.java b/library/src/com/handmark/pulltorefresh/library/internal/ViewCompat.java similarity index 54% rename from library/src/com/handmark/pulltorefresh/library/internal/SDK16.java rename to library/src/com/handmark/pulltorefresh/library/internal/ViewCompat.java index 7a62afa14..852440329 100644 --- a/library/src/com/handmark/pulltorefresh/library/internal/SDK16.java +++ b/library/src/com/handmark/pulltorefresh/library/internal/ViewCompat.java @@ -16,13 +16,41 @@ package com.handmark.pulltorefresh.library.internal; import android.annotation.TargetApi; +import android.graphics.drawable.Drawable; +import android.os.Build.VERSION; +import android.os.Build.VERSION_CODES; import android.view.View; -@TargetApi(16) -public class SDK16 { +@SuppressWarnings("deprecation") +public class ViewCompat { public static void postOnAnimation(View view, Runnable runnable) { - view.postOnAnimation(runnable); + if (VERSION.SDK_INT >= VERSION_CODES.JELLY_BEAN) { + SDK16.postOnAnimation(view, runnable); + } else { + view.postDelayed(runnable, 16); + } + } + + public static void setBackground(View view, Drawable background) { + if (VERSION.SDK_INT >= VERSION_CODES.JELLY_BEAN) { + SDK16.setBackground(view, background); + } else { + view.setBackgroundDrawable(background); + } + } + + @TargetApi(16) + static class SDK16 { + + public static void postOnAnimation(View view, Runnable runnable) { + view.postOnAnimation(runnable); + } + + public static void setBackground(View view, Drawable background) { + view.setBackground(background); + } + } } From 3011b0352598f8a71a6f1df76ca7efbcf5805806 Mon Sep 17 00:00:00 2001 From: Chris Banes Date: Fri, 7 Dec 2012 13:28:41 +0000 Subject: [PATCH 061/120] Fix Layout Problems on v2.x devices --- .../handmark/pulltorefresh/library/PullToRefreshBase.java | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/library/src/com/handmark/pulltorefresh/library/PullToRefreshBase.java b/library/src/com/handmark/pulltorefresh/library/PullToRefreshBase.java index de39439d4..7f68fc011 100644 --- a/library/src/com/handmark/pulltorefresh/library/PullToRefreshBase.java +++ b/library/src/com/handmark/pulltorefresh/library/PullToRefreshBase.java @@ -1145,6 +1145,9 @@ private void refreshLoadingViewsSize() { mHeaderLayout.adjustHeightUsingTopPadding(maximumPullScroll); break; } + + // We need to re-measure with the new padding... + measureView(mHeaderLayout); } if (mMode.showFooterLoadingLayout()) { @@ -1164,6 +1167,9 @@ private void refreshLoadingViewsSize() { mFooterLayout.adjustHeightUsingBottomPadding(maximumPullScroll); break; } + + // We need to re-measure with the new padding... + measureView(mFooterLayout); } setPadding(pLeft, pTop, pRight, pBottom); From f6493328cb07c9fc6a9ceae4887f6c5d9c02f904 Mon Sep 17 00:00:00 2001 From: Chris Banes Date: Fri, 7 Dec 2012 14:10:13 +0000 Subject: [PATCH 062/120] Fix Header/Footer background not filling height when in horizontal mode --- .../library/PullToRefreshBase.java | 43 +++++++++++-------- 1 file changed, 25 insertions(+), 18 deletions(-) diff --git a/library/src/com/handmark/pulltorefresh/library/PullToRefreshBase.java b/library/src/com/handmark/pulltorefresh/library/PullToRefreshBase.java index 7f68fc011..db16c4711 100644 --- a/library/src/com/handmark/pulltorefresh/library/PullToRefreshBase.java +++ b/library/src/com/handmark/pulltorefresh/library/PullToRefreshBase.java @@ -897,18 +897,7 @@ protected final void smoothScrollToLonger(int scrollValue) { protected void updateUIForMode() { // We need to use the correct LayoutParam values, based on scroll // direction - final LinearLayout.LayoutParams lp; - switch (getPullToRefreshScrollDirection()) { - case HORIZONTAL_SCROLL: - lp = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, - LinearLayout.LayoutParams.MATCH_PARENT); - break; - case VERTICAL_SCROLL: - default: - lp = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, - LinearLayout.LayoutParams.WRAP_CONTENT); - break; - } + final LinearLayout.LayoutParams lp = getLoadingLayoutLayoutParams(); // Remove Header, and then add Header Loading View again if needed if (this == mHeaderLayout.getParent()) { @@ -1035,17 +1024,23 @@ private boolean isReadyForPull() { private void measureView(View child) { ViewGroup.LayoutParams p = child.getLayoutParams(); if (p == null) { - p = new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT); + p = getLoadingLayoutLayoutParams(); } - int childWidthSpec = ViewGroup.getChildMeasureSpec(0, 0, p.width); - int lpHeight = p.height; - int childHeightSpec; - if (lpHeight > 0) { - childHeightSpec = MeasureSpec.makeMeasureSpec(lpHeight, MeasureSpec.EXACTLY); + int childWidthSpec, childHeightSpec; + + if (p.width == ViewGroup.LayoutParams.MATCH_PARENT) { + childWidthSpec = MeasureSpec.makeMeasureSpec(getWidth(), MeasureSpec.EXACTLY); + } else { + childWidthSpec = MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED); + } + + if (p.height == ViewGroup.LayoutParams.MATCH_PARENT) { + childHeightSpec = MeasureSpec.makeMeasureSpec(getHeight(), MeasureSpec.EXACTLY); } else { childHeightSpec = MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED); } + child.measure(childWidthSpec, childHeightSpec); } @@ -1106,6 +1101,18 @@ private void pullEvent() { } } + private LinearLayout.LayoutParams getLoadingLayoutLayoutParams() { + switch (getPullToRefreshScrollDirection()) { + case HORIZONTAL_SCROLL: + return new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, + LinearLayout.LayoutParams.MATCH_PARENT); + case VERTICAL_SCROLL: + default: + return new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, + LinearLayout.LayoutParams.WRAP_CONTENT); + } + } + private int getMaximumPullScroll() { switch (getPullToRefreshScrollDirection()) { case HORIZONTAL_SCROLL: From 295361e5319063442f8de9c7c35f4f661cd7244b Mon Sep 17 00:00:00 2001 From: Chris Banes Date: Mon, 10 Dec 2012 16:43:03 +0000 Subject: [PATCH 063/120] Expose ScrollingWhileRefreshingEnabled function via XML attributes. Tidy up Method name too. --- library/res/values/attrs.xml | 1 + .../pulltorefresh/library/IPullToRefresh.java | 142 +++++++++--------- .../library/PullToRefreshBase.java | 42 ++++-- .../library/PullToRefreshListView.java | 15 +- 4 files changed, 114 insertions(+), 86 deletions(-) diff --git a/library/res/values/attrs.xml b/library/res/values/attrs.xml index c98912779..5d05b76ed 100644 --- a/library/res/values/attrs.xml +++ b/library/res/values/attrs.xml @@ -28,6 +28,7 @@ + diff --git a/library/src/com/handmark/pulltorefresh/library/IPullToRefresh.java b/library/src/com/handmark/pulltorefresh/library/IPullToRefresh.java index 95f873ad4..5fe6f5082 100644 --- a/library/src/com/handmark/pulltorefresh/library/IPullToRefresh.java +++ b/library/src/com/handmark/pulltorefresh/library/IPullToRefresh.java @@ -33,7 +33,7 @@ public interface IPullToRefresh { * app, etc. The animation will only happen if the Refresh View (ListView, * ScrollView, etc) is in a state where a Pull-to-Refresh could occur by a * user's touch gesture (i.e. scrolled to the top/bottom). - * + * * @return true - if the Demo has been started, false if not. */ public boolean demo(); @@ -41,7 +41,7 @@ public interface IPullToRefresh { /** * Get the mode that this view is currently in. This is only really useful * when using Mode.BOTH. - * + * * @return Mode that the view is currently in */ public Mode getCurrentMode(); @@ -52,7 +52,7 @@ public interface IPullToRefresh { * in the Y-axis is greater than the difference in the X-axis. This means * that the View will not interfere when it is used in a horizontal * scrolling View (such as a ViewPager). - * + * * @return boolean - true if the View is filtering Touch Events */ public boolean getFilterTouchEvents(); @@ -61,7 +61,7 @@ public interface IPullToRefresh { * Get the mode that this view has been set to. If this returns * Mode.BOTH, you can use getCurrentMode() to * check which mode the view is currently in - * + * * @return Mode that the view has been set to */ public Mode getMode(); @@ -69,7 +69,7 @@ public interface IPullToRefresh { /** * Get the Wrapped Refreshable View. Anything returned here has already been * added to the content view. - * + * * @return The View which is currently wrapped */ public T getRefreshableView(); @@ -77,7 +77,7 @@ public interface IPullToRefresh { /** * Get whether the 'Refreshing' View should be automatically shown when * refreshing. Returns true by default. - * + * * @return - true if the Refreshing View will be show */ public boolean getShowViewWhileRefreshing(); @@ -88,51 +88,42 @@ public interface IPullToRefresh { public State getState(); /** - * Returns whether the widget has disabled scrolling on the Refreshable View - * while refreshing. - * - * @return true if the widget has disabled scrolling while refreshing + * Whether Pull-to-Refresh is enabled + * + * @return enabled */ - public boolean isDisableScrollingWhileRefreshing(); + public boolean isPullToRefreshEnabled(); /** * Gets whether Overscroll support is enabled. This is different to * Android's standard Overscroll support (the edge-glow) which is available * from GINGERBREAD onwards - * + * * @return true - if both PullToRefresh-OverScroll and Android's inbuilt * OverScroll are enabled */ public boolean isPullToRefreshOverScrollEnabled(); - /** - * Whether Pull-to-Refresh is enabled - * - * @return enabled - */ - public boolean isPullToRefreshEnabled(); - /** * Returns whether the Widget is currently in the Refreshing mState - * + * * @return true if the Widget is currently refreshing */ public boolean isRefreshing(); /** - * Mark the current Refresh as complete. Will Reset the UI and hide the - * Refreshing View + * Returns whether the widget has enabled scrolling on the Refreshable View + * while refreshing. + * + * @return true if the widget has enabled scrolling while refreshing */ - public void onRefreshComplete(); + public boolean isScrollingWhileRefreshingEnabled(); /** - * By default the Widget disabled scrolling on the Refreshable View while - * refreshing. This method can change this behaviour. - * - * @param disableScrollingWhileRefreshing - * - true if you want to disable scrolling while refreshing + * Mark the current Refresh as complete. Will Reset the UI and hide the + * Refreshing View */ - public void setDisableScrollingWhileRefreshing(boolean disableScrollingWhileRefreshing); + public void onRefreshComplete(); /** * Set the Touch Events to be filtered or not. If set to true, then the View @@ -141,15 +132,16 @@ public interface IPullToRefresh { * interfere when it is used in a horizontal scrolling View (such as a * ViewPager), but will restrict which types of finger scrolls will trigger * the View. - * - * @param filterEvents - true if you want to filter Touch Events. Default is true. + * + * @param filterEvents - true if you want to filter Touch Events. Default is + * true. */ public void setFilterTouchEvents(boolean filterEvents); /** * Set the Last Updated Text. This displayed under the main label when * Pulling - * + * * @param label - Label to set */ public void setLastUpdatedLabel(CharSequence label); @@ -157,77 +149,77 @@ public interface IPullToRefresh { /** * Set the drawable used in the loading layout. This is the same as calling * setLoadingDrawable(drawable, Mode.BOTH) - * + * * @param drawable - Drawable to display */ public void setLoadingDrawable(Drawable drawable); /** * Set the drawable used in the loading layout. - * + * * @param drawable - Drawable to display - * @param mode - Controls which Header/Footer Views will be updated. - * Mode.BOTH will update all available, other values - * will update the relevant View. + * @param mode - Controls which Header/Footer Views will be updated. + * Mode.BOTH will update all available, other values + * will update the relevant View. */ public void setLoadingDrawable(Drawable drawable, Mode mode); /** * Set the mode of Pull-to-Refresh that this view will use. - * + * * @param mode - Mode to set the View to */ public void setMode(Mode mode); /** * Set OnPullEventListener for the Widget - * + * * @param listener - Listener to be used when the Widget has a pull event to - * propogate. + * propogate. */ public void setOnPullEventListener(OnPullEventListener listener); /** * Set OnRefreshListener for the Widget - * + * * @param listener - Listener to be used when the Widget is set to Refresh */ public void setOnRefreshListener(OnRefreshListener listener); /** * Set OnRefreshListener for the Widget - * + * * @param listener - Listener to be used when the Widget is set to Refresh */ public void setOnRefreshListener(OnRefreshListener2 listener); - /** - * Sets whether Overscroll support is enabled. This is different to - * Android's standard Overscroll support (the edge-glow). This setting only - * takes effect when running on device with Android v2.3 or greater. - * - * @param enabled - true if you want Overscroll enabled - */ - public void setPullToRefreshOverScrollEnabled(boolean enabled); - /** * Set Text to show when the Widget is being Pulled * setPullLabel(releaseLabel, Mode.BOTH) - * + * * @param pullLabel - CharSequence to display */ public void setPullLabel(CharSequence pullLabel); /** * Set Text to show when the Widget is being Pulled - * + * * @param pullLabel - CharSequence to display - * @param mode - Controls which Header/Footer Views will be updated. - * Mode.BOTH will update all available, other values - * will update the relevant View. + * @param mode - Controls which Header/Footer Views will be updated. + * Mode.BOTH will update all available, other values + * will update the relevant View. */ public void setPullLabel(CharSequence pullLabel, Mode mode); + /** + * Sets whether Overscroll support is enabled. This is different to + * Android's standard Overscroll support (the edge-glow). This setting only + * takes effect when running on device with Android v2.3 or greater. + * + * @param enabled - true if you want Overscroll enabled + */ + public void setPullToRefreshOverScrollEnabled(boolean enabled); + /** * Sets the Widget to be in the refresh state. The UI will be updated to * show the 'Refreshing' view, and be scrolled to show such. @@ -237,26 +229,27 @@ public interface IPullToRefresh { /** * Sets the Widget to be in the refresh state. The UI will be updated to * show the 'Refreshing' view. - * - * @param doScroll - true if you want to force a scroll to the Refreshing view. + * + * @param doScroll - true if you want to force a scroll to the Refreshing + * view. */ public void setRefreshing(boolean doScroll); /** * Set Text to show when the Widget is refreshing * setRefreshingLabel(releaseLabel, Mode.BOTH) - * + * * @param refreshingLabel - CharSequence to display */ public void setRefreshingLabel(CharSequence refreshingLabel); /** * Set Text to show when the Widget is refreshing - * + * * @param refreshingLabel - CharSequence to display - * @param mode - Controls which Header/Footer Views will be updated. - * Mode.BOTH will update all available, other values - * will update the relevant View. + * @param mode - Controls which Header/Footer Views will be updated. + * Mode.BOTH will update all available, other values + * will update the relevant View. */ public void setRefreshingLabel(CharSequence refreshingLabel, Mode mode); @@ -264,7 +257,7 @@ public interface IPullToRefresh { * Set Text to show when the Widget is being pulled, and will refresh when * released. This is the same as calling * setReleaseLabel(releaseLabel, Mode.BOTH) - * + * * @param releaseLabel - CharSequence to display */ public void setReleaseLabel(CharSequence releaseLabel); @@ -272,26 +265,35 @@ public interface IPullToRefresh { /** * Set Text to show when the Widget is being pulled, and will refresh when * released - * + * * @param releaseLabel - CharSequence to display - * @param mode - Controls which Header/Footer Views will be updated. - * Mode.BOTH will update all available, other values - * will update the relevant View. + * @param mode - Controls which Header/Footer Views will be updated. + * Mode.BOTH will update all available, other values + * will update the relevant View. */ public void setReleaseLabel(CharSequence releaseLabel, Mode mode); /** * Sets the Animation Interpolator that is used for animated scrolling. * Defaults to a DecelerateInterpolator - * + * * @param interpolator - Interpolator to use */ public void setScrollAnimationInterpolator(Interpolator interpolator); + /** + * By default the Widget disables scrolling on the Refreshable View while + * refreshing. This method can change this behaviour. + * + * @param scrollingWhileRefreshingEnabled - true if you want to enable + * scrolling while refreshing + */ + public void setScrollingWhileRefreshingEnabled(boolean scrollingWhileRefreshingEnabled); + /** * A mutator to enable/disable whether the 'Refreshing' View should be * automatically shown when refreshing. - * + * * @param showView */ public void setShowViewWhileRefreshing(boolean showView); diff --git a/library/src/com/handmark/pulltorefresh/library/PullToRefreshBase.java b/library/src/com/handmark/pulltorefresh/library/PullToRefreshBase.java index db16c4711..9c1feb454 100644 --- a/library/src/com/handmark/pulltorefresh/library/PullToRefreshBase.java +++ b/library/src/com/handmark/pulltorefresh/library/PullToRefreshBase.java @@ -62,7 +62,7 @@ public abstract class PullToRefreshBase extends LinearLayout imp static final String STATE_STATE = "ptr_state"; static final String STATE_MODE = "ptr_mode"; static final String STATE_CURRENT_MODE = "ptr_current_mode"; - static final String STATE_DISABLE_SCROLLING_REFRESHING = "ptr_disable_scrolling"; + static final String STATE_SCROLLING_REFRESHING_ENABLED = "ptr_disable_scrolling"; static final String STATE_SHOW_REFRESHING_VIEW = "ptr_show_refreshing_view"; static final String STATE_SUPER = "ptr_super"; @@ -83,7 +83,7 @@ public abstract class PullToRefreshBase extends LinearLayout imp private FrameLayout mRefreshableViewWrapper; private boolean mShowViewWhileRefreshing = true; - private boolean mDisableScrollingWhileRefreshing = true; + private boolean mScrollingWhileRefreshingEnabled = false; private boolean mFilterTouchEvents = true; private boolean mOverScrollEnabled = true; private boolean mLayoutVisibilityChangesEnabled = true; @@ -196,9 +196,11 @@ public final boolean hasPullFromTop() { return mCurrentMode == Mode.PULL_FROM_START; } - @Override + /** + * @deprecated See {@link #isScrollingWhileRefreshingEnabled()}. + */ public final boolean isDisableScrollingWhileRefreshing() { - return mDisableScrollingWhileRefreshing; + return !isScrollingWhileRefreshingEnabled(); } @Override @@ -217,6 +219,11 @@ public final boolean isRefreshing() { return mState == State.REFRESHING || mState == State.MANUAL_REFRESHING; } + @Override + public final boolean isScrollingWhileRefreshingEnabled() { + return mScrollingWhileRefreshingEnabled; + } + @Override public final boolean onInterceptTouchEvent(MotionEvent event) { @@ -238,7 +245,7 @@ public final boolean onInterceptTouchEvent(MotionEvent event) { switch (action) { case MotionEvent.ACTION_MOVE: { // If we're refreshing, and the flag is set. Eat all MOVE events - if (mDisableScrollingWhileRefreshing && isRefreshing()) { + if (!mScrollingWhileRefreshingEnabled && isRefreshing()) { return true; } @@ -309,7 +316,7 @@ public final boolean onTouchEvent(MotionEvent event) { } // If we're refreshing, and the flag is set. Eat the event - if (mDisableScrollingWhileRefreshing && isRefreshing()) { + if (!mScrollingWhileRefreshingEnabled && isRefreshing()) { return true; } @@ -373,9 +380,15 @@ public final boolean onTouchEvent(MotionEvent event) { return false; } - @Override - public final void setDisableScrollingWhileRefreshing(boolean disableScrollingWhileRefreshing) { - mDisableScrollingWhileRefreshing = disableScrollingWhileRefreshing; + public final void setScrollingWhileRefreshingEnabled(boolean allowScrollingWhileRefreshing) { + mScrollingWhileRefreshingEnabled = allowScrollingWhileRefreshing; + } + + /** + * @deprecated See {@link #setScrollingWhileRefreshingEnabled(boolean)} + */ + public void setDisableScrollingWhileRefreshing(boolean disableScrollingWhileRefreshing) { + setScrollingWhileRefreshingEnabled(!disableScrollingWhileRefreshing); } @Override @@ -776,7 +789,7 @@ protected final void onRestoreInstanceState(Parcelable state) { mMode = Mode.mapIntToValue(bundle.getInt(STATE_MODE, 0)); mCurrentMode = Mode.mapIntToValue(bundle.getInt(STATE_CURRENT_MODE, 0)); - mDisableScrollingWhileRefreshing = bundle.getBoolean(STATE_DISABLE_SCROLLING_REFRESHING, true); + mScrollingWhileRefreshingEnabled = bundle.getBoolean(STATE_SCROLLING_REFRESHING_ENABLED, false); mShowViewWhileRefreshing = bundle.getBoolean(STATE_SHOW_REFRESHING_VIEW, true); // Let super Restore Itself @@ -806,7 +819,7 @@ protected final Parcelable onSaveInstanceState() { bundle.putInt(STATE_STATE, mState.getIntValue()); bundle.putInt(STATE_MODE, mMode.getIntValue()); bundle.putInt(STATE_CURRENT_MODE, mCurrentMode.getIntValue()); - bundle.putBoolean(STATE_DISABLE_SCROLLING_REFRESHING, mDisableScrollingWhileRefreshing); + bundle.putBoolean(STATE_SCROLLING_REFRESHING_ENABLED, mScrollingWhileRefreshingEnabled); bundle.putBoolean(STATE_SHOW_REFRESHING_VIEW, mShowViewWhileRefreshing); bundle.putParcelable(STATE_SUPER, super.onSaveInstanceState()); @@ -999,6 +1012,11 @@ private void init(Context context, AttributeSet attrs) { mOverScrollEnabled = a.getBoolean(R.styleable.PullToRefresh_ptrOverScroll, true); } + if (a.hasValue(R.styleable.PullToRefresh_ptrScrollingWhileRefreshingEnabled)) { + mScrollingWhileRefreshingEnabled = a.getBoolean(R.styleable.PullToRefresh_ptrScrollingWhileRefreshingEnabled, + false); + } + // Let the derivative classes have a go at handling attributes, then // recycle them... handleStyledAttributes(a); @@ -1034,7 +1052,7 @@ private void measureView(View child) { } else { childWidthSpec = MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED); } - + if (p.height == ViewGroup.LayoutParams.MATCH_PARENT) { childHeightSpec = MeasureSpec.makeMeasureSpec(getHeight(), MeasureSpec.EXACTLY); } else { diff --git a/library/src/com/handmark/pulltorefresh/library/PullToRefreshListView.java b/library/src/com/handmark/pulltorefresh/library/PullToRefreshListView.java index f04b3c4e6..710609c90 100644 --- a/library/src/com/handmark/pulltorefresh/library/PullToRefreshListView.java +++ b/library/src/com/handmark/pulltorefresh/library/PullToRefreshListView.java @@ -43,22 +43,18 @@ public class PullToRefreshListView extends PullToRefreshAdapterViewBase Date: Mon, 10 Dec 2012 22:45:22 +0100 Subject: [PATCH 064/120] Allow removing the empty view using setEmptyView(null) --- .../library/PullToRefreshAdapterViewBase.java | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/library/src/com/handmark/pulltorefresh/library/PullToRefreshAdapterViewBase.java b/library/src/com/handmark/pulltorefresh/library/PullToRefreshAdapterViewBase.java index f9410b78c..26ee40753 100644 --- a/library/src/com/handmark/pulltorefresh/library/PullToRefreshAdapterViewBase.java +++ b/library/src/com/handmark/pulltorefresh/library/PullToRefreshAdapterViewBase.java @@ -174,14 +174,14 @@ public final void setEmptyView(View newEmptyView) { refreshableViewWrapper.addView(newEmptyView, ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT); + } - if (mRefreshableView instanceof EmptyViewMethodAccessor) { - ((EmptyViewMethodAccessor) mRefreshableView).setEmptyViewInternal(newEmptyView); - } else { - mRefreshableView.setEmptyView(newEmptyView); - } - mEmptyView = newEmptyView; + if (mRefreshableView instanceof EmptyViewMethodAccessor) { + ((EmptyViewMethodAccessor) mRefreshableView).setEmptyViewInternal(newEmptyView); + } else { + mRefreshableView.setEmptyView(newEmptyView); } + mEmptyView = newEmptyView; } /** From 20ff7c7e1f918153e82d63520085a71222450521 Mon Sep 17 00:00:00 2001 From: Chris Banes Date: Tue, 11 Dec 2012 16:09:12 +0000 Subject: [PATCH 065/120] Fix being able to use ptrHeaderTextAppearance and ptrHeaderTextColor at the same time. Closes #179 --- .../library/internal/LoadingLayout.java | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/library/src/com/handmark/pulltorefresh/library/internal/LoadingLayout.java b/library/src/com/handmark/pulltorefresh/library/internal/LoadingLayout.java index df94142f3..c76b2f8e7 100644 --- a/library/src/com/handmark/pulltorefresh/library/internal/LoadingLayout.java +++ b/library/src/com/handmark/pulltorefresh/library/internal/LoadingLayout.java @@ -100,14 +100,6 @@ public LoadingLayout(Context context, final Mode mode, final int scrollDirection break; } - if (attrs.hasValue(R.styleable.PullToRefresh_ptrHeaderTextColor)) { - ColorStateList colors = attrs.getColorStateList(R.styleable.PullToRefresh_ptrHeaderTextColor); - setTextColor(null != colors ? colors : ColorStateList.valueOf(Color.BLACK)); - } - if (attrs.hasValue(R.styleable.PullToRefresh_ptrHeaderSubTextColor)) { - ColorStateList colors = attrs.getColorStateList(R.styleable.PullToRefresh_ptrHeaderSubTextColor); - setSubTextColor(null != colors ? colors : ColorStateList.valueOf(Color.BLACK)); - } if (attrs.hasValue(R.styleable.PullToRefresh_ptrHeaderBackground)) { Drawable background = attrs.getDrawable(R.styleable.PullToRefresh_ptrHeaderBackground); if (null != background) { @@ -126,6 +118,16 @@ public LoadingLayout(Context context, final Mode mode, final int scrollDirection setSubTextAppearance(styleID.data); } + // Text Color attrs need to be set after TextAppearance attrs + if (attrs.hasValue(R.styleable.PullToRefresh_ptrHeaderTextColor)) { + ColorStateList colors = attrs.getColorStateList(R.styleable.PullToRefresh_ptrHeaderTextColor); + setTextColor(null != colors ? colors : ColorStateList.valueOf(Color.BLACK)); + } + if (attrs.hasValue(R.styleable.PullToRefresh_ptrHeaderSubTextColor)) { + ColorStateList colors = attrs.getColorStateList(R.styleable.PullToRefresh_ptrHeaderSubTextColor); + setSubTextColor(null != colors ? colors : ColorStateList.valueOf(Color.BLACK)); + } + // Try and get defined drawable from Attrs Drawable imageDrawable = null; if (attrs.hasValue(R.styleable.PullToRefresh_ptrDrawable)) { From d1b44ce030ff9ee5b086c17ac02380fd79a84d8a Mon Sep 17 00:00:00 2001 From: Chris Banes Date: Tue, 11 Dec 2012 16:11:05 +0000 Subject: [PATCH 066/120] Don't set Text Color unless we get a valid one back from XML Attr --- .../pulltorefresh/library/internal/LoadingLayout.java | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/library/src/com/handmark/pulltorefresh/library/internal/LoadingLayout.java b/library/src/com/handmark/pulltorefresh/library/internal/LoadingLayout.java index c76b2f8e7..e898f4921 100644 --- a/library/src/com/handmark/pulltorefresh/library/internal/LoadingLayout.java +++ b/library/src/com/handmark/pulltorefresh/library/internal/LoadingLayout.java @@ -121,11 +121,15 @@ public LoadingLayout(Context context, final Mode mode, final int scrollDirection // Text Color attrs need to be set after TextAppearance attrs if (attrs.hasValue(R.styleable.PullToRefresh_ptrHeaderTextColor)) { ColorStateList colors = attrs.getColorStateList(R.styleable.PullToRefresh_ptrHeaderTextColor); - setTextColor(null != colors ? colors : ColorStateList.valueOf(Color.BLACK)); + if (null != colors) { + setTextColor(colors); + } } if (attrs.hasValue(R.styleable.PullToRefresh_ptrHeaderSubTextColor)) { ColorStateList colors = attrs.getColorStateList(R.styleable.PullToRefresh_ptrHeaderSubTextColor); - setSubTextColor(null != colors ? colors : ColorStateList.valueOf(Color.BLACK)); + if (null != colors) { + setSubTextColor(colors); + } } // Try and get defined drawable from Attrs From 8faf9f00fa4522b617538e32f94c9f771fd1138f Mon Sep 17 00:00:00 2001 From: Chris Banes Date: Tue, 11 Dec 2012 16:14:01 +0000 Subject: [PATCH 067/120] Allow devs to disable the ListView extras I added so that the user can scroll normally while refreshing. --- library/res/values/attrs.xml | 1 + .../library/PullToRefreshListView.java | 71 +++++++++++-------- 2 files changed, 42 insertions(+), 30 deletions(-) diff --git a/library/res/values/attrs.xml b/library/res/values/attrs.xml index 5d05b76ed..bdeda26ac 100644 --- a/library/res/values/attrs.xml +++ b/library/res/values/attrs.xml @@ -29,6 +29,7 @@ + diff --git a/library/src/com/handmark/pulltorefresh/library/PullToRefreshListView.java b/library/src/com/handmark/pulltorefresh/library/PullToRefreshListView.java index 710609c90..fd3e7802e 100644 --- a/library/src/com/handmark/pulltorefresh/library/PullToRefreshListView.java +++ b/library/src/com/handmark/pulltorefresh/library/PullToRefreshListView.java @@ -41,6 +41,8 @@ public class PullToRefreshListView extends PullToRefreshAdapterViewBase Date: Tue, 11 Dec 2012 16:22:48 +0000 Subject: [PATCH 068/120] Fix Pulling when we're already refreshing --- .../pulltorefresh/library/PullToRefreshBase.java | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/library/src/com/handmark/pulltorefresh/library/PullToRefreshBase.java b/library/src/com/handmark/pulltorefresh/library/PullToRefreshBase.java index 9c1feb454..e2fa18a49 100644 --- a/library/src/com/handmark/pulltorefresh/library/PullToRefreshBase.java +++ b/library/src/com/handmark/pulltorefresh/library/PullToRefreshBase.java @@ -367,6 +367,12 @@ public final boolean onTouchEvent(MotionEvent event) { } } + // If we're already refreshing, just scroll back to the top + if (isRefreshing()) { + smoothScrollTo(0); + return true; + } + // If we haven't returned by here, then we're not in a state // to pull, so just reset setState(State.RESET); @@ -1013,8 +1019,8 @@ private void init(Context context, AttributeSet attrs) { } if (a.hasValue(R.styleable.PullToRefresh_ptrScrollingWhileRefreshingEnabled)) { - mScrollingWhileRefreshingEnabled = a.getBoolean(R.styleable.PullToRefresh_ptrScrollingWhileRefreshingEnabled, - false); + mScrollingWhileRefreshingEnabled = a.getBoolean( + R.styleable.PullToRefresh_ptrScrollingWhileRefreshingEnabled, false); } // Let the derivative classes have a go at handling attributes, then @@ -1099,7 +1105,7 @@ private void pullEvent() { setHeaderScroll(newScrollValue); - if (newScrollValue != 0) { + if (newScrollValue != 0 && !isRefreshing()) { float scale = Math.abs(newScrollValue) / (float) itemDimension; switch (mCurrentMode) { case PULL_FROM_END: From 94f96ca4e8fc96379a5e1f62aeab6c05ed9da9ce Mon Sep 17 00:00:00 2001 From: Chris Banes Date: Tue, 11 Dec 2012 16:26:51 +0000 Subject: [PATCH 069/120] Don't over scroll if we're currently refreshing --- .../com/handmark/pulltorefresh/library/OverscrollHelper.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/library/src/com/handmark/pulltorefresh/library/OverscrollHelper.java b/library/src/com/handmark/pulltorefresh/library/OverscrollHelper.java index 82da5e882..e35b25e47 100644 --- a/library/src/com/handmark/pulltorefresh/library/OverscrollHelper.java +++ b/library/src/com/handmark/pulltorefresh/library/OverscrollHelper.java @@ -118,8 +118,8 @@ public static void overScrollBy(final PullToRefreshBase view, final int delta break; } - // Check that OverScroll is enabled - if (view.isPullToRefreshOverScrollEnabled()) { + // Check that OverScroll is enabled and that we're not currently refreshing. + if (view.isPullToRefreshOverScrollEnabled() && !view.isRefreshing()) { final Mode mode = view.getMode(); // Check that Pull-to-Refresh is enabled, and the event isn't from From 11269edd35cd396ace74f6be6aa609abc42e3ab6 Mon Sep 17 00:00:00 2001 From: Chris Banes Date: Tue, 11 Dec 2012 16:38:48 +0000 Subject: [PATCH 070/120] Add Documenting Comments to Attr xml file --- library/res/values/attrs.xml | 36 +++++++++++++++++++++++++++++++++++- 1 file changed, 35 insertions(+), 1 deletion(-) diff --git a/library/res/values/attrs.xml b/library/res/values/attrs.xml index bdeda26ac..f185cdcdb 100644 --- a/library/res/values/attrs.xml +++ b/library/res/values/attrs.xml @@ -2,10 +2,20 @@ + + + + + + + + + + @@ -17,21 +27,45 @@ + + + + + + + + + + + + + + + + + + + + - + From d10ab41bb14fc343485b23e644b64dd5d2b82cde Mon Sep 17 00:00:00 2001 From: Chris Banes Date: Tue, 11 Dec 2012 16:40:54 +0000 Subject: [PATCH 071/120] Fix use of deprecated methods in sample --- .../samples/PullToRefreshListActivity.java | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/sample/src/com/handmark/pulltorefresh/samples/PullToRefreshListActivity.java b/sample/src/com/handmark/pulltorefresh/samples/PullToRefreshListActivity.java index a2fafbd7c..ec2a00644 100755 --- a/sample/src/com/handmark/pulltorefresh/samples/PullToRefreshListActivity.java +++ b/sample/src/com/handmark/pulltorefresh/samples/PullToRefreshListActivity.java @@ -126,8 +126,8 @@ protected void onPostExecute(String[] result) { public boolean onCreateOptionsMenu(Menu menu) { menu.add(0, MENU_MANUAL_REFRESH, 0, "Manual Refresh"); menu.add(0, MENU_DISABLE_SCROLL, 1, - mPullRefreshListView.isDisableScrollingWhileRefreshing() ? "Enable Scrolling while Refreshing" - : "Disable Scrolling while Refreshing"); + mPullRefreshListView.isScrollingWhileRefreshingEnabled() ? "Disable Scrolling while Refreshing" + : "Enable Scrolling while Refreshing"); menu.add(0, MENU_SET_MODE, 0, mPullRefreshListView.getMode() == Mode.BOTH ? "Change to MODE_PULL_DOWN" : "Change to MODE_PULL_BOTH"); menu.add(0, MENU_DEMO, 0, "Demo"); @@ -138,8 +138,8 @@ public boolean onCreateOptionsMenu(Menu menu) { public boolean onPrepareOptionsMenu(Menu menu) { MenuItem disableItem = menu.findItem(MENU_DISABLE_SCROLL); disableItem - .setTitle(mPullRefreshListView.isDisableScrollingWhileRefreshing() ? "Enable Scrolling while Refreshing" - : "Disable Scrolling while Refreshing"); + .setTitle(mPullRefreshListView.isScrollingWhileRefreshingEnabled() ? "Disable Scrolling while Refreshing" + : "Enable Scrolling while Refreshing"); MenuItem setModeItem = menu.findItem(MENU_SET_MODE); setModeItem.setTitle(mPullRefreshListView.getMode() == Mode.BOTH ? "Change to MODE_FROM_START" @@ -157,8 +157,8 @@ public boolean onOptionsItemSelected(MenuItem item) { mPullRefreshListView.setRefreshing(false); break; case MENU_DISABLE_SCROLL: - mPullRefreshListView.setDisableScrollingWhileRefreshing(!mPullRefreshListView - .isDisableScrollingWhileRefreshing()); + mPullRefreshListView.setScrollingWhileRefreshingEnabled(!mPullRefreshListView + .isScrollingWhileRefreshingEnabled()); break; case MENU_SET_MODE: mPullRefreshListView.setMode(mPullRefreshListView.getMode() == Mode.BOTH ? Mode.PULL_FROM_START From 4988cbdb3c3921e66eb153318a50774dc41e1e95 Mon Sep 17 00:00:00 2001 From: Chris Banes Date: Wed, 12 Dec 2012 09:21:56 +0000 Subject: [PATCH 072/120] Move all of the LoadingLayout customisation methods to a separate class. --- .../pulltorefresh/library/ILoadingLayout.java | 48 +++ .../pulltorefresh/library/IPullToRefresh.java | 111 ++----- .../library/PullToRefreshBase.java | 297 +++++++++++------- .../library/PullToRefreshListView.java | 76 ++--- 4 files changed, 284 insertions(+), 248 deletions(-) create mode 100644 library/src/com/handmark/pulltorefresh/library/ILoadingLayout.java diff --git a/library/src/com/handmark/pulltorefresh/library/ILoadingLayout.java b/library/src/com/handmark/pulltorefresh/library/ILoadingLayout.java new file mode 100644 index 000000000..587f6c1d7 --- /dev/null +++ b/library/src/com/handmark/pulltorefresh/library/ILoadingLayout.java @@ -0,0 +1,48 @@ +package com.handmark.pulltorefresh.library; + +import android.graphics.drawable.Drawable; + +public interface ILoadingLayout { + + /** + * Set Text to show when the Widget is refreshing + * setRefreshingLabel(releaseLabel, Mode.BOTH) + * + * @param refreshingLabel - CharSequence to display + */ + public void setRefreshingLabel(CharSequence refreshingLabel); + + /** + * Set Text to show when the Widget is being pulled, and will refresh when + * released. This is the same as calling + * setReleaseLabel(releaseLabel, Mode.BOTH) + * + * @param releaseLabel - CharSequence to display + */ + public void setReleaseLabel(CharSequence releaseLabel); + + /** + * Set Text to show when the Widget is being Pulled + * setPullLabel(releaseLabel, Mode.BOTH) + * + * @param pullLabel - CharSequence to display + */ + public void setPullLabel(CharSequence pullLabel); + + /** + * Set the Last Updated Text. This displayed under the main label when + * Pulling + * + * @param label - Label to set + */ + public void setLastUpdatedLabel(CharSequence label); + + /** + * Set the drawable used in the loading layout. This is the same as calling + * setLoadingDrawable(drawable, Mode.BOTH) + * + * @param drawable - Drawable to display + */ + public void setLoadingDrawable(Drawable drawable); + +} diff --git a/library/src/com/handmark/pulltorefresh/library/IPullToRefresh.java b/library/src/com/handmark/pulltorefresh/library/IPullToRefresh.java index 5fe6f5082..a06cdd7cf 100644 --- a/library/src/com/handmark/pulltorefresh/library/IPullToRefresh.java +++ b/library/src/com/handmark/pulltorefresh/library/IPullToRefresh.java @@ -15,7 +15,6 @@ *******************************************************************************/ package com.handmark.pulltorefresh.library; -import android.graphics.drawable.Drawable; import android.view.View; import android.view.animation.Interpolator; @@ -57,6 +56,34 @@ public interface IPullToRefresh { */ public boolean getFilterTouchEvents(); + /** + * Returns a proxy object which allows you to call methods on all of the + * LoadingLayouts (the Views which show when Pulling/Refreshing). + *

+ * You should not keep the result of this method any longer than you need + * it. + * + * @return Object which will proxy any calls you make on it, to all of the + * LoadingLayouts. + */ + public ILoadingLayout getLoadingLayoutProxy(); + + /** + * Returns a proxy object which allows you to call methods on the + * LoadingLayouts (the Views which show when Pulling/Refreshing). The actual + * LoadingLayout(s) which will be affected, are chosen by the parameters you + * give. + *

+ * You should not keep the result of this method any longer than you need + * it. + * + * @param includeStart - Whether to include the Start/Header Views + * @param includeEnd - Whether to include the End/Footer Views + * @return Object which will proxy any calls you make on it, to the + * LoadingLayouts included. + */ + public ILoadingLayout getLoadingLayoutProxy(boolean includeStart, boolean includeEnd); + /** * Get the mode that this view has been set to. If this returns * Mode.BOTH, you can use getCurrentMode() to @@ -138,32 +165,6 @@ public interface IPullToRefresh { */ public void setFilterTouchEvents(boolean filterEvents); - /** - * Set the Last Updated Text. This displayed under the main label when - * Pulling - * - * @param label - Label to set - */ - public void setLastUpdatedLabel(CharSequence label); - - /** - * Set the drawable used in the loading layout. This is the same as calling - * setLoadingDrawable(drawable, Mode.BOTH) - * - * @param drawable - Drawable to display - */ - public void setLoadingDrawable(Drawable drawable); - - /** - * Set the drawable used in the loading layout. - * - * @param drawable - Drawable to display - * @param mode - Controls which Header/Footer Views will be updated. - * Mode.BOTH will update all available, other values - * will update the relevant View. - */ - public void setLoadingDrawable(Drawable drawable, Mode mode); - /** * Set the mode of Pull-to-Refresh that this view will use. * @@ -193,24 +194,6 @@ public interface IPullToRefresh { */ public void setOnRefreshListener(OnRefreshListener2 listener); - /** - * Set Text to show when the Widget is being Pulled - * setPullLabel(releaseLabel, Mode.BOTH) - * - * @param pullLabel - CharSequence to display - */ - public void setPullLabel(CharSequence pullLabel); - - /** - * Set Text to show when the Widget is being Pulled - * - * @param pullLabel - CharSequence to display - * @param mode - Controls which Header/Footer Views will be updated. - * Mode.BOTH will update all available, other values - * will update the relevant View. - */ - public void setPullLabel(CharSequence pullLabel, Mode mode); - /** * Sets whether Overscroll support is enabled. This is different to * Android's standard Overscroll support (the edge-glow). This setting only @@ -235,44 +218,6 @@ public interface IPullToRefresh { */ public void setRefreshing(boolean doScroll); - /** - * Set Text to show when the Widget is refreshing - * setRefreshingLabel(releaseLabel, Mode.BOTH) - * - * @param refreshingLabel - CharSequence to display - */ - public void setRefreshingLabel(CharSequence refreshingLabel); - - /** - * Set Text to show when the Widget is refreshing - * - * @param refreshingLabel - CharSequence to display - * @param mode - Controls which Header/Footer Views will be updated. - * Mode.BOTH will update all available, other values - * will update the relevant View. - */ - public void setRefreshingLabel(CharSequence refreshingLabel, Mode mode); - - /** - * Set Text to show when the Widget is being pulled, and will refresh when - * released. This is the same as calling - * setReleaseLabel(releaseLabel, Mode.BOTH) - * - * @param releaseLabel - CharSequence to display - */ - public void setReleaseLabel(CharSequence releaseLabel); - - /** - * Set Text to show when the Widget is being pulled, and will refresh when - * released - * - * @param releaseLabel - CharSequence to display - * @param mode - Controls which Header/Footer Views will be updated. - * Mode.BOTH will update all available, other values - * will update the relevant View. - */ - public void setReleaseLabel(CharSequence releaseLabel, Mode mode); - /** * Sets the Animation Interpolator that is used for animated scrolling. * Defaults to a DecelerateInterpolator diff --git a/library/src/com/handmark/pulltorefresh/library/PullToRefreshBase.java b/library/src/com/handmark/pulltorefresh/library/PullToRefreshBase.java index e2fa18a49..8b2d7dd3d 100644 --- a/library/src/com/handmark/pulltorefresh/library/PullToRefreshBase.java +++ b/library/src/com/handmark/pulltorefresh/library/PullToRefreshBase.java @@ -15,6 +15,8 @@ *******************************************************************************/ package com.handmark.pulltorefresh.library; +import java.util.HashSet; + import android.content.Context; import android.content.res.TypedArray; import android.graphics.drawable.Drawable; @@ -168,6 +170,16 @@ public final boolean getFilterTouchEvents() { return mFilterTouchEvents; } + @Override + public ILoadingLayout getLoadingLayoutProxy() { + return getLoadingLayoutProxy(true, true); + } + + @Override + public ILoadingLayout getLoadingLayoutProxy(boolean includeStart, boolean includeEnd) { + return createLoadingLayoutProxy(includeStart, includeEnd); + } + @Override public final Mode getMode() { return mMode; @@ -402,35 +414,29 @@ public final void setFilterTouchEvents(boolean filterEvents) { mFilterTouchEvents = filterEvents; } - @Override + /** + * @deprecated You should now call this method on the result of + * {@link #getLoadingLayoutProxy()}. + */ public void setLastUpdatedLabel(CharSequence label) { - if (null != mHeaderLayout) { - mHeaderLayout.setSubHeaderText(label); - } - if (null != mFooterLayout) { - mFooterLayout.setSubHeaderText(label); - } - - // Refresh Height as it may have changed - refreshLoadingViewsSize(); + getLoadingLayoutProxy().setLastUpdatedLabel(label); } - @Override + /** + * @deprecated You should now call this method on the result of + * {@link #getLoadingLayoutProxy()}. + */ public void setLoadingDrawable(Drawable drawable) { - setLoadingDrawable(drawable, Mode.BOTH); + getLoadingLayoutProxy().setLoadingDrawable(drawable); } - @Override + /** + * @deprecated You should now call this method on the result of + * {@link #getLoadingLayoutProxy(boolean, boolean)}. + */ public void setLoadingDrawable(Drawable drawable, Mode mode) { - if (null != mHeaderLayout && mode.showHeaderLoadingLayout()) { - mHeaderLayout.setLoadingDrawable(drawable); - } - if (null != mFooterLayout && mode.showFooterLoadingLayout()) { - mFooterLayout.setLoadingDrawable(drawable); - } - - // The Loading Height may have changed, so refresh - refreshLoadingViewsSize(); + getLoadingLayoutProxy(mode.showHeaderLoadingLayout(), mode.showFooterLoadingLayout()).setLoadingDrawable( + drawable); } @Override @@ -465,19 +471,20 @@ public final void setOnRefreshListener(OnRefreshListener2 listener) { mOnRefreshListener = null; } - @Override + /** + * @deprecated You should now call this method on the result of + * {@link #getLoadingLayoutProxy()}. + */ public void setPullLabel(CharSequence pullLabel) { - setPullLabel(pullLabel, Mode.BOTH); + getLoadingLayoutProxy().setPullLabel(pullLabel); } - @Override + /** + * @deprecated You should now call this method on the result of + * {@link #getLoadingLayoutProxy(boolean, boolean)}. + */ public void setPullLabel(CharSequence pullLabel, Mode mode) { - if (null != mHeaderLayout && mode.showHeaderLoadingLayout()) { - mHeaderLayout.setPullLabel(pullLabel); - } - if (null != mFooterLayout && mode.showFooterLoadingLayout()) { - mFooterLayout.setPullLabel(pullLabel); - } + getLoadingLayoutProxy(mode.showHeaderLoadingLayout(), mode.showFooterLoadingLayout()).setPullLabel(pullLabel); } /** @@ -506,34 +513,38 @@ public final void setRefreshing(boolean doScroll) { } } - @Override + /** + * @deprecated You should now call this method on the result of + * {@link #getLoadingLayoutProxy()}. + */ public void setRefreshingLabel(CharSequence refreshingLabel) { - setRefreshingLabel(refreshingLabel, Mode.BOTH); + getLoadingLayoutProxy().setRefreshingLabel(refreshingLabel); } - @Override + /** + * @deprecated You should now call this method on the result of + * {@link #getLoadingLayoutProxy(boolean, boolean)}. + */ public void setRefreshingLabel(CharSequence refreshingLabel, Mode mode) { - if (null != mHeaderLayout && mode.showHeaderLoadingLayout()) { - mHeaderLayout.setRefreshingLabel(refreshingLabel); - } - if (null != mFooterLayout && mode.showFooterLoadingLayout()) { - mFooterLayout.setRefreshingLabel(refreshingLabel); - } + getLoadingLayoutProxy(mode.showHeaderLoadingLayout(), mode.showFooterLoadingLayout()).setRefreshingLabel( + refreshingLabel); } - @Override + /** + * @deprecated You should now call this method on the result of + * {@link #getLoadingLayoutProxy()}. + */ public void setReleaseLabel(CharSequence releaseLabel) { setReleaseLabel(releaseLabel, Mode.BOTH); } - @Override + /** + * @deprecated You should now call this method on the result of + * {@link #getLoadingLayoutProxy(boolean, boolean)}. + */ public void setReleaseLabel(CharSequence releaseLabel, Mode mode) { - if (null != mHeaderLayout && mode.showHeaderLoadingLayout()) { - mHeaderLayout.setReleaseLabel(releaseLabel); - } - if (null != mFooterLayout && mode.showFooterLoadingLayout()) { - mFooterLayout.setReleaseLabel(releaseLabel); - } + getLoadingLayoutProxy(mode.showHeaderLoadingLayout(), mode.showFooterLoadingLayout()).setReleaseLabel( + releaseLabel); } public void setScrollAnimationInterpolator(Interpolator interpolator) { @@ -640,6 +651,65 @@ void onReset() { resetHeader(); } + /** + * Re-measure the Loading Views height, and adjust internal padding as + * necessary + */ + final void refreshLoadingViewsSize() { + final int maximumPullScroll = (int) (getMaximumPullScroll() * 1.2f); + + mHeaderDimension = mFooterDimension = 0; + + int pLeft, pTop, pRight, pBottom; + pLeft = pTop = pRight = pBottom = 0; + + if (mMode.showHeaderLoadingLayout()) { + mHeaderLayout.resetForMeasure(); + measureView(mHeaderLayout); + + switch (getPullToRefreshScrollDirection()) { + case HORIZONTAL_SCROLL: + mHeaderDimension = mHeaderLayout.getMeasuredWidth(); + pLeft = -maximumPullScroll; + mHeaderLayout.adjustWidthUsingLeftPadding(maximumPullScroll); + break; + case VERTICAL_SCROLL: + default: + mHeaderDimension = mHeaderLayout.getMeasuredHeight(); + pTop = -maximumPullScroll; + mHeaderLayout.adjustHeightUsingTopPadding(maximumPullScroll); + break; + } + + // We need to re-measure with the new padding... + measureView(mHeaderLayout); + } + + if (mMode.showFooterLoadingLayout()) { + mFooterLayout.resetForMeasure(); + measureView(mFooterLayout); + + switch (getPullToRefreshScrollDirection()) { + case HORIZONTAL_SCROLL: + mFooterDimension = mFooterLayout.getMeasuredWidth(); + pRight = -maximumPullScroll; + mFooterLayout.adjustWidthUsingRightPadding(maximumPullScroll); + break; + case VERTICAL_SCROLL: + default: + mFooterDimension = mFooterLayout.getMeasuredHeight(); + pBottom = -maximumPullScroll; + mFooterLayout.adjustHeightUsingBottomPadding(maximumPullScroll); + break; + } + + // We need to re-measure with the new padding... + measureView(mFooterLayout); + } + + setPadding(pLeft, pTop, pRight, pBottom); + } + final void setState(State state, final boolean... params) { mState = state; if (DEBUG) { @@ -694,6 +764,23 @@ protected LoadingLayout createLoadingLayout(Context context, Mode mode, TypedArr return layout; } + /** + * Used internally for {@link #getLoadingLayoutProxy(boolean, boolean)}. + * Allows derivative classes to include any extra LoadingLayouts. + */ + protected LoadingLayoutProxy createLoadingLayoutProxy(final boolean includeStart, final boolean includeEnd) { + LoadingLayoutProxy proxy = new LoadingLayoutProxy(); + + if (includeStart && mMode.showHeaderLoadingLayout()) { + proxy.addLayout(mHeaderLayout); + } + if (includeEnd && mMode.showFooterLoadingLayout()) { + proxy.addLayout(mFooterLayout); + } + + return proxy; + } + /** * This is implemented by derived classes to return the created View. If you * need to use a custom View (such as a custom ListView), override this @@ -1147,65 +1234,6 @@ private int getMaximumPullScroll() { } } - /** - * Re-measure the Loading Views height, and adjust internal padding as - * necessary - */ - private void refreshLoadingViewsSize() { - final int maximumPullScroll = (int) (getMaximumPullScroll() * 1.2f); - - mHeaderDimension = mFooterDimension = 0; - - int pLeft, pTop, pRight, pBottom; - pLeft = pTop = pRight = pBottom = 0; - - if (mMode.showHeaderLoadingLayout()) { - mHeaderLayout.resetForMeasure(); - measureView(mHeaderLayout); - - switch (getPullToRefreshScrollDirection()) { - case HORIZONTAL_SCROLL: - mHeaderDimension = mHeaderLayout.getMeasuredWidth(); - pLeft = -maximumPullScroll; - mHeaderLayout.adjustWidthUsingLeftPadding(maximumPullScroll); - break; - case VERTICAL_SCROLL: - default: - mHeaderDimension = mHeaderLayout.getMeasuredHeight(); - pTop = -maximumPullScroll; - mHeaderLayout.adjustHeightUsingTopPadding(maximumPullScroll); - break; - } - - // We need to re-measure with the new padding... - measureView(mHeaderLayout); - } - - if (mMode.showFooterLoadingLayout()) { - mFooterLayout.resetForMeasure(); - measureView(mFooterLayout); - - switch (getPullToRefreshScrollDirection()) { - case HORIZONTAL_SCROLL: - mFooterDimension = mFooterLayout.getMeasuredWidth(); - pRight = -maximumPullScroll; - mFooterLayout.adjustWidthUsingRightPadding(maximumPullScroll); - break; - case VERTICAL_SCROLL: - default: - mFooterDimension = mFooterLayout.getMeasuredHeight(); - pBottom = -maximumPullScroll; - mFooterLayout.adjustHeightUsingBottomPadding(maximumPullScroll); - break; - } - - // We need to re-measure with the new padding... - measureView(mFooterLayout); - } - - setPadding(pLeft, pTop, pRight, pBottom); - } - /** * Smooth Scroll to position using the specific duration * @@ -1618,4 +1646,59 @@ static interface OnSmoothScrollFinishedListener { void onSmoothScrollFinished(); } + public class LoadingLayoutProxy implements ILoadingLayout { + + private final HashSet mLoadingLayouts; + + LoadingLayoutProxy() { + mLoadingLayouts = new HashSet(); + } + + void addLayout(LoadingLayout layout) { + if (null != layout) { + mLoadingLayouts.add(layout); + } + } + + @Override + public void setRefreshingLabel(CharSequence refreshingLabel) { + for (LoadingLayout layout : mLoadingLayouts) { + layout.setRefreshingLabel(refreshingLabel); + } + } + + @Override + public void setReleaseLabel(CharSequence label) { + for (LoadingLayout layout : mLoadingLayouts) { + layout.setRefreshingLabel(label); + } + } + + @Override + public void setPullLabel(CharSequence label) { + for (LoadingLayout layout : mLoadingLayouts) { + layout.setPullLabel(label); + } + } + + @Override + public void setLastUpdatedLabel(CharSequence label) { + for (LoadingLayout layout : mLoadingLayouts) { + layout.setSubHeaderText(label); + } + + refreshLoadingViewsSize(); + } + + @Override + public void setLoadingDrawable(Drawable drawable) { + for (LoadingLayout layout : mLoadingLayouts) { + layout.setLoadingDrawable(drawable); + } + + refreshLoadingViewsSize(); + } + + } + } diff --git a/library/src/com/handmark/pulltorefresh/library/PullToRefreshListView.java b/library/src/com/handmark/pulltorefresh/library/PullToRefreshListView.java index fd3e7802e..5a6afed44 100644 --- a/library/src/com/handmark/pulltorefresh/library/PullToRefreshListView.java +++ b/library/src/com/handmark/pulltorefresh/library/PullToRefreshListView.java @@ -19,7 +19,6 @@ import android.content.Context; import android.content.res.TypedArray; import android.graphics.Canvas; -import android.graphics.drawable.Drawable; import android.os.Build.VERSION; import android.os.Build.VERSION_CODES; import android.util.AttributeSet; @@ -64,63 +63,6 @@ public ContextMenuInfo getContextMenuInfo() { return ((InternalListView) getRefreshableView()).getContextMenuInfo(); } - @Override - public void setLastUpdatedLabel(CharSequence label) { - super.setLastUpdatedLabel(label); - - if (null != mHeaderLoadingView) { - mHeaderLoadingView.setSubHeaderText(label); - } - if (null != mFooterLoadingView) { - mFooterLoadingView.setSubHeaderText(label); - } - } - - @Override - public void setLoadingDrawable(Drawable drawable, Mode mode) { - super.setLoadingDrawable(drawable, mode); - - if (null != mHeaderLoadingView && mode.showHeaderLoadingLayout()) { - mHeaderLoadingView.setLoadingDrawable(drawable); - } - if (null != mFooterLoadingView && mode.showFooterLoadingLayout()) { - mFooterLoadingView.setLoadingDrawable(drawable); - } - } - - public void setPullLabel(CharSequence pullLabel, Mode mode) { - super.setPullLabel(pullLabel, mode); - - if (null != mHeaderLoadingView && mode.showHeaderLoadingLayout()) { - mHeaderLoadingView.setPullLabel(pullLabel); - } - if (null != mFooterLoadingView && mode.showFooterLoadingLayout()) { - mFooterLoadingView.setPullLabel(pullLabel); - } - } - - public void setRefreshingLabel(CharSequence refreshingLabel, Mode mode) { - super.setRefreshingLabel(refreshingLabel, mode); - - if (null != mHeaderLoadingView && mode.showHeaderLoadingLayout()) { - mHeaderLoadingView.setRefreshingLabel(refreshingLabel); - } - if (null != mFooterLoadingView && mode.showFooterLoadingLayout()) { - mFooterLoadingView.setRefreshingLabel(refreshingLabel); - } - } - - public void setReleaseLabel(CharSequence releaseLabel, Mode mode) { - super.setReleaseLabel(releaseLabel, mode); - - if (null != mHeaderLoadingView && mode.showHeaderLoadingLayout()) { - mHeaderLoadingView.setReleaseLabel(releaseLabel); - } - if (null != mFooterLoadingView && mode.showFooterLoadingLayout()) { - mFooterLoadingView.setReleaseLabel(releaseLabel); - } - } - @Override public final int getPullToRefreshScrollDirection() { return VERTICAL_SCROLL; @@ -247,6 +189,24 @@ void onReset() { super.onReset(); } + @Override + protected LoadingLayoutProxy createLoadingLayoutProxy(final boolean includeStart, final boolean includeEnd) { + LoadingLayoutProxy proxy = super.createLoadingLayoutProxy(includeStart, includeEnd); + + if (mListViewExtrasEnabled) { + final Mode mode = getMode(); + + if (includeStart && mode.showHeaderLoadingLayout()) { + proxy.addLayout(mHeaderLoadingView); + } + if (includeEnd && mode.showFooterLoadingLayout()) { + proxy.addLayout(mFooterLoadingView); + } + } + + return proxy; + } + protected ListView createListView(Context context, AttributeSet attrs) { final ListView lv; if (VERSION.SDK_INT >= VERSION_CODES.GINGERBREAD) { From ee18684bcee5bea29c61efb9e741ec811f1c0d1a Mon Sep 17 00:00:00 2001 From: Chris Banes Date: Wed, 12 Dec 2012 09:23:50 +0000 Subject: [PATCH 073/120] Make LoadingLayout implement the new ILoadingLayout --- .../pulltorefresh/library/internal/LoadingLayout.java | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/library/src/com/handmark/pulltorefresh/library/internal/LoadingLayout.java b/library/src/com/handmark/pulltorefresh/library/internal/LoadingLayout.java index e898f4921..efad6bfda 100644 --- a/library/src/com/handmark/pulltorefresh/library/internal/LoadingLayout.java +++ b/library/src/com/handmark/pulltorefresh/library/internal/LoadingLayout.java @@ -19,7 +19,6 @@ import android.content.Context; import android.content.res.ColorStateList; import android.content.res.TypedArray; -import android.graphics.Color; import android.graphics.drawable.AnimationDrawable; import android.graphics.drawable.Drawable; import android.text.TextUtils; @@ -34,12 +33,13 @@ import android.widget.ProgressBar; import android.widget.TextView; +import com.handmark.pulltorefresh.library.ILoadingLayout; import com.handmark.pulltorefresh.library.PullToRefreshBase; import com.handmark.pulltorefresh.library.PullToRefreshBase.Mode; import com.handmark.pulltorefresh.library.R; @SuppressLint("ViewConstructor") -public abstract class LoadingLayout extends LinearLayout { +public abstract class LoadingLayout extends LinearLayout implements ILoadingLayout { static final String LOG_TAG = "PullToRefresh-LoadingLayout"; @@ -238,6 +238,11 @@ public final void reset() { public void resetForMeasure() { resetPadding(); } + + @Override + public void setLastUpdatedLabel(CharSequence label) { + setSubHeaderText(label); + } public final void setLoadingDrawable(Drawable imageDrawable) { // Set Drawable From f01cf9a3433b220a1fc017a3b37d9b45c505a109 Mon Sep 17 00:00:00 2001 From: Chris Banes Date: Wed, 12 Dec 2012 09:28:42 +0000 Subject: [PATCH 074/120] Fix use of deprecated methods in sample --- .../pulltorefresh/samples/PullToRefreshListActivity.java | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/sample/src/com/handmark/pulltorefresh/samples/PullToRefreshListActivity.java b/sample/src/com/handmark/pulltorefresh/samples/PullToRefreshListActivity.java index ec2a00644..700185069 100755 --- a/sample/src/com/handmark/pulltorefresh/samples/PullToRefreshListActivity.java +++ b/sample/src/com/handmark/pulltorefresh/samples/PullToRefreshListActivity.java @@ -59,9 +59,11 @@ public void onCreate(Bundle savedInstanceState) { mPullRefreshListView.setOnRefreshListener(new OnRefreshListener() { @Override public void onRefresh(PullToRefreshBase refreshView) { - mPullRefreshListView.setLastUpdatedLabel(DateUtils.formatDateTime(getApplicationContext(), - System.currentTimeMillis(), DateUtils.FORMAT_SHOW_TIME | DateUtils.FORMAT_SHOW_DATE - | DateUtils.FORMAT_ABBREV_ALL)); + String label = DateUtils.formatDateTime(getApplicationContext(), System.currentTimeMillis(), + DateUtils.FORMAT_SHOW_TIME | DateUtils.FORMAT_SHOW_DATE | DateUtils.FORMAT_ABBREV_ALL); + + // Update the LastUpdatedLabel + refreshView.getLoadingLayoutProxy().setLastUpdatedLabel(label); // Do work to refresh the list here. new GetDataTask().execute(); From 57f796dc01f5322ae8a125c7ca1c1dc7059acc11 Mon Sep 17 00:00:00 2001 From: Chris Banes Date: Wed, 12 Dec 2012 09:37:07 +0000 Subject: [PATCH 075/120] Make newly add public methods final --- .../com/handmark/pulltorefresh/library/PullToRefreshBase.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/library/src/com/handmark/pulltorefresh/library/PullToRefreshBase.java b/library/src/com/handmark/pulltorefresh/library/PullToRefreshBase.java index 8b2d7dd3d..b1e018d5c 100644 --- a/library/src/com/handmark/pulltorefresh/library/PullToRefreshBase.java +++ b/library/src/com/handmark/pulltorefresh/library/PullToRefreshBase.java @@ -171,12 +171,12 @@ public final boolean getFilterTouchEvents() { } @Override - public ILoadingLayout getLoadingLayoutProxy() { + public final ILoadingLayout getLoadingLayoutProxy() { return getLoadingLayoutProxy(true, true); } @Override - public ILoadingLayout getLoadingLayoutProxy(boolean includeStart, boolean includeEnd) { + public final ILoadingLayout getLoadingLayoutProxy(boolean includeStart, boolean includeEnd) { return createLoadingLayoutProxy(includeStart, includeEnd); } From 01ff0678bb914eca979fc7d08660fcf22c10942c Mon Sep 17 00:00:00 2001 From: Chris Banes Date: Wed, 12 Dec 2012 10:00:38 +0000 Subject: [PATCH 076/120] Tidy-ups to code in 4988cbdb3c3921e66eb153318a50774dc41e1e95 --- .../pulltorefresh/library/ILoadingLayout.java | 43 ++++--- .../library/LoadingLayoutProxy.java | 72 +++++++++++ .../library/PullToRefreshBase.java | 59 +-------- .../library/internal/LoadingLayout.java | 116 +++++++++--------- 4 files changed, 156 insertions(+), 134 deletions(-) create mode 100644 library/src/com/handmark/pulltorefresh/library/LoadingLayoutProxy.java diff --git a/library/src/com/handmark/pulltorefresh/library/ILoadingLayout.java b/library/src/com/handmark/pulltorefresh/library/ILoadingLayout.java index 587f6c1d7..ff2a95722 100644 --- a/library/src/com/handmark/pulltorefresh/library/ILoadingLayout.java +++ b/library/src/com/handmark/pulltorefresh/library/ILoadingLayout.java @@ -1,25 +1,25 @@ package com.handmark.pulltorefresh.library; +import android.graphics.Typeface; import android.graphics.drawable.Drawable; public interface ILoadingLayout { /** - * Set Text to show when the Widget is refreshing - * setRefreshingLabel(releaseLabel, Mode.BOTH) + * Set the Last Updated Text. This displayed under the main label when + * Pulling * - * @param refreshingLabel - CharSequence to display + * @param label - Label to set */ - public void setRefreshingLabel(CharSequence refreshingLabel); + public void setLastUpdatedLabel(CharSequence label); /** - * Set Text to show when the Widget is being pulled, and will refresh when - * released. This is the same as calling - * setReleaseLabel(releaseLabel, Mode.BOTH) + * Set the drawable used in the loading layout. This is the same as calling + * setLoadingDrawable(drawable, Mode.BOTH) * - * @param releaseLabel - CharSequence to display + * @param drawable - Drawable to display */ - public void setReleaseLabel(CharSequence releaseLabel); + public void setLoadingDrawable(Drawable drawable); /** * Set Text to show when the Widget is being Pulled @@ -30,19 +30,28 @@ public interface ILoadingLayout { public void setPullLabel(CharSequence pullLabel); /** - * Set the Last Updated Text. This displayed under the main label when - * Pulling + * Set Text to show when the Widget is refreshing + * setRefreshingLabel(releaseLabel, Mode.BOTH) * - * @param label - Label to set + * @param refreshingLabel - CharSequence to display */ - public void setLastUpdatedLabel(CharSequence label); + public void setRefreshingLabel(CharSequence refreshingLabel); /** - * Set the drawable used in the loading layout. This is the same as calling - * setLoadingDrawable(drawable, Mode.BOTH) + * Set Text to show when the Widget is being pulled, and will refresh when + * released. This is the same as calling + * setReleaseLabel(releaseLabel, Mode.BOTH) * - * @param drawable - Drawable to display + * @param releaseLabel - CharSequence to display */ - public void setLoadingDrawable(Drawable drawable); + public void setReleaseLabel(CharSequence releaseLabel); + + /** + * Set's the Sets the typeface and style in which the text should be + * displayed. Please see + * {@link android.widget.TextView#setTypeface(Typeface) + * TextView#setTypeface(Typeface)}. + */ + public void setTextTypeface(Typeface tf); } diff --git a/library/src/com/handmark/pulltorefresh/library/LoadingLayoutProxy.java b/library/src/com/handmark/pulltorefresh/library/LoadingLayoutProxy.java new file mode 100644 index 000000000..ef26a2486 --- /dev/null +++ b/library/src/com/handmark/pulltorefresh/library/LoadingLayoutProxy.java @@ -0,0 +1,72 @@ +package com.handmark.pulltorefresh.library; + +import java.util.HashSet; + +import android.graphics.Typeface; +import android.graphics.drawable.Drawable; + +import com.handmark.pulltorefresh.library.internal.LoadingLayout; + +public class LoadingLayoutProxy implements ILoadingLayout { + + private final PullToRefreshBase mPullToRefreshView; + private final HashSet mLoadingLayouts; + + LoadingLayoutProxy(PullToRefreshBase pullToRefreshView) { + mPullToRefreshView = pullToRefreshView; + mLoadingLayouts = new HashSet(); + } + + void addLayout(LoadingLayout layout) { + if (null != layout) { + mLoadingLayouts.add(layout); + } + } + + @Override + public void setLastUpdatedLabel(CharSequence label) { + for (LoadingLayout layout : mLoadingLayouts) { + layout.setLastUpdatedLabel(label); + } + + mPullToRefreshView.refreshLoadingViewsSize(); + } + + @Override + public void setLoadingDrawable(Drawable drawable) { + for (LoadingLayout layout : mLoadingLayouts) { + layout.setLoadingDrawable(drawable); + } + + mPullToRefreshView.refreshLoadingViewsSize(); + } + + @Override + public void setRefreshingLabel(CharSequence refreshingLabel) { + for (LoadingLayout layout : mLoadingLayouts) { + layout.setRefreshingLabel(refreshingLabel); + } + } + + @Override + public void setPullLabel(CharSequence label) { + for (LoadingLayout layout : mLoadingLayouts) { + layout.setPullLabel(label); + } + } + + @Override + public void setReleaseLabel(CharSequence label) { + for (LoadingLayout layout : mLoadingLayouts) { + layout.setRefreshingLabel(label); + } + } + + public void setTextTypeface(Typeface tf) { + for (LoadingLayout layout : mLoadingLayouts) { + layout.setTextTypeface(tf); + } + + mPullToRefreshView.refreshLoadingViewsSize(); + } +} diff --git a/library/src/com/handmark/pulltorefresh/library/PullToRefreshBase.java b/library/src/com/handmark/pulltorefresh/library/PullToRefreshBase.java index b1e018d5c..978c597ac 100644 --- a/library/src/com/handmark/pulltorefresh/library/PullToRefreshBase.java +++ b/library/src/com/handmark/pulltorefresh/library/PullToRefreshBase.java @@ -15,8 +15,6 @@ *******************************************************************************/ package com.handmark.pulltorefresh.library; -import java.util.HashSet; - import android.content.Context; import android.content.res.TypedArray; import android.graphics.drawable.Drawable; @@ -769,7 +767,7 @@ protected LoadingLayout createLoadingLayout(Context context, Mode mode, TypedArr * Allows derivative classes to include any extra LoadingLayouts. */ protected LoadingLayoutProxy createLoadingLayoutProxy(final boolean includeStart, final boolean includeEnd) { - LoadingLayoutProxy proxy = new LoadingLayoutProxy(); + LoadingLayoutProxy proxy = new LoadingLayoutProxy(this); if (includeStart && mMode.showHeaderLoadingLayout()) { proxy.addLayout(mHeaderLayout); @@ -1646,59 +1644,4 @@ static interface OnSmoothScrollFinishedListener { void onSmoothScrollFinished(); } - public class LoadingLayoutProxy implements ILoadingLayout { - - private final HashSet mLoadingLayouts; - - LoadingLayoutProxy() { - mLoadingLayouts = new HashSet(); - } - - void addLayout(LoadingLayout layout) { - if (null != layout) { - mLoadingLayouts.add(layout); - } - } - - @Override - public void setRefreshingLabel(CharSequence refreshingLabel) { - for (LoadingLayout layout : mLoadingLayouts) { - layout.setRefreshingLabel(refreshingLabel); - } - } - - @Override - public void setReleaseLabel(CharSequence label) { - for (LoadingLayout layout : mLoadingLayouts) { - layout.setRefreshingLabel(label); - } - } - - @Override - public void setPullLabel(CharSequence label) { - for (LoadingLayout layout : mLoadingLayouts) { - layout.setPullLabel(label); - } - } - - @Override - public void setLastUpdatedLabel(CharSequence label) { - for (LoadingLayout layout : mLoadingLayouts) { - layout.setSubHeaderText(label); - } - - refreshLoadingViewsSize(); - } - - @Override - public void setLoadingDrawable(Drawable drawable) { - for (LoadingLayout layout : mLoadingLayouts) { - layout.setLoadingDrawable(drawable); - } - - refreshLoadingViewsSize(); - } - - } - } diff --git a/library/src/com/handmark/pulltorefresh/library/internal/LoadingLayout.java b/library/src/com/handmark/pulltorefresh/library/internal/LoadingLayout.java index efad6bfda..fdf46fc30 100644 --- a/library/src/com/handmark/pulltorefresh/library/internal/LoadingLayout.java +++ b/library/src/com/handmark/pulltorefresh/library/internal/LoadingLayout.java @@ -19,6 +19,7 @@ import android.content.Context; import android.content.res.ColorStateList; import android.content.res.TypedArray; +import android.graphics.Typeface; import android.graphics.drawable.AnimationDrawable; import android.graphics.drawable.Drawable; import android.text.TextUtils; @@ -172,6 +173,26 @@ public LoadingLayout(Context context, final Mode mode, final int scrollDirection reset(); } + public final void adjustHeightUsingBottomPadding(final int height) { + setPadding(getPaddingLeft(), getPaddingTop(), getPaddingRight(), getPaddingBottom() + height + - getMeasuredHeight()); + } + + public final void adjustHeightUsingTopPadding(final int height) { + setPadding(getPaddingLeft(), getPaddingTop() + height - getMeasuredHeight(), getPaddingRight(), + getPaddingBottom()); + } + + public final void adjustWidthUsingLeftPadding(final int width) { + setPadding(getPaddingLeft() + width - getMeasuredWidth(), getPaddingTop(), getPaddingRight(), + getPaddingBottom()); + } + + public final void adjustWidthUsingRightPadding(final int width) { + setPadding(getPaddingLeft(), getPaddingTop(), getPaddingRight() + width - getMeasuredWidth(), + getPaddingBottom()); + } + public final void onPull(float scaleOfLayout) { if (!mUseIntrinsicAnimation) { onPullImpl(scaleOfLayout); @@ -235,10 +256,10 @@ public final void reset() { } } - public void resetForMeasure() { + public final void resetForMeasure() { resetPadding(); } - + @Override public void setLastUpdatedLabel(CharSequence label) { setSubHeaderText(label); @@ -265,7 +286,36 @@ public void setReleaseLabel(CharSequence releaseLabel) { mReleaseLabel = releaseLabel; } - public void setSubHeaderText(CharSequence label) { + @Override + public void setTextTypeface(Typeface tf) { + mHeaderText.setTypeface(tf); + } + + /** + * Callbacks for derivative Layouts + */ + + protected abstract int getDefaultDrawableResId(); + + protected abstract void onLoadingDrawableSet(Drawable imageDrawable); + + protected abstract void onPullImpl(float scaleOfLayout); + + protected abstract void pullToRefreshImpl(); + + protected abstract void refreshingImpl(); + + protected abstract void releaseToRefreshImpl(); + + protected abstract void resetImpl(); + + private void resetPadding() { + final int tbPadding = getResources().getDimensionPixelSize(R.dimen.header_footer_top_bottom_padding); + final int lrPadding = getResources().getDimensionPixelSize(R.dimen.header_footer_left_right_padding); + setPadding(lrPadding, tbPadding, lrPadding, tbPadding); + } + + private void setSubHeaderText(CharSequence label) { if (null != mSubHeaderText) { if (TextUtils.isEmpty(label)) { mSubHeaderText.setVisibility(View.GONE); @@ -276,23 +326,19 @@ public void setSubHeaderText(CharSequence label) { } } - public void setSubTextAppearance(int value) { + private void setSubTextAppearance(int value) { if (null != mSubHeaderText) { mSubHeaderText.setTextAppearance(getContext(), value); } } - public void setSubTextColor(ColorStateList color) { + private void setSubTextColor(ColorStateList color) { if (null != mSubHeaderText) { mSubHeaderText.setTextColor(color); } } - public void setSubTextColor(int color) { - setSubTextColor(ColorStateList.valueOf(color)); - } - - public void setTextAppearance(int value) { + private void setTextAppearance(int value) { if (null != mHeaderText) { mHeaderText.setTextAppearance(getContext(), value); } @@ -301,7 +347,7 @@ public void setTextAppearance(int value) { } } - public void setTextColor(ColorStateList color) { + private void setTextColor(ColorStateList color) { if (null != mHeaderText) { mHeaderText.setTextColor(color); } @@ -310,52 +356,4 @@ public void setTextColor(ColorStateList color) { } } - public void setTextColor(int color) { - setTextColor(ColorStateList.valueOf(color)); - } - - /** - * Callbacks for derivative Layouts - */ - - protected abstract int getDefaultDrawableResId(); - - protected abstract void onLoadingDrawableSet(Drawable imageDrawable); - - protected abstract void onPullImpl(float scaleOfLayout); - - protected abstract void pullToRefreshImpl(); - - protected abstract void refreshingImpl(); - - protected abstract void releaseToRefreshImpl(); - - protected abstract void resetImpl(); - - public void adjustHeightUsingTopPadding(final int height) { - setPadding(getPaddingLeft(), getPaddingTop() + height - getMeasuredHeight(), getPaddingRight(), - getPaddingBottom()); - } - - public void adjustHeightUsingBottomPadding(final int height) { - setPadding(getPaddingLeft(), getPaddingTop(), getPaddingRight(), getPaddingBottom() + height - - getMeasuredHeight()); - } - - public void adjustWidthUsingLeftPadding(final int width) { - setPadding(getPaddingLeft() + width - getMeasuredWidth(), getPaddingTop(), getPaddingRight(), - getPaddingBottom()); - } - - public void adjustWidthUsingRightPadding(final int width) { - setPadding(getPaddingLeft(), getPaddingTop(), getPaddingRight() + width - getMeasuredWidth(), - getPaddingBottom()); - } - - private void resetPadding() { - final int tbPadding = getResources().getDimensionPixelSize(R.dimen.header_footer_top_bottom_padding); - final int lrPadding = getResources().getDimensionPixelSize(R.dimen.header_footer_left_right_padding); - setPadding(lrPadding, tbPadding, lrPadding, tbPadding); - } - } From c1fa9ba419419c952bf9e254986e34c888a512f0 Mon Sep 17 00:00:00 2001 From: Khaled alHabache Date: Thu, 13 Dec 2012 02:16:06 +0300 Subject: [PATCH 077/120] a better sample for ExpandableListActivitiy --- .../PullToRefreshExpandableListActivity.java | 17 ++++++----------- 1 file changed, 6 insertions(+), 11 deletions(-) diff --git a/sample/src/com/handmark/pulltorefresh/samples/PullToRefreshExpandableListActivity.java b/sample/src/com/handmark/pulltorefresh/samples/PullToRefreshExpandableListActivity.java index d50c44145..45e81504b 100644 --- a/sample/src/com/handmark/pulltorefresh/samples/PullToRefreshExpandableListActivity.java +++ b/sample/src/com/handmark/pulltorefresh/samples/PullToRefreshExpandableListActivity.java @@ -16,9 +16,7 @@ package com.handmark.pulltorefresh.samples; import java.util.ArrayList; -import java.util.Arrays; import java.util.HashMap; -import java.util.LinkedList; import java.util.List; import java.util.Map; @@ -34,7 +32,7 @@ public final class PullToRefreshExpandableListActivity extends ExpandableListActivity { private static final String KEY = "key"; - private LinkedList mListItems, mGroupItems; + private List> groupData = new ArrayList>(); private PullToRefreshExpandableListView mPullRefreshListView; private SimpleExpandableListAdapter mAdapter; @@ -55,12 +53,7 @@ public void onRefresh(PullToRefreshBase refreshView) { } }); - mListItems = new LinkedList(); - mListItems.addAll(Arrays.asList(mChildStrings)); - mGroupItems = new LinkedList(); - mGroupItems.addAll(Arrays.asList(mGroupStrings)); - List> groupData = new ArrayList>(); List>> childData = new ArrayList>>(); for (String group : mGroupStrings) { Map groupMap1 = new HashMap(); @@ -96,7 +89,9 @@ protected String[] doInBackground(Void... params) { @Override protected void onPostExecute(String[] result) { - mListItems.addFirst("Added after refresh..."); + Map newMap = new HashMap(); + newMap.put(KEY, "Added after refresh..."); + groupData.add(newMap); mAdapter.notifyDataSetChanged(); // Call onRefreshComplete when the list has been refreshed. @@ -106,8 +101,8 @@ protected void onPostExecute(String[] result) { } } - private final String[] mChildStrings = { "Child One", "Child Two", "Child Three", "Child Four", "Child Five", + private String[] mChildStrings = { "Child One", "Child Two", "Child Three", "Child Four", "Child Five", "Child Six" }; - private final String[] mGroupStrings = { "Group One", "Group Two", "Group Three" }; + private String[] mGroupStrings = { "Group One", "Group Two", "Group Three" }; } From 901a200d100f4c6693c9107c18381dc7b7b2e750 Mon Sep 17 00:00:00 2001 From: Chris Banes Date: Thu, 13 Dec 2012 12:13:27 +0000 Subject: [PATCH 078/120] Fix Code Style Formatting --- .../pulltorefresh/library/OverscrollHelper.java | 3 ++- .../library/PullToRefreshExpandableListView.java | 4 ++-- .../library/PullToRefreshGridView.java | 4 ++-- .../library/PullToRefreshHorizontalScrollView.java | 4 ++-- .../library/PullToRefreshScrollView.java | 4 ++-- .../library/PullToRefreshWebView.java | 14 ++++++-------- .../library/extras/PullToRefreshWebView2.java | 7 ++++--- .../library/extras/SoundPullEventListener.java | 6 +++--- .../library/internal/EmptyViewMethodAccessor.java | 12 +++++------- 9 files changed, 28 insertions(+), 30 deletions(-) diff --git a/library/src/com/handmark/pulltorefresh/library/OverscrollHelper.java b/library/src/com/handmark/pulltorefresh/library/OverscrollHelper.java index e35b25e47..852f35c2d 100644 --- a/library/src/com/handmark/pulltorefresh/library/OverscrollHelper.java +++ b/library/src/com/handmark/pulltorefresh/library/OverscrollHelper.java @@ -118,7 +118,8 @@ public static void overScrollBy(final PullToRefreshBase view, final int delta break; } - // Check that OverScroll is enabled and that we're not currently refreshing. + // Check that OverScroll is enabled and that we're not currently + // refreshing. if (view.isPullToRefreshOverScrollEnabled() && !view.isRefreshing()) { final Mode mode = view.getMode(); diff --git a/library/src/com/handmark/pulltorefresh/library/PullToRefreshExpandableListView.java b/library/src/com/handmark/pulltorefresh/library/PullToRefreshExpandableListView.java index b66e089ae..312a91b36 100644 --- a/library/src/com/handmark/pulltorefresh/library/PullToRefreshExpandableListView.java +++ b/library/src/com/handmark/pulltorefresh/library/PullToRefreshExpandableListView.java @@ -100,8 +100,8 @@ public InternalExpandableListViewSDK9(Context context, AttributeSet attrs) { 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); + final boolean returnValue = super.overScrollBy(deltaX, deltaY, scrollX, scrollY, scrollRangeX, + scrollRangeY, maxOverScrollX, maxOverScrollY, isTouchEvent); // Does all of the hard work... OverscrollHelper.overScrollBy(PullToRefreshExpandableListView.this, deltaX, scrollX, deltaY, scrollY, diff --git a/library/src/com/handmark/pulltorefresh/library/PullToRefreshGridView.java b/library/src/com/handmark/pulltorefresh/library/PullToRefreshGridView.java index dea4d08c4..3c739eefa 100644 --- a/library/src/com/handmark/pulltorefresh/library/PullToRefreshGridView.java +++ b/library/src/com/handmark/pulltorefresh/library/PullToRefreshGridView.java @@ -101,8 +101,8 @@ public InternalGridViewSDK9(Context context, AttributeSet attrs) { 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); + final boolean returnValue = super.overScrollBy(deltaX, deltaY, scrollX, scrollY, scrollRangeX, + scrollRangeY, maxOverScrollX, maxOverScrollY, isTouchEvent); // Does all of the hard work... OverscrollHelper.overScrollBy(PullToRefreshGridView.this, deltaX, scrollX, deltaY, scrollY, isTouchEvent); diff --git a/library/src/com/handmark/pulltorefresh/library/PullToRefreshHorizontalScrollView.java b/library/src/com/handmark/pulltorefresh/library/PullToRefreshHorizontalScrollView.java index e64005b4b..d98b3eb55 100644 --- a/library/src/com/handmark/pulltorefresh/library/PullToRefreshHorizontalScrollView.java +++ b/library/src/com/handmark/pulltorefresh/library/PullToRefreshHorizontalScrollView.java @@ -85,8 +85,8 @@ public InternalHorizontalScrollViewSDK9(Context context, AttributeSet attrs) { 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); + final boolean returnValue = super.overScrollBy(deltaX, deltaY, scrollX, scrollY, scrollRangeX, + scrollRangeY, maxOverScrollX, maxOverScrollY, isTouchEvent); // Does all of the hard work... OverscrollHelper.overScrollBy(PullToRefreshHorizontalScrollView.this, deltaX, scrollX, deltaY, scrollY, diff --git a/library/src/com/handmark/pulltorefresh/library/PullToRefreshScrollView.java b/library/src/com/handmark/pulltorefresh/library/PullToRefreshScrollView.java index 2b5a80461..2b7261427 100644 --- a/library/src/com/handmark/pulltorefresh/library/PullToRefreshScrollView.java +++ b/library/src/com/handmark/pulltorefresh/library/PullToRefreshScrollView.java @@ -84,8 +84,8 @@ public InternalScrollViewSDK9(Context context, AttributeSet attrs) { 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); + final boolean returnValue = super.overScrollBy(deltaX, deltaY, scrollX, scrollY, scrollRangeX, + scrollRangeY, maxOverScrollX, maxOverScrollY, isTouchEvent); // Does all of the hard work... OverscrollHelper.overScrollBy(PullToRefreshScrollView.this, deltaX, scrollX, deltaY, scrollY, diff --git a/library/src/com/handmark/pulltorefresh/library/PullToRefreshWebView.java b/library/src/com/handmark/pulltorefresh/library/PullToRefreshWebView.java index 046bb8e44..c43dd853b 100644 --- a/library/src/com/handmark/pulltorefresh/library/PullToRefreshWebView.java +++ b/library/src/com/handmark/pulltorefresh/library/PullToRefreshWebView.java @@ -147,21 +147,19 @@ public InternalWebViewSDK9(Context context, AttributeSet attrs) { 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); + 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); + 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, FloatMath.floor( - mRefreshableView.getContentHeight() * mRefreshableView.getScale()) - - (getHeight() - getPaddingBottom() - - getPaddingTop())); + return (int) Math.max(0, FloatMath.floor(mRefreshableView.getContentHeight() * mRefreshableView.getScale()) + - (getHeight() - getPaddingBottom() - getPaddingTop())); } } } diff --git a/library/src/com/handmark/pulltorefresh/library/extras/PullToRefreshWebView2.java b/library/src/com/handmark/pulltorefresh/library/extras/PullToRefreshWebView2.java index cb8acf65e..781920374 100644 --- a/library/src/com/handmark/pulltorefresh/library/extras/PullToRefreshWebView2.java +++ b/library/src/com/handmark/pulltorefresh/library/extras/PullToRefreshWebView2.java @@ -44,18 +44,19 @@ * can happen, and return the result via the callback mechanism. An example can * be seen below: *

+ * *

  * function isReadyForPullDown() {
  *   var result = ...  // Probably using the .scrollTop DOM attribute
  *   ptr.isReadyForPullDownResponse(result);
  * }
- *
+ * 
  * function isReadyForPullUp() {
  *   var result = ...  // Probably using the .scrollBottom DOM attribute
  *   ptr.isReadyForPullUpResponse(result);
  * }
  * 
- * + * * @author Chris Banes */ public class PullToRefreshWebView2 extends PullToRefreshWebView { @@ -115,7 +116,7 @@ protected boolean isReadyForPullEnd() { /** * Used for response from Javascript - * + * * @author Chris Banes */ final class JsValueCallback { diff --git a/library/src/com/handmark/pulltorefresh/library/extras/SoundPullEventListener.java b/library/src/com/handmark/pulltorefresh/library/extras/SoundPullEventListener.java index fb483c449..a7aac306a 100644 --- a/library/src/com/handmark/pulltorefresh/library/extras/SoundPullEventListener.java +++ b/library/src/com/handmark/pulltorefresh/library/extras/SoundPullEventListener.java @@ -34,7 +34,7 @@ public class SoundPullEventListener implements PullToRefreshBase /** * Constructor - * + * * @param context - Context */ public SoundPullEventListener(Context context) { @@ -57,10 +57,10 @@ public final void onPullEvent(PullToRefreshBase refreshView, State event, Mod *

* If you've already set a sound for a certain event, and add another sound * for that event, only the new sound will be played. - * + * * @param event - The event for which the sound will be played. * @param resId - Resource Id of the sound file to be played (e.g. - * R.raw.pull_sound) + * R.raw.pull_sound) */ public void addSoundEvent(State event, int resId) { mSoundMap.put(event, resId); diff --git a/library/src/com/handmark/pulltorefresh/library/internal/EmptyViewMethodAccessor.java b/library/src/com/handmark/pulltorefresh/library/internal/EmptyViewMethodAccessor.java index 8785829e5..369f21e87 100644 --- a/library/src/com/handmark/pulltorefresh/library/internal/EmptyViewMethodAccessor.java +++ b/library/src/com/handmark/pulltorefresh/library/internal/EmptyViewMethodAccessor.java @@ -20,25 +20,23 @@ /** * Interface that allows PullToRefreshBase to hijack the call to * AdapterView.setEmptyView() - * + * * @author chris */ public interface EmptyViewMethodAccessor { /** * Calls upto AdapterView.setEmptyView() - * - * @param emptyView - - * to set as Empty View + * + * @param emptyView - to set as Empty View */ public void setEmptyViewInternal(View emptyView); /** * Should call PullToRefreshBase.setEmptyView() which will then * automatically call through to setEmptyViewInternal() - * - * @param emptyView - - * to set as Empty View + * + * @param emptyView - to set as Empty View */ public void setEmptyView(View emptyView); From 3753787a223d4ef4b50b52b77e01402c31af88b2 Mon Sep 17 00:00:00 2001 From: Chris Banes Date: Thu, 13 Dec 2012 12:31:57 +0000 Subject: [PATCH 079/120] Fix formatting from c1fa9ba419419c952bf9e254986e34c888a512f0 --- .../samples/PullToRefreshExpandableListActivity.java | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/sample/src/com/handmark/pulltorefresh/samples/PullToRefreshExpandableListActivity.java b/sample/src/com/handmark/pulltorefresh/samples/PullToRefreshExpandableListActivity.java index 45e81504b..c071df51a 100644 --- a/sample/src/com/handmark/pulltorefresh/samples/PullToRefreshExpandableListActivity.java +++ b/sample/src/com/handmark/pulltorefresh/samples/PullToRefreshExpandableListActivity.java @@ -53,7 +53,6 @@ public void onRefresh(PullToRefreshBase refreshView) { } }); - List>> childData = new ArrayList>>(); for (String group : mGroupStrings) { Map groupMap1 = new HashMap(); @@ -90,7 +89,7 @@ protected String[] doInBackground(Void... params) { @Override protected void onPostExecute(String[] result) { Map newMap = new HashMap(); - newMap.put(KEY, "Added after refresh..."); + newMap.put(KEY, "Added after refresh..."); groupData.add(newMap); mAdapter.notifyDataSetChanged(); @@ -101,8 +100,7 @@ protected void onPostExecute(String[] result) { } } - private String[] mChildStrings = { "Child One", "Child Two", "Child Three", "Child Four", "Child Five", - "Child Six" }; + private String[] mChildStrings = { "Child One", "Child Two", "Child Three", "Child Four", "Child Five", "Child Six" }; private String[] mGroupStrings = { "Group One", "Group Two", "Group Three" }; } From 4f1ed057a78d754fd0819d229342c902a18bccb6 Mon Sep 17 00:00:00 2001 From: Chris Banes Date: Thu, 13 Dec 2012 12:50:20 +0000 Subject: [PATCH 080/120] Fix NPE from 3753787a223d4ef4b50b52b77e01402c31af88b2 --- .../PullToRefreshExpandableListActivity.java | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/sample/src/com/handmark/pulltorefresh/samples/PullToRefreshExpandableListActivity.java b/sample/src/com/handmark/pulltorefresh/samples/PullToRefreshExpandableListActivity.java index c071df51a..05de38c82 100644 --- a/sample/src/com/handmark/pulltorefresh/samples/PullToRefreshExpandableListActivity.java +++ b/sample/src/com/handmark/pulltorefresh/samples/PullToRefreshExpandableListActivity.java @@ -32,7 +32,10 @@ public final class PullToRefreshExpandableListActivity extends ExpandableListActivity { private static final String KEY = "key"; + private List> groupData = new ArrayList>(); + private List>> childData = new ArrayList>>(); + private PullToRefreshExpandableListView mPullRefreshListView; private SimpleExpandableListAdapter mAdapter; @@ -53,7 +56,6 @@ public void onRefresh(PullToRefreshBase refreshView) { } }); - List>> childData = new ArrayList>>(); for (String group : mGroupStrings) { Map groupMap1 = new HashMap(); groupData.add(groupMap1); @@ -91,6 +93,15 @@ protected void onPostExecute(String[] result) { Map newMap = new HashMap(); newMap.put(KEY, "Added after refresh..."); groupData.add(newMap); + + List> childList = new ArrayList>(); + for (String string : mChildStrings) { + Map childMap = new HashMap(); + childMap.put(KEY, string); + childList.add(childMap); + } + childData.add(childList); + mAdapter.notifyDataSetChanged(); // Call onRefreshComplete when the list has been refreshed. From 7694d1604bcebfd704c321c3fc9144dbaddc7f0a Mon Sep 17 00:00:00 2001 From: Chris Banes Date: Thu, 13 Dec 2012 14:26:46 +0000 Subject: [PATCH 081/120] Try and flatten the LoadingLayouts --- .../pull_to_refresh_header_vertical.xml | 53 ------------------- .../pull_to_refresh_header_horizontal.xml | 28 +++++----- .../pull_to_refresh_header_vertical.xml | 9 ++-- library/res/values/dimens.xml | 7 ++- .../library/internal/LoadingLayout.java | 13 +++-- 5 files changed, 26 insertions(+), 84 deletions(-) delete mode 100644 library/res/layout-large/pull_to_refresh_header_vertical.xml diff --git a/library/res/layout-large/pull_to_refresh_header_vertical.xml b/library/res/layout-large/pull_to_refresh_header_vertical.xml deleted file mode 100644 index 1840751ea..000000000 --- a/library/res/layout-large/pull_to_refresh_header_vertical.xml +++ /dev/null @@ -1,53 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/library/res/layout/pull_to_refresh_header_horizontal.xml b/library/res/layout/pull_to_refresh_header_horizontal.xml index 818ed229a..5e225c224 100644 --- a/library/res/layout/pull_to_refresh_header_horizontal.xml +++ b/library/res/layout/pull_to_refresh_header_horizontal.xml @@ -1,23 +1,19 @@ - + android:layout_height="wrap_content" + android:layout_gravity="center" /> - - - - + \ No newline at end of file diff --git a/library/res/layout/pull_to_refresh_header_vertical.xml b/library/res/layout/pull_to_refresh_header_vertical.xml index 7ab947774..ac4728643 100644 --- a/library/res/layout/pull_to_refresh_header_vertical.xml +++ b/library/res/layout/pull_to_refresh_header_vertical.xml @@ -4,12 +4,13 @@ + android:layout_gravity="left|center_vertical" > + android:layout_height="wrap_content" + android:layout_gravity="center" /> 10dp 12dp 4dp - 25dp - 10dp - 20dp - 320dp + + 12dp + 24dp \ No newline at end of file diff --git a/library/src/com/handmark/pulltorefresh/library/internal/LoadingLayout.java b/library/src/com/handmark/pulltorefresh/library/internal/LoadingLayout.java index fdf46fc30..b93599f66 100644 --- a/library/src/com/handmark/pulltorefresh/library/internal/LoadingLayout.java +++ b/library/src/com/handmark/pulltorefresh/library/internal/LoadingLayout.java @@ -24,13 +24,12 @@ import android.graphics.drawable.Drawable; import android.text.TextUtils; import android.util.TypedValue; -import android.view.Gravity; import android.view.LayoutInflater; import android.view.View; import android.view.animation.Interpolator; import android.view.animation.LinearInterpolator; +import android.widget.FrameLayout; import android.widget.ImageView; -import android.widget.LinearLayout; import android.widget.ProgressBar; import android.widget.TextView; @@ -40,7 +39,7 @@ import com.handmark.pulltorefresh.library.R; @SuppressLint("ViewConstructor") -public abstract class LoadingLayout extends LinearLayout implements ILoadingLayout { +public abstract class LoadingLayout extends FrameLayout implements ILoadingLayout { static final String LOG_TAG = "PullToRefresh-LoadingLayout"; @@ -66,7 +65,6 @@ public LoadingLayout(Context context, final Mode mode, final int scrollDirection mMode = mode; mScrollDirection = scrollDirection; - setGravity(Gravity.CENTER); resetPadding(); switch (scrollDirection) { @@ -310,9 +308,10 @@ public void setTextTypeface(Typeface tf) { protected abstract void resetImpl(); private void resetPadding() { - final int tbPadding = getResources().getDimensionPixelSize(R.dimen.header_footer_top_bottom_padding); - final int lrPadding = getResources().getDimensionPixelSize(R.dimen.header_footer_left_right_padding); - setPadding(lrPadding, tbPadding, lrPadding, tbPadding); + final int padding = getResources().getDimensionPixelSize( + mScrollDirection == PullToRefreshBase.VERTICAL_SCROLL ? R.dimen.header_footer_padding_vertical + : R.dimen.header_footer_padding_horizontal); + setPadding(padding, padding, padding, padding); } private void setSubHeaderText(CharSequence label) { From 0280dfb04f25f0228dbc02fb186421b8c04a2526 Mon Sep 17 00:00:00 2001 From: Chris Banes Date: Thu, 13 Dec 2012 14:33:35 +0000 Subject: [PATCH 082/120] Change default text appearance. And fix padding --- library/res/layout/pull_to_refresh_header_vertical.xml | 3 ++- library/res/values/dimens.xml | 5 ++--- .../pulltorefresh/library/internal/LoadingLayout.java | 10 ++++++---- 3 files changed, 10 insertions(+), 8 deletions(-) diff --git a/library/res/layout/pull_to_refresh_header_vertical.xml b/library/res/layout/pull_to_refresh_header_vertical.xml index ac4728643..8533c0b68 100644 --- a/library/res/layout/pull_to_refresh_header_vertical.xml +++ b/library/res/layout/pull_to_refresh_header_vertical.xml @@ -26,6 +26,7 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" + android:gravity="center_horizontal" android:orientation="vertical" > 10dp 12dp 4dp - - 12dp - 24dp + 24dp + 12dp \ No newline at end of file diff --git a/library/src/com/handmark/pulltorefresh/library/internal/LoadingLayout.java b/library/src/com/handmark/pulltorefresh/library/internal/LoadingLayout.java index b93599f66..3f1935adc 100644 --- a/library/src/com/handmark/pulltorefresh/library/internal/LoadingLayout.java +++ b/library/src/com/handmark/pulltorefresh/library/internal/LoadingLayout.java @@ -18,6 +18,7 @@ import android.annotation.SuppressLint; import android.content.Context; import android.content.res.ColorStateList; +import android.content.res.Resources; import android.content.res.TypedArray; import android.graphics.Typeface; import android.graphics.drawable.AnimationDrawable; @@ -308,10 +309,11 @@ public void setTextTypeface(Typeface tf) { protected abstract void resetImpl(); private void resetPadding() { - final int padding = getResources().getDimensionPixelSize( - mScrollDirection == PullToRefreshBase.VERTICAL_SCROLL ? R.dimen.header_footer_padding_vertical - : R.dimen.header_footer_padding_horizontal); - setPadding(padding, padding, padding, padding); + Resources res = getResources(); + final int tbPadding = res.getDimensionPixelSize(R.dimen.header_footer_top_bottom_padding); + final int lrPadding = res.getDimensionPixelSize(R.dimen.header_footer_left_right_padding); + setPadding(lrPadding, tbPadding, lrPadding, tbPadding); + } private void setSubHeaderText(CharSequence label) { From a372b8051f67fc140d7d4afc63f1cfcd62e96073 Mon Sep 17 00:00:00 2001 From: Chris Banes Date: Thu, 13 Dec 2012 16:16:27 +0000 Subject: [PATCH 083/120] Remove some deprecated methods --- .../library/PullToRefreshBase.java | 37 ------------------- 1 file changed, 37 deletions(-) diff --git a/library/src/com/handmark/pulltorefresh/library/PullToRefreshBase.java b/library/src/com/handmark/pulltorefresh/library/PullToRefreshBase.java index 978c597ac..81dfdc1f6 100644 --- a/library/src/com/handmark/pulltorefresh/library/PullToRefreshBase.java +++ b/library/src/com/handmark/pulltorefresh/library/PullToRefreshBase.java @@ -198,14 +198,6 @@ public final State getState() { return mState; } - /** - * @return true if the current mode is Mode.PULL_FROM_START - * @deprecated Use the value from getCurrentMode() instead - */ - public final boolean hasPullFromTop() { - return mCurrentMode == Mode.PULL_FROM_START; - } - /** * @deprecated See {@link #isScrollingWhileRefreshingEnabled()}. */ @@ -608,9 +600,6 @@ void onRefreshing(final boolean doScroll) { smoothScrollTo(0); } } - - // Call the deprecated method - setRefreshingInternal(doScroll); } /** @@ -644,9 +633,6 @@ void onReset() { mFooterLayout.reset(); smoothScrollTo(0); - - // Call the deprecated method - resetHeader(); } /** @@ -923,17 +909,6 @@ protected void onSizeChanged(int w, int h, int oldw, int oldh) { refreshLoadingViewsSize(); } - /** - * @deprecated This is a deprecated callback. If you're overriding this - * method then use - * {@link #setOnPullEventListener(OnPullEventListener) - * setOnPullEventListener()} instead to be notified when the - * state changes to {@link State#RESET RESET}. This deprecated - * method will be removed in the future. - */ - protected void resetHeader() { - } - /** * Helper method which just calls scrollTo() in the correct scrolling * direction. @@ -962,18 +937,6 @@ protected final void setHeaderScroll(final int value) { } } - /** - * @deprecated This is a deprecated callback. If you're overriding this - * method then use - * {@link #setOnPullEventListener(OnPullEventListener) - * setOnPullEventListener()} instead to be notified when the - * state changes to {@link State#REFRESHING REFRESHING} or - * {@link State#MANUAL_REFRESHING MANUAL_REFRESHING}. This - * deprecated method will be removed in the future. - */ - protected void setRefreshingInternal(final boolean doScroll) { - } - /** * Smooth Scroll to position using the default duration of * {@value #SMOOTH_SCROLL_DURATION_MS} ms. From cae3c9cad738af3f920bd7ba291a7604aa85a4ac Mon Sep 17 00:00:00 2001 From: Chris Banes Date: Thu, 13 Dec 2012 16:34:30 +0000 Subject: [PATCH 084/120] Change Scroll Direction value to enum --- .../viewpager/PullToRefreshViewPager.java | 4 +- .../library/OverscrollHelper.java | 4 +- .../library/PullToRefreshBase.java | 55 ++++++++++--------- .../PullToRefreshExpandableListView.java | 4 +- .../library/PullToRefreshGridView.java | 4 +- .../PullToRefreshHorizontalScrollView.java | 4 +- .../library/PullToRefreshListView.java | 4 +- .../library/PullToRefreshScrollView.java | 4 +- .../library/PullToRefreshWebView.java | 4 +- .../library/internal/FlipLoadingLayout.java | 8 +-- .../library/internal/LoadingLayout.java | 10 ++-- .../library/internal/RotateLoadingLayout.java | 3 +- 12 files changed, 55 insertions(+), 53 deletions(-) diff --git a/extras/PullToRefreshViewPager/src/com/handmark/pulltorefresh/extras/viewpager/PullToRefreshViewPager.java b/extras/PullToRefreshViewPager/src/com/handmark/pulltorefresh/extras/viewpager/PullToRefreshViewPager.java index d7305e34c..d5f845b32 100644 --- a/extras/PullToRefreshViewPager/src/com/handmark/pulltorefresh/extras/viewpager/PullToRefreshViewPager.java +++ b/extras/PullToRefreshViewPager/src/com/handmark/pulltorefresh/extras/viewpager/PullToRefreshViewPager.java @@ -33,8 +33,8 @@ public PullToRefreshViewPager(Context context, AttributeSet attrs) { } @Override - public final int getPullToRefreshScrollDirection() { - return HORIZONTAL_SCROLL; + public final Orientation getPullToRefreshScrollDirection() { + return Orientation.HORIZONTAL; } @Override diff --git a/library/src/com/handmark/pulltorefresh/library/OverscrollHelper.java b/library/src/com/handmark/pulltorefresh/library/OverscrollHelper.java index 852f35c2d..52a20de24 100644 --- a/library/src/com/handmark/pulltorefresh/library/OverscrollHelper.java +++ b/library/src/com/handmark/pulltorefresh/library/OverscrollHelper.java @@ -105,12 +105,12 @@ public static void overScrollBy(final PullToRefreshBase view, final int delta final int deltaValue, currentScrollValue, scrollValue; switch (view.getPullToRefreshScrollDirection()) { - case PullToRefreshBase.HORIZONTAL_SCROLL: + case HORIZONTAL: deltaValue = deltaX; scrollValue = scrollX; currentScrollValue = view.getScrollX(); break; - case PullToRefreshBase.VERTICAL_SCROLL: + case VERTICAL: default: deltaValue = deltaY; scrollValue = scrollY; diff --git a/library/src/com/handmark/pulltorefresh/library/PullToRefreshBase.java b/library/src/com/handmark/pulltorefresh/library/PullToRefreshBase.java index 81dfdc1f6..699adc227 100644 --- a/library/src/com/handmark/pulltorefresh/library/PullToRefreshBase.java +++ b/library/src/com/handmark/pulltorefresh/library/PullToRefreshBase.java @@ -48,9 +48,6 @@ public abstract class PullToRefreshBase extends LinearLayout imp static final boolean DEBUG = false; - public static final int VERTICAL_SCROLL = LinearLayout.VERTICAL; - public static final int HORIZONTAL_SCROLL = LinearLayout.HORIZONTAL; - static final String LOG_TAG = "PullToRefresh"; static final float FRICTION = 2.0f; @@ -258,11 +255,11 @@ public final boolean onInterceptTouchEvent(MotionEvent event) { // We need to use the correct values, based on scroll // direction switch (getPullToRefreshScrollDirection()) { - case HORIZONTAL_SCROLL: + case HORIZONTAL: diff = x - mLastMotionX; oppositeDiff = y - mLastMotionY; break; - case VERTICAL_SCROLL: + case VERTICAL: default: diff = y - mLastMotionY; oppositeDiff = x - mLastMotionX; @@ -547,10 +544,10 @@ public final void setShowViewWhileRefreshing(boolean showView) { } /** - * @return Either {@link #VERTICAL_SCROLL} or {@link #HORIZONTAL_SCROLL} - * depending on the scroll direction. + * @return Either {@link Orientation#VERTICAL} or + * {@link Orientation#HORIZONTAL} depending on the scroll direction. */ - public abstract int getPullToRefreshScrollDirection(); + public abstract Orientation getPullToRefreshScrollDirection(); /** * Called when the UI has been to be updated to be in the @@ -652,12 +649,12 @@ final void refreshLoadingViewsSize() { measureView(mHeaderLayout); switch (getPullToRefreshScrollDirection()) { - case HORIZONTAL_SCROLL: + case HORIZONTAL: mHeaderDimension = mHeaderLayout.getMeasuredWidth(); pLeft = -maximumPullScroll; mHeaderLayout.adjustWidthUsingLeftPadding(maximumPullScroll); break; - case VERTICAL_SCROLL: + case VERTICAL: default: mHeaderDimension = mHeaderLayout.getMeasuredHeight(); pTop = -maximumPullScroll; @@ -674,12 +671,12 @@ final void refreshLoadingViewsSize() { measureView(mFooterLayout); switch (getPullToRefreshScrollDirection()) { - case HORIZONTAL_SCROLL: + case HORIZONTAL: mFooterDimension = mFooterLayout.getMeasuredWidth(); pRight = -maximumPullScroll; mFooterLayout.adjustWidthUsingRightPadding(maximumPullScroll); break; - case VERTICAL_SCROLL: + case VERTICAL: default: mFooterDimension = mFooterLayout.getMeasuredHeight(); pBottom = -maximumPullScroll; @@ -928,10 +925,10 @@ protected final void setHeaderScroll(final int value) { } switch (getPullToRefreshScrollDirection()) { - case VERTICAL_SCROLL: + case VERTICAL: scrollTo(0, value); break; - case HORIZONTAL_SCROLL: + case HORIZONTAL: scrollTo(value, 0); break; } @@ -996,11 +993,11 @@ private void addRefreshableView(Context context, T refreshableView) { ViewGroup.LayoutParams.MATCH_PARENT); switch (getPullToRefreshScrollDirection()) { - case HORIZONTAL_SCROLL: + case HORIZONTAL: addViewInternal(mRefreshableViewWrapper, new LinearLayout.LayoutParams(0, LayoutParams.MATCH_PARENT, 1.0f)); break; - case VERTICAL_SCROLL: + case VERTICAL: default: addViewInternal(mRefreshableViewWrapper, new LinearLayout.LayoutParams(LayoutParams.MATCH_PARENT, 0, 1.0f)); @@ -1011,10 +1008,10 @@ private void addRefreshableView(Context context, T refreshableView) { @SuppressWarnings("deprecation") private void init(Context context, AttributeSet attrs) { switch (getPullToRefreshScrollDirection()) { - case HORIZONTAL_SCROLL: + case HORIZONTAL: setOrientation(LinearLayout.HORIZONTAL); break; - case VERTICAL_SCROLL: + case VERTICAL: default: setOrientation(LinearLayout.VERTICAL); break; @@ -1128,11 +1125,11 @@ private void pullEvent() { final float initialMotionValue, lastMotionValue; switch (getPullToRefreshScrollDirection()) { - case HORIZONTAL_SCROLL: + case HORIZONTAL: initialMotionValue = mInitialMotionX; lastMotionValue = mLastMotionX; break; - case VERTICAL_SCROLL: + case VERTICAL: default: initialMotionValue = mInitialMotionY; lastMotionValue = mLastMotionY; @@ -1175,10 +1172,10 @@ private void pullEvent() { private LinearLayout.LayoutParams getLoadingLayoutLayoutParams() { switch (getPullToRefreshScrollDirection()) { - case HORIZONTAL_SCROLL: + case HORIZONTAL: return new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.MATCH_PARENT); - case VERTICAL_SCROLL: + case VERTICAL: default: return new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT); @@ -1187,9 +1184,9 @@ private LinearLayout.LayoutParams getLoadingLayoutLayoutParams() { private int getMaximumPullScroll() { switch (getPullToRefreshScrollDirection()) { - case HORIZONTAL_SCROLL: + case HORIZONTAL: return Math.round(getWidth() / FRICTION); - case VERTICAL_SCROLL: + case VERTICAL: default: return Math.round(getHeight() / FRICTION); } @@ -1213,10 +1210,10 @@ private final void smoothScrollTo(int newScrollValue, long duration, long delayM final int oldScrollValue; switch (getPullToRefreshScrollDirection()) { - case HORIZONTAL_SCROLL: + case HORIZONTAL: oldScrollValue = getScrollX(); break; - case VERTICAL_SCROLL: + case VERTICAL: default: oldScrollValue = getScrollY(); break; @@ -1282,7 +1279,7 @@ static AnimationStyle mapIntToValue(int modeInt) { } } - LoadingLayout createLoadingLayout(Context context, Mode mode, int scrollDirection, TypedArray attrs) { + LoadingLayout createLoadingLayout(Context context, Mode mode, Orientation scrollDirection, TypedArray attrs) { switch (this) { case ROTATE: default: @@ -1478,6 +1475,10 @@ public static interface OnRefreshListener2 { } + public static enum Orientation { + VERTICAL, HORIZONTAL; + } + public static enum State { /** diff --git a/library/src/com/handmark/pulltorefresh/library/PullToRefreshExpandableListView.java b/library/src/com/handmark/pulltorefresh/library/PullToRefreshExpandableListView.java index 312a91b36..974618be5 100644 --- a/library/src/com/handmark/pulltorefresh/library/PullToRefreshExpandableListView.java +++ b/library/src/com/handmark/pulltorefresh/library/PullToRefreshExpandableListView.java @@ -50,8 +50,8 @@ public ContextMenuInfo getContextMenuInfo() { } @Override - public final int getPullToRefreshScrollDirection() { - return VERTICAL_SCROLL; + public final Orientation getPullToRefreshScrollDirection() { + return Orientation.VERTICAL; } @Override diff --git a/library/src/com/handmark/pulltorefresh/library/PullToRefreshGridView.java b/library/src/com/handmark/pulltorefresh/library/PullToRefreshGridView.java index 3c739eefa..e1db44977 100644 --- a/library/src/com/handmark/pulltorefresh/library/PullToRefreshGridView.java +++ b/library/src/com/handmark/pulltorefresh/library/PullToRefreshGridView.java @@ -50,8 +50,8 @@ public ContextMenuInfo getContextMenuInfo() { } @Override - public final int getPullToRefreshScrollDirection() { - return VERTICAL_SCROLL; + public final Orientation getPullToRefreshScrollDirection() { + return Orientation.VERTICAL; } @Override diff --git a/library/src/com/handmark/pulltorefresh/library/PullToRefreshHorizontalScrollView.java b/library/src/com/handmark/pulltorefresh/library/PullToRefreshHorizontalScrollView.java index d98b3eb55..a70f7ad2a 100644 --- a/library/src/com/handmark/pulltorefresh/library/PullToRefreshHorizontalScrollView.java +++ b/library/src/com/handmark/pulltorefresh/library/PullToRefreshHorizontalScrollView.java @@ -42,8 +42,8 @@ public PullToRefreshHorizontalScrollView(Context context, Mode mode, AnimationSt } @Override - public final int getPullToRefreshScrollDirection() { - return HORIZONTAL_SCROLL; + public final Orientation getPullToRefreshScrollDirection() { + return Orientation.HORIZONTAL; } @Override diff --git a/library/src/com/handmark/pulltorefresh/library/PullToRefreshListView.java b/library/src/com/handmark/pulltorefresh/library/PullToRefreshListView.java index 5a6afed44..17c1d7771 100644 --- a/library/src/com/handmark/pulltorefresh/library/PullToRefreshListView.java +++ b/library/src/com/handmark/pulltorefresh/library/PullToRefreshListView.java @@ -64,8 +64,8 @@ public ContextMenuInfo getContextMenuInfo() { } @Override - public final int getPullToRefreshScrollDirection() { - return VERTICAL_SCROLL; + public final Orientation getPullToRefreshScrollDirection() { + return Orientation.VERTICAL; } @Override diff --git a/library/src/com/handmark/pulltorefresh/library/PullToRefreshScrollView.java b/library/src/com/handmark/pulltorefresh/library/PullToRefreshScrollView.java index 2b7261427..3ae3627f1 100644 --- a/library/src/com/handmark/pulltorefresh/library/PullToRefreshScrollView.java +++ b/library/src/com/handmark/pulltorefresh/library/PullToRefreshScrollView.java @@ -42,8 +42,8 @@ public PullToRefreshScrollView(Context context, Mode mode, AnimationStyle style) } @Override - public final int getPullToRefreshScrollDirection() { - return VERTICAL_SCROLL; + public final Orientation getPullToRefreshScrollDirection() { + return Orientation.VERTICAL; } @Override diff --git a/library/src/com/handmark/pulltorefresh/library/PullToRefreshWebView.java b/library/src/com/handmark/pulltorefresh/library/PullToRefreshWebView.java index c43dd853b..3f873de08 100644 --- a/library/src/com/handmark/pulltorefresh/library/PullToRefreshWebView.java +++ b/library/src/com/handmark/pulltorefresh/library/PullToRefreshWebView.java @@ -88,8 +88,8 @@ public PullToRefreshWebView(Context context, Mode mode, AnimationStyle style) { } @Override - public final int getPullToRefreshScrollDirection() { - return VERTICAL_SCROLL; + public final Orientation getPullToRefreshScrollDirection() { + return Orientation.VERTICAL; } @Override diff --git a/library/src/com/handmark/pulltorefresh/library/internal/FlipLoadingLayout.java b/library/src/com/handmark/pulltorefresh/library/internal/FlipLoadingLayout.java index 2f435522f..fef31605f 100644 --- a/library/src/com/handmark/pulltorefresh/library/internal/FlipLoadingLayout.java +++ b/library/src/com/handmark/pulltorefresh/library/internal/FlipLoadingLayout.java @@ -26,8 +26,8 @@ import android.view.animation.RotateAnimation; import android.widget.ImageView.ScaleType; -import com.handmark.pulltorefresh.library.PullToRefreshBase; import com.handmark.pulltorefresh.library.PullToRefreshBase.Mode; +import com.handmark.pulltorefresh.library.PullToRefreshBase.Orientation; import com.handmark.pulltorefresh.library.R; @SuppressLint("ViewConstructor") @@ -37,7 +37,7 @@ public class FlipLoadingLayout extends LoadingLayout { private final Animation mRotateAnimation, mResetRotateAnimation; - public FlipLoadingLayout(Context context, final Mode mode, final int scrollDirection, TypedArray attrs) { + public FlipLoadingLayout(Context context, final Mode mode, final Orientation scrollDirection, TypedArray attrs) { super(context, mode, scrollDirection, attrs); final int rotateAngle = mode == Mode.PULL_FROM_START ? -180 : 180; @@ -123,7 +123,7 @@ private float getDrawableRotationAngle() { float angle = 0f; switch (mMode) { case PULL_FROM_END: - if (mScrollDirection == PullToRefreshBase.HORIZONTAL_SCROLL) { + if (mScrollDirection == Orientation.HORIZONTAL) { angle = 90f; } else { angle = 180f; @@ -131,7 +131,7 @@ private float getDrawableRotationAngle() { break; case PULL_FROM_START: - if (mScrollDirection == PullToRefreshBase.HORIZONTAL_SCROLL) { + if (mScrollDirection == Orientation.HORIZONTAL) { angle = 270f; } break; diff --git a/library/src/com/handmark/pulltorefresh/library/internal/LoadingLayout.java b/library/src/com/handmark/pulltorefresh/library/internal/LoadingLayout.java index 3f1935adc..3c7d4541b 100644 --- a/library/src/com/handmark/pulltorefresh/library/internal/LoadingLayout.java +++ b/library/src/com/handmark/pulltorefresh/library/internal/LoadingLayout.java @@ -35,8 +35,8 @@ import android.widget.TextView; import com.handmark.pulltorefresh.library.ILoadingLayout; -import com.handmark.pulltorefresh.library.PullToRefreshBase; import com.handmark.pulltorefresh.library.PullToRefreshBase.Mode; +import com.handmark.pulltorefresh.library.PullToRefreshBase.Orientation; import com.handmark.pulltorefresh.library.R; @SuppressLint("ViewConstructor") @@ -55,13 +55,13 @@ public abstract class LoadingLayout extends FrameLayout implements ILoadingLayou private final TextView mSubHeaderText; protected final Mode mMode; - protected final int mScrollDirection; + protected final Orientation mScrollDirection; private CharSequence mPullLabel; private CharSequence mRefreshingLabel; private CharSequence mReleaseLabel; - public LoadingLayout(Context context, final Mode mode, final int scrollDirection, TypedArray attrs) { + public LoadingLayout(Context context, final Mode mode, final Orientation scrollDirection, TypedArray attrs) { super(context); mMode = mode; mScrollDirection = scrollDirection; @@ -69,10 +69,10 @@ public LoadingLayout(Context context, final Mode mode, final int scrollDirection resetPadding(); switch (scrollDirection) { - case PullToRefreshBase.HORIZONTAL_SCROLL: + case HORIZONTAL: LayoutInflater.from(context).inflate(R.layout.pull_to_refresh_header_horizontal, this); break; - case PullToRefreshBase.VERTICAL_SCROLL: + case VERTICAL: default: LayoutInflater.from(context).inflate(R.layout.pull_to_refresh_header_vertical, this); break; diff --git a/library/src/com/handmark/pulltorefresh/library/internal/RotateLoadingLayout.java b/library/src/com/handmark/pulltorefresh/library/internal/RotateLoadingLayout.java index d8f69d5af..ac1015ed4 100644 --- a/library/src/com/handmark/pulltorefresh/library/internal/RotateLoadingLayout.java +++ b/library/src/com/handmark/pulltorefresh/library/internal/RotateLoadingLayout.java @@ -24,6 +24,7 @@ import android.widget.ImageView.ScaleType; import com.handmark.pulltorefresh.library.PullToRefreshBase.Mode; +import com.handmark.pulltorefresh.library.PullToRefreshBase.Orientation; import com.handmark.pulltorefresh.library.R; public class RotateLoadingLayout extends LoadingLayout { @@ -35,7 +36,7 @@ public class RotateLoadingLayout extends LoadingLayout { private float mRotationPivotX, mRotationPivotY; - public RotateLoadingLayout(Context context, Mode mode, int scrollDirection, TypedArray attrs) { + public RotateLoadingLayout(Context context, Mode mode, Orientation scrollDirection, TypedArray attrs) { super(context, mode, scrollDirection, attrs); mHeaderImage.setScaleType(ScaleType.MATRIX); From 55c9c32b0e43eaf4cf28b84b300ffd51ac01c08c Mon Sep 17 00:00:00 2001 From: Chris Banes Date: Thu, 13 Dec 2012 16:54:19 +0000 Subject: [PATCH 085/120] Implement #182 as an XML option --- library/res/values/attrs.xml | 6 ++++++ .../library/internal/RotateLoadingLayout.java | 13 ++++++++++++- 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/library/res/values/attrs.xml b/library/res/values/attrs.xml index f185cdcdb..a3408ae7d 100644 --- a/library/res/values/attrs.xml +++ b/library/res/values/attrs.xml @@ -65,6 +65,12 @@ --> + + + diff --git a/library/src/com/handmark/pulltorefresh/library/internal/RotateLoadingLayout.java b/library/src/com/handmark/pulltorefresh/library/internal/RotateLoadingLayout.java index ac1015ed4..325fa4089 100644 --- a/library/src/com/handmark/pulltorefresh/library/internal/RotateLoadingLayout.java +++ b/library/src/com/handmark/pulltorefresh/library/internal/RotateLoadingLayout.java @@ -36,9 +36,13 @@ public class RotateLoadingLayout extends LoadingLayout { private float mRotationPivotX, mRotationPivotY; + private final boolean mRotateDrawableWhilePulling; + public RotateLoadingLayout(Context context, Mode mode, Orientation scrollDirection, TypedArray attrs) { super(context, mode, scrollDirection, attrs); + mRotateDrawableWhilePulling = attrs.getBoolean(R.styleable.PullToRefresh_ptrRotateDrawableWhilePulling, true); + mHeaderImage.setScaleType(ScaleType.MATRIX); mHeaderImageMatrix = new Matrix(); mHeaderImage.setImageMatrix(mHeaderImageMatrix); @@ -59,7 +63,14 @@ public void onLoadingDrawableSet(Drawable imageDrawable) { } protected void onPullImpl(float scaleOfLayout) { - mHeaderImageMatrix.setRotate(scaleOfLayout * 90, mRotationPivotX, mRotationPivotY); + float angle; + if (mRotateDrawableWhilePulling) { + angle = scaleOfLayout * 90f; + } else { + angle = Math.max(0f, Math.min(180f, scaleOfLayout * 360f - 180f)); + } + + mHeaderImageMatrix.setRotate(angle, mRotationPivotX, mRotationPivotY); mHeaderImage.setImageMatrix(mHeaderImageMatrix); } From b62cb4e1eb5011258192d583f0a0667ef0c00f20 Mon Sep 17 00:00:00 2001 From: cketti Date: Fri, 14 Dec 2012 11:49:38 +0100 Subject: [PATCH 086/120] Use setMode() to restore mode in onRestoreInstanceState() When restoring a mode != DISABLED with the current mode being DISABLED the header and/or footer layout weren't added to the view. That's why we now call setMode() instead of setting mMode directly. --- .../com/handmark/pulltorefresh/library/PullToRefreshBase.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/library/src/com/handmark/pulltorefresh/library/PullToRefreshBase.java b/library/src/com/handmark/pulltorefresh/library/PullToRefreshBase.java index 699adc227..9a9f25074 100644 --- a/library/src/com/handmark/pulltorefresh/library/PullToRefreshBase.java +++ b/library/src/com/handmark/pulltorefresh/library/PullToRefreshBase.java @@ -860,7 +860,7 @@ protected final void onRestoreInstanceState(Parcelable state) { if (state instanceof Bundle) { Bundle bundle = (Bundle) state; - mMode = Mode.mapIntToValue(bundle.getInt(STATE_MODE, 0)); + setMode(Mode.mapIntToValue(bundle.getInt(STATE_MODE, 0))); mCurrentMode = Mode.mapIntToValue(bundle.getInt(STATE_CURRENT_MODE, 0)); mScrollingWhileRefreshingEnabled = bundle.getBoolean(STATE_SCROLLING_REFRESHING_ENABLED, false); From 4bab109a95ea2e0e442b63d50a291cc9b22bb073 Mon Sep 17 00:00:00 2001 From: Chris Banes Date: Mon, 17 Dec 2012 15:51:00 +0000 Subject: [PATCH 087/120] Use Hardware Layers on Refreshable View --- .../pulltorefresh/library/PullToRefreshBase.java | 7 +++++++ .../pulltorefresh/library/internal/ViewCompat.java | 14 ++++++++++++++ 2 files changed, 21 insertions(+) diff --git a/library/src/com/handmark/pulltorefresh/library/PullToRefreshBase.java b/library/src/com/handmark/pulltorefresh/library/PullToRefreshBase.java index 9a9f25074..ed76d2e56 100644 --- a/library/src/com/handmark/pulltorefresh/library/PullToRefreshBase.java +++ b/library/src/com/handmark/pulltorefresh/library/PullToRefreshBase.java @@ -924,6 +924,13 @@ protected final void setHeaderScroll(final int value) { } } + /** + * Use a Hardware Layer on the Refreshable View if we've scrolled at + * all. We don't use them on the Header/Footer Views as they change + * often, which would negate any HW layer performance boost. + */ + ViewCompat.setLayerType(mRefreshableViewWrapper, value != 0 ? View.LAYER_TYPE_HARDWARE : View.LAYER_TYPE_NONE); + switch (getPullToRefreshScrollDirection()) { case VERTICAL: scrollTo(0, value); diff --git a/library/src/com/handmark/pulltorefresh/library/internal/ViewCompat.java b/library/src/com/handmark/pulltorefresh/library/internal/ViewCompat.java index 852440329..618bace02 100644 --- a/library/src/com/handmark/pulltorefresh/library/internal/ViewCompat.java +++ b/library/src/com/handmark/pulltorefresh/library/internal/ViewCompat.java @@ -40,6 +40,20 @@ public static void setBackground(View view, Drawable background) { } } + public static void setLayerType(View view, int layerType) { + if (VERSION.SDK_INT >= VERSION_CODES.HONEYCOMB) { + SDK11.setLayerType(view, layerType); + } + } + + @TargetApi(11) + static class SDK11 { + + public static void setLayerType(View view, int layerType) { + view.setLayerType(layerType, null); + } + } + @TargetApi(16) static class SDK16 { From eaa7c9ba4e1a51889db5fd3259900c2ed93ec6ea Mon Sep 17 00:00:00 2001 From: Chris Banes Date: Mon, 17 Dec 2012 15:52:37 +0000 Subject: [PATCH 088/120] Update Manifest Version Numbers --- extras/PullToRefreshListFragment/AndroidManifest.xml | 4 ++-- extras/PullToRefreshViewPager/AndroidManifest.xml | 4 ++-- library/AndroidManifest.xml | 4 ++-- sample/AndroidManifest.xml | 4 ++-- 4 files changed, 8 insertions(+), 8 deletions(-) diff --git a/extras/PullToRefreshListFragment/AndroidManifest.xml b/extras/PullToRefreshListFragment/AndroidManifest.xml index 0bf8b6c17..89632e318 100644 --- a/extras/PullToRefreshListFragment/AndroidManifest.xml +++ b/extras/PullToRefreshListFragment/AndroidManifest.xml @@ -1,8 +1,8 @@ + android:versionCode="2100" + android:versionName="2.1" > diff --git a/extras/PullToRefreshViewPager/AndroidManifest.xml b/extras/PullToRefreshViewPager/AndroidManifest.xml index 488ddf580..8643bc964 100644 --- a/extras/PullToRefreshViewPager/AndroidManifest.xml +++ b/extras/PullToRefreshViewPager/AndroidManifest.xml @@ -1,8 +1,8 @@ + android:versionCode="2100" + android:versionName="2.1" > diff --git a/library/AndroidManifest.xml b/library/AndroidManifest.xml index 98a851e6c..28e0b3a47 100644 --- a/library/AndroidManifest.xml +++ b/library/AndroidManifest.xml @@ -1,8 +1,8 @@ + android:versionCode="2100" + android:versionName="2.1" > diff --git a/sample/AndroidManifest.xml b/sample/AndroidManifest.xml index 4bc16adc3..714039c1f 100755 --- a/sample/AndroidManifest.xml +++ b/sample/AndroidManifest.xml @@ -1,8 +1,8 @@ + android:versionCode="2100" + android:versionName="2.1" > Date: Mon, 17 Dec 2012 16:12:46 +0000 Subject: [PATCH 089/120] [maven-release-plugin] prepare release v2.1 --- extras/PullToRefreshListFragment/pom.xml | 2 +- extras/PullToRefreshViewPager/pom.xml | 2 +- extras/pom.xml | 2 +- library/pom.xml | 2 +- pom.xml | 4 ++-- sample/pom.xml | 2 +- 6 files changed, 7 insertions(+), 7 deletions(-) diff --git a/extras/PullToRefreshListFragment/pom.xml b/extras/PullToRefreshListFragment/pom.xml index 70ab8f5aa..61935d30e 100644 --- a/extras/PullToRefreshListFragment/pom.xml +++ b/extras/PullToRefreshListFragment/pom.xml @@ -10,7 +10,7 @@ com.github.chrisbanes.pulltorefresh extras - 2.0.2-SNAPSHOT + 2.1 diff --git a/extras/PullToRefreshViewPager/pom.xml b/extras/PullToRefreshViewPager/pom.xml index 1fd45cc89..0b1a8865f 100644 --- a/extras/PullToRefreshViewPager/pom.xml +++ b/extras/PullToRefreshViewPager/pom.xml @@ -10,7 +10,7 @@ com.github.chrisbanes.pulltorefresh extras - 2.0.2-SNAPSHOT + 2.1 diff --git a/extras/pom.xml b/extras/pom.xml index b816dda46..6ad9d59b3 100644 --- a/extras/pom.xml +++ b/extras/pom.xml @@ -10,7 +10,7 @@ com.github.chrisbanes.pulltorefresh parent - 2.0.2-SNAPSHOT + 2.1 diff --git a/library/pom.xml b/library/pom.xml index b8ed5b0c6..40289a7e7 100644 --- a/library/pom.xml +++ b/library/pom.xml @@ -10,7 +10,7 @@ com.github.chrisbanes.pulltorefresh parent - 2.0.2-SNAPSHOT + 2.1 diff --git a/pom.xml b/pom.xml index eb715e8ea..9948458a1 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ com.github.chrisbanes.pulltorefresh parent pom - 2.0.2-SNAPSHOT + 2.1 Android-PullToRefresh Project Implementation of the Pull-to-Refresh UI Pattern for Android. https://github.com/chrisbanes/Android-PullToRefresh @@ -24,7 +24,7 @@ https://github.com/chrisbanes/Android-PullToRefresh scm:git:git://github.com/chrisbanes/Android-PullToRefresh.git scm:git:git@github.com:chrisbanes/Android-PullToRefresh.git - HEAD + v2.1 diff --git a/sample/pom.xml b/sample/pom.xml index ac8f2e9b7..48f65b6b0 100644 --- a/sample/pom.xml +++ b/sample/pom.xml @@ -10,7 +10,7 @@ com.github.chrisbanes.pulltorefresh parent - 2.0.2-SNAPSHOT + 2.1 From 53c328fe07c72cbffba45933b9e4e30396e71e68 Mon Sep 17 00:00:00 2001 From: Chris Banes Date: Mon, 17 Dec 2012 16:12:52 +0000 Subject: [PATCH 090/120] [maven-release-plugin] prepare for next development iteration --- extras/PullToRefreshListFragment/pom.xml | 2 +- extras/PullToRefreshViewPager/pom.xml | 2 +- extras/pom.xml | 2 +- library/pom.xml | 2 +- pom.xml | 4 ++-- sample/pom.xml | 2 +- 6 files changed, 7 insertions(+), 7 deletions(-) diff --git a/extras/PullToRefreshListFragment/pom.xml b/extras/PullToRefreshListFragment/pom.xml index 61935d30e..206f52ed8 100644 --- a/extras/PullToRefreshListFragment/pom.xml +++ b/extras/PullToRefreshListFragment/pom.xml @@ -10,7 +10,7 @@ com.github.chrisbanes.pulltorefresh extras - 2.1 + 2.2-SNAPSHOT diff --git a/extras/PullToRefreshViewPager/pom.xml b/extras/PullToRefreshViewPager/pom.xml index 0b1a8865f..c9d30d7f8 100644 --- a/extras/PullToRefreshViewPager/pom.xml +++ b/extras/PullToRefreshViewPager/pom.xml @@ -10,7 +10,7 @@ com.github.chrisbanes.pulltorefresh extras - 2.1 + 2.2-SNAPSHOT diff --git a/extras/pom.xml b/extras/pom.xml index 6ad9d59b3..216f05023 100644 --- a/extras/pom.xml +++ b/extras/pom.xml @@ -10,7 +10,7 @@ com.github.chrisbanes.pulltorefresh parent - 2.1 + 2.2-SNAPSHOT diff --git a/library/pom.xml b/library/pom.xml index 40289a7e7..8db0a8eda 100644 --- a/library/pom.xml +++ b/library/pom.xml @@ -10,7 +10,7 @@ com.github.chrisbanes.pulltorefresh parent - 2.1 + 2.2-SNAPSHOT diff --git a/pom.xml b/pom.xml index 9948458a1..cb2bd8fe8 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ com.github.chrisbanes.pulltorefresh parent pom - 2.1 + 2.2-SNAPSHOT Android-PullToRefresh Project Implementation of the Pull-to-Refresh UI Pattern for Android. https://github.com/chrisbanes/Android-PullToRefresh @@ -24,7 +24,7 @@ https://github.com/chrisbanes/Android-PullToRefresh scm:git:git://github.com/chrisbanes/Android-PullToRefresh.git scm:git:git@github.com:chrisbanes/Android-PullToRefresh.git - v2.1 + HEAD diff --git a/sample/pom.xml b/sample/pom.xml index 48f65b6b0..7bee8d1a1 100644 --- a/sample/pom.xml +++ b/sample/pom.xml @@ -10,7 +10,7 @@ com.github.chrisbanes.pulltorefresh parent - 2.1 + 2.2-SNAPSHOT From 3553b4a544ed5b26b725239fc11696347b249b2c Mon Sep 17 00:00:00 2001 From: Chris Banes Date: Wed, 19 Dec 2012 11:31:56 +0000 Subject: [PATCH 091/120] Add new ListView in ViewPager sample --- sample/AndroidManifest.xml | 4 + sample/res/layout/activity_ptr_list_in_vp.xml | 14 +++ .../layout/layout_listview_in_viewpager.xml | 6 + .../samples/LauncherActivity.java | 5 +- .../PullToRefreshListInViewPagerActivity.java | 110 ++++++++++++++++++ 5 files changed, 138 insertions(+), 1 deletion(-) create mode 100755 sample/res/layout/activity_ptr_list_in_vp.xml create mode 100644 sample/res/layout/layout_listview_in_viewpager.xml create mode 100644 sample/src/com/handmark/pulltorefresh/samples/PullToRefreshListInViewPagerActivity.java diff --git a/sample/AndroidManifest.xml b/sample/AndroidManifest.xml index 714039c1f..7d85691ba 100755 --- a/sample/AndroidManifest.xml +++ b/sample/AndroidManifest.xml @@ -29,6 +29,10 @@ android:name=".PullToRefreshListFragmentActivity" android:label="PtR ListView Fragment" > + + diff --git a/sample/res/layout/activity_ptr_list_in_vp.xml b/sample/res/layout/activity_ptr_list_in_vp.xml new file mode 100755 index 000000000..a04737689 --- /dev/null +++ b/sample/res/layout/activity_ptr_list_in_vp.xml @@ -0,0 +1,14 @@ + + + + + + + + \ No newline at end of file diff --git a/sample/res/layout/layout_listview_in_viewpager.xml b/sample/res/layout/layout_listview_in_viewpager.xml new file mode 100644 index 000000000..3bfc689d4 --- /dev/null +++ b/sample/res/layout/layout_listview_in_viewpager.xml @@ -0,0 +1,6 @@ + + diff --git a/sample/src/com/handmark/pulltorefresh/samples/LauncherActivity.java b/sample/src/com/handmark/pulltorefresh/samples/LauncherActivity.java index 5d9730ce2..8eb47bc91 100644 --- a/sample/src/com/handmark/pulltorefresh/samples/LauncherActivity.java +++ b/sample/src/com/handmark/pulltorefresh/samples/LauncherActivity.java @@ -25,7 +25,7 @@ public class LauncherActivity extends ListActivity { public static final String[] options = { "ListView", "ExpandableListView", "GridView", "WebView", "ScrollView", - "Horizontal ScrollView", "ViewPager", "ListView Fragment", "WebView Advanced" }; + "Horizontal ScrollView", "ViewPager", "ListView Fragment", "WebView Advanced", "ListView in ViewPager" }; @Override protected void onCreate(Bundle savedInstanceState) { @@ -66,6 +66,9 @@ protected void onListItemClick(ListView l, View v, int position, long id) { case 8: intent = new Intent(this, PullToRefreshWebView2Activity.class); break; + case 9: + intent = new Intent(this, PullToRefreshListInViewPagerActivity.class); + break; } startActivity(intent); diff --git a/sample/src/com/handmark/pulltorefresh/samples/PullToRefreshListInViewPagerActivity.java b/sample/src/com/handmark/pulltorefresh/samples/PullToRefreshListInViewPagerActivity.java new file mode 100644 index 000000000..45b9b1e32 --- /dev/null +++ b/sample/src/com/handmark/pulltorefresh/samples/PullToRefreshListInViewPagerActivity.java @@ -0,0 +1,110 @@ +package com.handmark.pulltorefresh.samples; + +import java.util.Arrays; + +import android.app.Activity; +import android.content.Context; +import android.os.AsyncTask; +import android.os.Bundle; +import android.support.v4.view.PagerAdapter; +import android.support.v4.view.ViewPager; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.view.ViewGroup.LayoutParams; +import android.widget.ArrayAdapter; +import android.widget.ListAdapter; +import android.widget.ListView; + +import com.handmark.pulltorefresh.library.PullToRefreshBase; +import com.handmark.pulltorefresh.library.PullToRefreshBase.OnRefreshListener; +import com.handmark.pulltorefresh.library.PullToRefreshListView; + +public class PullToRefreshListInViewPagerActivity extends Activity implements OnRefreshListener { + + private static final String[] STRINGS = { "Abbaye de Belloc", "Abbaye du Mont des Cats", "Abertam", "Abondance", + "Ackawi", "Acorn", "Adelost", "Affidelice au Chablis", "Afuega'l Pitu", "Airag", "Airedale", "Aisy Cendre", + "Allgauer Emmentaler", "Abbaye de Belloc", "Abbaye du Mont des Cats", "Abertam", "Abondance", "Ackawi", + "Acorn", "Adelost", "Affidelice au Chablis", "Afuega'l Pitu", "Airag", "Airedale", "Aisy Cendre", + "Allgauer Emmentaler" }; + + private ViewPager mViewPager; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_ptr_list_in_vp); + + mViewPager = (ViewPager) findViewById(R.id.vp_list); + mViewPager.setAdapter(new ListViewPagerAdapter()); + } + + private class ListViewPagerAdapter extends PagerAdapter { + + @Override + public View instantiateItem(ViewGroup container, int position) { + Context context = container.getContext(); + + PullToRefreshListView plv = (PullToRefreshListView) LayoutInflater.from(context).inflate( + R.layout.layout_listview_in_viewpager, container, false); + + ListAdapter adapter = new ArrayAdapter(context, android.R.layout.simple_list_item_1, + Arrays.asList(STRINGS)); + plv.setAdapter(adapter); + + plv.setOnRefreshListener(PullToRefreshListInViewPagerActivity.this); + + // Now just add ListView to ViewPager and return it + container.addView(plv, LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT); + + return plv; + } + + @Override + public void destroyItem(ViewGroup container, int position, Object object) { + container.removeView((View) object); + } + + @Override + public boolean isViewFromObject(View view, Object object) { + return view == object; + } + + @Override + public int getCount() { + return 3; + } + + } + + @Override + public void onRefresh(PullToRefreshBase refreshView) { + new GetDataTask(refreshView).execute(); + } + + private static class GetDataTask extends AsyncTask { + + PullToRefreshBase mRefreshedView; + + public GetDataTask(PullToRefreshBase refreshedView) { + mRefreshedView = refreshedView; + } + + @Override + protected Void doInBackground(Void... params) { + // Simulates a background job. + try { + Thread.sleep(4000); + } catch (InterruptedException e) { + } + return null; + } + + @Override + protected void onPostExecute(Void result) { + mRefreshedView.onRefreshComplete(); + super.onPostExecute(result); + } + } + +} From 1669f287d4926e65dfe82bde5591222fcf81e8dc Mon Sep 17 00:00:00 2001 From: Chris Banes Date: Wed, 19 Dec 2012 11:40:11 +0000 Subject: [PATCH 092/120] Fix Refreshing on ListView when using a Header Background --- .../library/PullToRefreshListView.java | 5 ++-- .../library/internal/LoadingLayout.java | 30 +++++++++++++++++++ 2 files changed, 33 insertions(+), 2 deletions(-) diff --git a/library/src/com/handmark/pulltorefresh/library/PullToRefreshListView.java b/library/src/com/handmark/pulltorefresh/library/PullToRefreshListView.java index 17c1d7771..a94275f33 100644 --- a/library/src/com/handmark/pulltorefresh/library/PullToRefreshListView.java +++ b/library/src/com/handmark/pulltorefresh/library/PullToRefreshListView.java @@ -105,7 +105,8 @@ void onRefreshing(final boolean doScroll) { } // Hide our original Loading View - origLoadingView.setVisibility(View.INVISIBLE); + origLoadingView.reset(); + origLoadingView.hideAllViews(); // Make sure the opposite end is hidden too oppositeListViewLoadingView.setVisibility(View.GONE); @@ -169,7 +170,7 @@ void onReset() { if (listViewLoadingLayout.getVisibility() == View.VISIBLE) { // Set our Original View to Visible - originalLoadingLayout.setVisibility(View.VISIBLE); + originalLoadingLayout.showInvisibleViews(); // Hide the ListView Header/Footer listViewLoadingLayout.setVisibility(View.GONE); diff --git a/library/src/com/handmark/pulltorefresh/library/internal/LoadingLayout.java b/library/src/com/handmark/pulltorefresh/library/internal/LoadingLayout.java index 3c7d4541b..6a509bfda 100644 --- a/library/src/com/handmark/pulltorefresh/library/internal/LoadingLayout.java +++ b/library/src/com/handmark/pulltorefresh/library/internal/LoadingLayout.java @@ -192,6 +192,36 @@ public final void adjustWidthUsingRightPadding(final int width) { getPaddingBottom()); } + public final void hideAllViews() { + if (View.VISIBLE == mHeaderText.getVisibility()) { + mHeaderText.setVisibility(View.INVISIBLE); + } + if (View.VISIBLE == mHeaderProgress.getVisibility()) { + mHeaderProgress.setVisibility(View.INVISIBLE); + } + if (View.VISIBLE == mHeaderImage.getVisibility()) { + mHeaderImage.setVisibility(View.INVISIBLE); + } + if (View.VISIBLE == mSubHeaderText.getVisibility()) { + mSubHeaderText.setVisibility(View.INVISIBLE); + } + } + + public final void showInvisibleViews() { + if (View.INVISIBLE == mHeaderText.getVisibility()) { + mHeaderText.setVisibility(View.VISIBLE); + } + if (View.INVISIBLE == mHeaderProgress.getVisibility()) { + mHeaderProgress.setVisibility(View.VISIBLE); + } + if (View.INVISIBLE == mHeaderImage.getVisibility()) { + mHeaderImage.setVisibility(View.VISIBLE); + } + if (View.INVISIBLE == mSubHeaderText.getVisibility()) { + mSubHeaderText.setVisibility(View.VISIBLE); + } + } + public final void onPull(float scaleOfLayout) { if (!mUseIntrinsicAnimation) { onPullImpl(scaleOfLayout); From d0b3bfdbb0e2bb51986d0bb1a7f93f71d480168c Mon Sep 17 00:00:00 2001 From: Chris Banes Date: Thu, 20 Dec 2012 10:15:36 +0000 Subject: [PATCH 093/120] Fix Empty View being stretched. --- .../pulltorefresh/library/PullToRefreshAdapterViewBase.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/library/src/com/handmark/pulltorefresh/library/PullToRefreshAdapterViewBase.java b/library/src/com/handmark/pulltorefresh/library/PullToRefreshAdapterViewBase.java index 26ee40753..0222515d7 100644 --- a/library/src/com/handmark/pulltorefresh/library/PullToRefreshAdapterViewBase.java +++ b/library/src/com/handmark/pulltorefresh/library/PullToRefreshAdapterViewBase.java @@ -172,8 +172,7 @@ public final void setEmptyView(View newEmptyView) { ((ViewGroup) newEmptyViewParent).removeView(newEmptyView); } - refreshableViewWrapper.addView(newEmptyView, ViewGroup.LayoutParams.MATCH_PARENT, - ViewGroup.LayoutParams.MATCH_PARENT); + refreshableViewWrapper.addView(newEmptyView); } if (mRefreshableView instanceof EmptyViewMethodAccessor) { From d5f8146874cce149d8af9e02701f995baa1afd04 Mon Sep 17 00:00:00 2001 From: Chris Banes Date: Thu, 20 Dec 2012 10:38:55 +0000 Subject: [PATCH 094/120] Stop using Layout Weight and Instead set the Height manually --- .../library/PullToRefreshBase.java | 33 ++++++++++++------- 1 file changed, 22 insertions(+), 11 deletions(-) diff --git a/library/src/com/handmark/pulltorefresh/library/PullToRefreshBase.java b/library/src/com/handmark/pulltorefresh/library/PullToRefreshBase.java index ed76d2e56..1ea4f292b 100644 --- a/library/src/com/handmark/pulltorefresh/library/PullToRefreshBase.java +++ b/library/src/com/handmark/pulltorefresh/library/PullToRefreshBase.java @@ -691,6 +691,23 @@ final void refreshLoadingViewsSize() { setPadding(pLeft, pTop, pRight, pBottom); } + final void refreshRefreshableViewSize(int width, int height) { + // We need to set the Height of the Refreshable View to the same as + // this layout + LinearLayout.LayoutParams lp = (LinearLayout.LayoutParams) mRefreshableViewWrapper.getLayoutParams(); + + switch (getPullToRefreshScrollDirection()) { + case HORIZONTAL: + lp.width = width; + break; + case VERTICAL: + default: + lp.height = height; + break; + } + mRefreshableViewWrapper.requestLayout(); + } + final void setState(State state, final boolean... params) { mState = state; if (DEBUG) { @@ -902,6 +919,9 @@ protected final Parcelable onSaveInstanceState() { @Override protected void onSizeChanged(int w, int h, int oldw, int oldh) { + // Update the Refreshable View layout + refreshRefreshableViewSize(w, h); + // We need to update the header/footer when our size changes refreshLoadingViewsSize(); } @@ -999,17 +1019,8 @@ private void addRefreshableView(Context context, T refreshableView) { mRefreshableViewWrapper.addView(refreshableView, ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT); - switch (getPullToRefreshScrollDirection()) { - case HORIZONTAL: - addViewInternal(mRefreshableViewWrapper, new LinearLayout.LayoutParams(0, LayoutParams.MATCH_PARENT, - 1.0f)); - break; - case VERTICAL: - default: - addViewInternal(mRefreshableViewWrapper, new LinearLayout.LayoutParams(LayoutParams.MATCH_PARENT, 0, - 1.0f)); - break; - } + addViewInternal(mRefreshableViewWrapper, new LinearLayout.LayoutParams(LayoutParams.MATCH_PARENT, + LayoutParams.MATCH_PARENT)); } @SuppressWarnings("deprecation") From 2aad9d54cbb53e64cec5e533917561dc9e69b72c Mon Sep 17 00:00:00 2001 From: Chris Banes Date: Thu, 20 Dec 2012 13:46:17 +0000 Subject: [PATCH 095/120] Trying to improve the Layout mechanism. Still some way to go yet. --- .../pull_to_refresh_header_horizontal.xml | 34 ++- .../pull_to_refresh_header_vertical.xml | 76 ++++--- .../library/LoadingLayoutProxy.java | 10 +- .../library/PullToRefreshBase.java | 209 +++++++++--------- .../library/internal/LoadingLayout.java | 105 +++++---- 5 files changed, 228 insertions(+), 206 deletions(-) diff --git a/library/res/layout/pull_to_refresh_header_horizontal.xml b/library/res/layout/pull_to_refresh_header_horizontal.xml index 5e225c224..f05bb0338 100644 --- a/library/res/layout/pull_to_refresh_header_horizontal.xml +++ b/library/res/layout/pull_to_refresh_header_horizontal.xml @@ -1,19 +1,29 @@ - + android:layout_height="fill_parent" + android:paddingBottom="@dimen/header_footer_top_bottom_padding" + android:paddingLeft="@dimen/header_footer_left_right_padding" + android:paddingRight="@dimen/header_footer_left_right_padding" + android:paddingTop="@dimen/header_footer_top_bottom_padding" > - + + + + \ No newline at end of file diff --git a/library/res/layout/pull_to_refresh_header_vertical.xml b/library/res/layout/pull_to_refresh_header_vertical.xml index 8533c0b68..2185e2d6f 100644 --- a/library/res/layout/pull_to_refresh_header_vertical.xml +++ b/library/res/layout/pull_to_refresh_header_vertical.xml @@ -2,48 +2,58 @@ + android:paddingBottom="@dimen/header_footer_top_bottom_padding" + android:paddingLeft="@dimen/header_footer_left_right_padding" + android:paddingRight="@dimen/header_footer_left_right_padding" + android:paddingTop="@dimen/header_footer_top_bottom_padding" > - + android:layout_gravity="left|center_vertical" > - - + - + + - + android:layout_gravity="center" + android:gravity="center_horizontal" + android:orientation="vertical" > - - + + + + + \ No newline at end of file diff --git a/library/src/com/handmark/pulltorefresh/library/LoadingLayoutProxy.java b/library/src/com/handmark/pulltorefresh/library/LoadingLayoutProxy.java index ef26a2486..48eca91a5 100644 --- a/library/src/com/handmark/pulltorefresh/library/LoadingLayoutProxy.java +++ b/library/src/com/handmark/pulltorefresh/library/LoadingLayoutProxy.java @@ -9,11 +9,9 @@ public class LoadingLayoutProxy implements ILoadingLayout { - private final PullToRefreshBase mPullToRefreshView; private final HashSet mLoadingLayouts; - LoadingLayoutProxy(PullToRefreshBase pullToRefreshView) { - mPullToRefreshView = pullToRefreshView; + LoadingLayoutProxy() { mLoadingLayouts = new HashSet(); } @@ -28,8 +26,6 @@ public void setLastUpdatedLabel(CharSequence label) { for (LoadingLayout layout : mLoadingLayouts) { layout.setLastUpdatedLabel(label); } - - mPullToRefreshView.refreshLoadingViewsSize(); } @Override @@ -37,8 +33,6 @@ public void setLoadingDrawable(Drawable drawable) { for (LoadingLayout layout : mLoadingLayouts) { layout.setLoadingDrawable(drawable); } - - mPullToRefreshView.refreshLoadingViewsSize(); } @Override @@ -66,7 +60,5 @@ public void setTextTypeface(Typeface tf) { for (LoadingLayout layout : mLoadingLayouts) { layout.setTextTypeface(tf); } - - mPullToRefreshView.refreshLoadingViewsSize(); } } diff --git a/library/src/com/handmark/pulltorefresh/library/PullToRefreshBase.java b/library/src/com/handmark/pulltorefresh/library/PullToRefreshBase.java index 1ea4f292b..811d77a68 100644 --- a/library/src/com/handmark/pulltorefresh/library/PullToRefreshBase.java +++ b/library/src/com/handmark/pulltorefresh/library/PullToRefreshBase.java @@ -36,6 +36,7 @@ import com.handmark.pulltorefresh.library.internal.FlipLoadingLayout; import com.handmark.pulltorefresh.library.internal.LoadingLayout; +import com.handmark.pulltorefresh.library.internal.LoadingLayout.OnSizeChangedListener; import com.handmark.pulltorefresh.library.internal.RotateLoadingLayout; import com.handmark.pulltorefresh.library.internal.Utils; import com.handmark.pulltorefresh.library.internal.ViewCompat; @@ -46,7 +47,7 @@ public abstract class PullToRefreshBase extends LinearLayout imp // Constants // =========================================================== - static final boolean DEBUG = false; + static final boolean DEBUG = true; static final String LOG_TAG = "PullToRefresh"; @@ -632,82 +633,6 @@ void onReset() { smoothScrollTo(0); } - /** - * Re-measure the Loading Views height, and adjust internal padding as - * necessary - */ - final void refreshLoadingViewsSize() { - final int maximumPullScroll = (int) (getMaximumPullScroll() * 1.2f); - - mHeaderDimension = mFooterDimension = 0; - - int pLeft, pTop, pRight, pBottom; - pLeft = pTop = pRight = pBottom = 0; - - if (mMode.showHeaderLoadingLayout()) { - mHeaderLayout.resetForMeasure(); - measureView(mHeaderLayout); - - switch (getPullToRefreshScrollDirection()) { - case HORIZONTAL: - mHeaderDimension = mHeaderLayout.getMeasuredWidth(); - pLeft = -maximumPullScroll; - mHeaderLayout.adjustWidthUsingLeftPadding(maximumPullScroll); - break; - case VERTICAL: - default: - mHeaderDimension = mHeaderLayout.getMeasuredHeight(); - pTop = -maximumPullScroll; - mHeaderLayout.adjustHeightUsingTopPadding(maximumPullScroll); - break; - } - - // We need to re-measure with the new padding... - measureView(mHeaderLayout); - } - - if (mMode.showFooterLoadingLayout()) { - mFooterLayout.resetForMeasure(); - measureView(mFooterLayout); - - switch (getPullToRefreshScrollDirection()) { - case HORIZONTAL: - mFooterDimension = mFooterLayout.getMeasuredWidth(); - pRight = -maximumPullScroll; - mFooterLayout.adjustWidthUsingRightPadding(maximumPullScroll); - break; - case VERTICAL: - default: - mFooterDimension = mFooterLayout.getMeasuredHeight(); - pBottom = -maximumPullScroll; - mFooterLayout.adjustHeightUsingBottomPadding(maximumPullScroll); - break; - } - - // We need to re-measure with the new padding... - measureView(mFooterLayout); - } - - setPadding(pLeft, pTop, pRight, pBottom); - } - - final void refreshRefreshableViewSize(int width, int height) { - // We need to set the Height of the Refreshable View to the same as - // this layout - LinearLayout.LayoutParams lp = (LinearLayout.LayoutParams) mRefreshableViewWrapper.getLayoutParams(); - - switch (getPullToRefreshScrollDirection()) { - case HORIZONTAL: - lp.width = width; - break; - case VERTICAL: - default: - lp.height = height; - break; - } - mRefreshableViewWrapper.requestLayout(); - } - final void setState(State state, final boolean... params) { mState = state; if (DEBUG) { @@ -767,7 +692,7 @@ protected LoadingLayout createLoadingLayout(Context context, Mode mode, TypedArr * Allows derivative classes to include any extra LoadingLayouts. */ protected LoadingLayoutProxy createLoadingLayoutProxy(final boolean includeStart, final boolean includeEnd) { - LoadingLayoutProxy proxy = new LoadingLayoutProxy(this); + LoadingLayoutProxy proxy = new LoadingLayoutProxy(); if (includeStart && mMode.showHeaderLoadingLayout()) { proxy.addLayout(mHeaderLayout); @@ -919,11 +844,86 @@ protected final Parcelable onSaveInstanceState() { @Override protected void onSizeChanged(int w, int h, int oldw, int oldh) { + // We need to update the header/footer when our size changes + // refreshLoadingViewsSize(); + // Update the Refreshable View layout refreshRefreshableViewSize(w, h); + } - // We need to update the header/footer when our size changes - refreshLoadingViewsSize(); + /** + * Re-measure the Loading Views height, and adjust internal padding as + * necessary + */ + protected final void refreshLoadingViewsSize() { + final int maximumPullScroll = (int) (getMaximumPullScroll() * 1.2f); + + mHeaderDimension = mFooterDimension = 0; + + int pLeft = getPaddingLeft(); + int pTop = getPaddingTop(); + int pRight = getPaddingRight(); + int pBottom = getPaddingBottom(); + + switch (getPullToRefreshScrollDirection()) { + case HORIZONTAL: + if (mMode.showHeaderLoadingLayout() && mHeaderLayout.getWidth() > 0) { + mHeaderDimension = mHeaderLayout.getContentWidth(); + mHeaderLayout.setWidth(maximumPullScroll); + pLeft = -mHeaderLayout.getWidth(); + } else { + pLeft = 0; + } + + if (mMode.showFooterLoadingLayout() && mFooterLayout.getWidth() > 0) { + mFooterDimension = mFooterLayout.getContentWidth(); + mFooterLayout.setWidth(maximumPullScroll); + pRight = -mFooterLayout.getWidth(); + } else { + pRight = 0; + } + break; + + case VERTICAL: + if (mMode.showHeaderLoadingLayout() && mHeaderLayout.getHeight() > 0) { + mHeaderDimension = mHeaderLayout.getContentHeight(); + mHeaderLayout.setHeight(maximumPullScroll); + pTop = -mHeaderLayout.getHeight(); + } else { + pTop = 0; + } + + if (mMode.showFooterLoadingLayout() && mFooterLayout.getHeight() > 0) { + mFooterDimension = mFooterLayout.getContentHeight(); + mFooterLayout.setHeight(maximumPullScroll); + pBottom = -mFooterLayout.getHeight(); + } else { + pBottom = 0; + } + break; + } + + if (DEBUG) { + Log.d(LOG_TAG, String.format("Setting Padding. L: %d, T: %d, R: %d, B: %d", pLeft, pTop, pRight, pBottom)); + } + setPadding(pLeft, pTop, pRight, pBottom); + } + + protected final void refreshRefreshableViewSize(int width, int height) { + // We need to set the Height of the Refreshable View to the same as + // this layout + LinearLayout.LayoutParams lp = (LinearLayout.LayoutParams) mRefreshableViewWrapper.getLayoutParams(); + + switch (getPullToRefreshScrollDirection()) { + case HORIZONTAL: + lp.width = width; + break; + case VERTICAL: + default: + lp.height = height; + break; + } + mRefreshableViewWrapper.requestLayout(); } /** @@ -933,6 +933,10 @@ protected void onSizeChanged(int w, int h, int oldw, int oldh) { * @param value - New Scroll value */ protected final void setHeaderScroll(final int value) { + if (DEBUG) { + Log.d(LOG_TAG, "setHeaderScroll: " + value); + } + if (mLayoutVisibilityChangesEnabled) { if (value < 0) { mHeaderLayout.setVisibility(View.VISIBLE); @@ -1061,6 +1065,10 @@ private void init(Context context, AttributeSet attrs) { mHeaderLayout = createLoadingLayout(context, Mode.PULL_FROM_START, a); mFooterLayout = createLoadingLayout(context, Mode.PULL_FROM_END, a); + LoadingLayout.OnSizeChangedListener listener = new OnLoadingLayoutSizeChangedListener(); + mHeaderLayout.setOnSizeChangedListener(listener); + mFooterLayout.setOnSizeChangedListener(listener); + /** * Styleables from XML */ @@ -1108,29 +1116,6 @@ private boolean isReadyForPull() { } } - private void measureView(View child) { - ViewGroup.LayoutParams p = child.getLayoutParams(); - if (p == null) { - p = getLoadingLayoutLayoutParams(); - } - - int childWidthSpec, childHeightSpec; - - if (p.width == ViewGroup.LayoutParams.MATCH_PARENT) { - childWidthSpec = MeasureSpec.makeMeasureSpec(getWidth(), MeasureSpec.EXACTLY); - } else { - childWidthSpec = MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED); - } - - if (p.height == ViewGroup.LayoutParams.MATCH_PARENT) { - childHeightSpec = MeasureSpec.makeMeasureSpec(getHeight(), MeasureSpec.EXACTLY); - } else { - childHeightSpec = MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED); - } - - child.measure(childWidthSpec, childHeightSpec); - } - /** * Actions a Pull Event * @@ -1408,6 +1393,10 @@ int getIntValue() { } + // =========================================================== + // Inner, Anonymous Classes, and Enumerations + // =========================================================== + /** * Simple Listener that allows you to be notified when the user has scrolled * to the end of the AdapterView. See ( @@ -1424,9 +1413,17 @@ public static interface OnLastItemVisibleListener { } - // =========================================================== - // Inner and Anonymous Classes - // =========================================================== + final class OnLoadingLayoutSizeChangedListener implements OnSizeChangedListener { + + @Override + public void onSizeChanged(View view, int newWidth, int newHeight) { + if (DEBUG) { + String viewString = view == mHeaderLayout ? "Header" : "Footer"; + Log.d(LOG_TAG, "onSizeChanged. " + viewString + ": " + newWidth + " x " + newHeight); + } + refreshLoadingViewsSize(); + } + } /** * Listener that allows you to be notified when the user has started or diff --git a/library/src/com/handmark/pulltorefresh/library/internal/LoadingLayout.java b/library/src/com/handmark/pulltorefresh/library/internal/LoadingLayout.java index 6a509bfda..c8c41e42d 100644 --- a/library/src/com/handmark/pulltorefresh/library/internal/LoadingLayout.java +++ b/library/src/com/handmark/pulltorefresh/library/internal/LoadingLayout.java @@ -18,15 +18,16 @@ import android.annotation.SuppressLint; import android.content.Context; import android.content.res.ColorStateList; -import android.content.res.Resources; import android.content.res.TypedArray; import android.graphics.Typeface; import android.graphics.drawable.AnimationDrawable; import android.graphics.drawable.Drawable; import android.text.TextUtils; import android.util.TypedValue; +import android.view.Gravity; import android.view.LayoutInflater; import android.view.View; +import android.view.ViewGroup; import android.view.animation.Interpolator; import android.view.animation.LinearInterpolator; import android.widget.FrameLayout; @@ -46,6 +47,8 @@ public abstract class LoadingLayout extends FrameLayout implements ILoadingLayou static final Interpolator ANIMATION_INTERPOLATOR = new LinearInterpolator(); + private FrameLayout mInnerLayout; + protected final ImageView mHeaderImage; protected final ProgressBar mHeaderProgress; @@ -61,13 +64,13 @@ public abstract class LoadingLayout extends FrameLayout implements ILoadingLayou private CharSequence mRefreshingLabel; private CharSequence mReleaseLabel; + private OnSizeChangedListener mSizeChangedListener; + public LoadingLayout(Context context, final Mode mode, final Orientation scrollDirection, TypedArray attrs) { super(context); mMode = mode; mScrollDirection = scrollDirection; - resetPadding(); - switch (scrollDirection) { case HORIZONTAL: LayoutInflater.from(context).inflate(R.layout.pull_to_refresh_header_horizontal, this); @@ -78,13 +81,18 @@ public LoadingLayout(Context context, final Mode mode, final Orientation scrollD break; } - mHeaderText = (TextView) findViewById(R.id.pull_to_refresh_text); - mHeaderProgress = (ProgressBar) findViewById(R.id.pull_to_refresh_progress); - mSubHeaderText = (TextView) findViewById(R.id.pull_to_refresh_sub_text); - mHeaderImage = (ImageView) findViewById(R.id.pull_to_refresh_image); + mInnerLayout = (FrameLayout) findViewById(R.id.fl_inner); + mHeaderText = (TextView) mInnerLayout.findViewById(R.id.pull_to_refresh_text); + mHeaderProgress = (ProgressBar) mInnerLayout.findViewById(R.id.pull_to_refresh_progress); + mSubHeaderText = (TextView) mInnerLayout.findViewById(R.id.pull_to_refresh_sub_text); + mHeaderImage = (ImageView) mInnerLayout.findViewById(R.id.pull_to_refresh_image); + + FrameLayout.LayoutParams lp = (FrameLayout.LayoutParams) mInnerLayout.getLayoutParams(); switch (mode) { case PULL_FROM_END: + lp.gravity = scrollDirection == Orientation.VERTICAL ? Gravity.TOP : Gravity.LEFT; + // Load in labels mPullLabel = context.getString(R.string.pull_to_refresh_from_bottom_pull_label); mRefreshingLabel = context.getString(R.string.pull_to_refresh_from_bottom_refreshing_label); @@ -93,6 +101,8 @@ public LoadingLayout(Context context, final Mode mode, final Orientation scrollD case PULL_FROM_START: default: + lp.gravity = scrollDirection == Orientation.VERTICAL ? Gravity.BOTTOM : Gravity.RIGHT; + // Load in labels mPullLabel = context.getString(R.string.pull_to_refresh_pull_label); mRefreshingLabel = context.getString(R.string.pull_to_refresh_refreshing_label); @@ -172,24 +182,22 @@ public LoadingLayout(Context context, final Mode mode, final Orientation scrollD reset(); } - public final void adjustHeightUsingBottomPadding(final int height) { - setPadding(getPaddingLeft(), getPaddingTop(), getPaddingRight(), getPaddingBottom() + height - - getMeasuredHeight()); + public final void setHeight(int height) { + ViewGroup.LayoutParams lp = (ViewGroup.LayoutParams) getLayoutParams(); + lp.height = height; } - public final void adjustHeightUsingTopPadding(final int height) { - setPadding(getPaddingLeft(), getPaddingTop() + height - getMeasuredHeight(), getPaddingRight(), - getPaddingBottom()); + public final void setWidth(int width) { + ViewGroup.LayoutParams lp = (ViewGroup.LayoutParams) getLayoutParams(); + lp.width = width; } - public final void adjustWidthUsingLeftPadding(final int width) { - setPadding(getPaddingLeft() + width - getMeasuredWidth(), getPaddingTop(), getPaddingRight(), - getPaddingBottom()); + public final int getContentHeight() { + return mInnerLayout.getHeight(); } - public final void adjustWidthUsingRightPadding(final int width) { - setPadding(getPaddingLeft(), getPaddingTop(), getPaddingRight() + width - getMeasuredWidth(), - getPaddingBottom()); + public final int getContentWidth() { + return mInnerLayout.getWidth(); } public final void hideAllViews() { @@ -207,27 +215,21 @@ public final void hideAllViews() { } } - public final void showInvisibleViews() { - if (View.INVISIBLE == mHeaderText.getVisibility()) { - mHeaderText.setVisibility(View.VISIBLE); - } - if (View.INVISIBLE == mHeaderProgress.getVisibility()) { - mHeaderProgress.setVisibility(View.VISIBLE); - } - if (View.INVISIBLE == mHeaderImage.getVisibility()) { - mHeaderImage.setVisibility(View.VISIBLE); - } - if (View.INVISIBLE == mSubHeaderText.getVisibility()) { - mSubHeaderText.setVisibility(View.VISIBLE); - } - } - public final void onPull(float scaleOfLayout) { if (!mUseIntrinsicAnimation) { onPullImpl(scaleOfLayout); } } + @Override + public final void onSizeChanged(int w, int h, int oldw, int oldh) { + super.onSizeChanged(w, h, oldw, oldh); + + if (null != mSizeChangedListener) { + mSizeChangedListener.onSizeChanged(this, w, h); + } + } + public final void pullToRefresh() { if (null != mHeaderText) { mHeaderText.setText(mPullLabel); @@ -285,10 +287,6 @@ public final void reset() { } } - public final void resetForMeasure() { - resetPadding(); - } - @Override public void setLastUpdatedLabel(CharSequence label) { setSubHeaderText(label); @@ -303,6 +301,10 @@ public final void setLoadingDrawable(Drawable imageDrawable) { onLoadingDrawableSet(imageDrawable); } + public void setOnSizeChangedListener(OnSizeChangedListener sizeChangedListener) { + mSizeChangedListener = sizeChangedListener; + } + public void setPullLabel(CharSequence pullLabel) { mPullLabel = pullLabel; } @@ -320,6 +322,21 @@ public void setTextTypeface(Typeface tf) { mHeaderText.setTypeface(tf); } + public final void showInvisibleViews() { + if (View.INVISIBLE == mHeaderText.getVisibility()) { + mHeaderText.setVisibility(View.VISIBLE); + } + if (View.INVISIBLE == mHeaderProgress.getVisibility()) { + mHeaderProgress.setVisibility(View.VISIBLE); + } + if (View.INVISIBLE == mHeaderImage.getVisibility()) { + mHeaderImage.setVisibility(View.VISIBLE); + } + if (View.INVISIBLE == mSubHeaderText.getVisibility()) { + mSubHeaderText.setVisibility(View.VISIBLE); + } + } + /** * Callbacks for derivative Layouts */ @@ -338,14 +355,6 @@ public void setTextTypeface(Typeface tf) { protected abstract void resetImpl(); - private void resetPadding() { - Resources res = getResources(); - final int tbPadding = res.getDimensionPixelSize(R.dimen.header_footer_top_bottom_padding); - final int lrPadding = res.getDimensionPixelSize(R.dimen.header_footer_left_right_padding); - setPadding(lrPadding, tbPadding, lrPadding, tbPadding); - - } - private void setSubHeaderText(CharSequence label) { if (null != mSubHeaderText) { if (TextUtils.isEmpty(label)) { @@ -387,4 +396,8 @@ private void setTextColor(ColorStateList color) { } } + public static interface OnSizeChangedListener { + void onSizeChanged(View view, int newWidth, int newHeight); + } + } From dbaadb21a53fa07c4d248cb0eb5b50aa04df3d67 Mon Sep 17 00:00:00 2001 From: Chris Banes Date: Fri, 21 Dec 2012 09:50:49 +0000 Subject: [PATCH 096/120] Move FrameLayout layout callback to separate file --- .../library/PullToRefreshBase.java | 18 ++++++--- .../library/internal/CallbackFrameLayout.java | 37 +++++++++++++++++++ .../library/internal/LoadingLayout.java | 23 ++---------- 3 files changed, 53 insertions(+), 25 deletions(-) create mode 100644 library/src/com/handmark/pulltorefresh/library/internal/CallbackFrameLayout.java diff --git a/library/src/com/handmark/pulltorefresh/library/PullToRefreshBase.java b/library/src/com/handmark/pulltorefresh/library/PullToRefreshBase.java index 811d77a68..a679714de 100644 --- a/library/src/com/handmark/pulltorefresh/library/PullToRefreshBase.java +++ b/library/src/com/handmark/pulltorefresh/library/PullToRefreshBase.java @@ -34,9 +34,9 @@ import android.widget.FrameLayout; import android.widget.LinearLayout; +import com.handmark.pulltorefresh.library.internal.CallbackFrameLayout.OnSizeChangedListener; import com.handmark.pulltorefresh.library.internal.FlipLoadingLayout; import com.handmark.pulltorefresh.library.internal.LoadingLayout; -import com.handmark.pulltorefresh.library.internal.LoadingLayout.OnSizeChangedListener; import com.handmark.pulltorefresh.library.internal.RotateLoadingLayout; import com.handmark.pulltorefresh.library.internal.Utils; import com.handmark.pulltorefresh.library.internal.ViewCompat; @@ -910,20 +910,28 @@ protected final void refreshLoadingViewsSize() { } protected final void refreshRefreshableViewSize(int width, int height) { + if (DEBUG) { + Log.d(LOG_TAG, String.format("refreshRefreshableViewSize. W: %d, H: %d", width, height)); + } + // We need to set the Height of the Refreshable View to the same as // this layout LinearLayout.LayoutParams lp = (LinearLayout.LayoutParams) mRefreshableViewWrapper.getLayoutParams(); switch (getPullToRefreshScrollDirection()) { case HORIZONTAL: - lp.width = width; + if (lp.weight != width) { + lp.width = width; + mRefreshableViewWrapper.requestLayout(); + } break; case VERTICAL: - default: - lp.height = height; + if (lp.height != height) { + lp.height = height; + mRefreshableViewWrapper.requestLayout(); + } break; } - mRefreshableViewWrapper.requestLayout(); } /** diff --git a/library/src/com/handmark/pulltorefresh/library/internal/CallbackFrameLayout.java b/library/src/com/handmark/pulltorefresh/library/internal/CallbackFrameLayout.java new file mode 100644 index 000000000..cc1f7f223 --- /dev/null +++ b/library/src/com/handmark/pulltorefresh/library/internal/CallbackFrameLayout.java @@ -0,0 +1,37 @@ +package com.handmark.pulltorefresh.library.internal; + +import android.content.Context; +import android.util.AttributeSet; +import android.view.View; +import android.widget.FrameLayout; + +public class CallbackFrameLayout extends FrameLayout { + + private OnSizeChangedListener mSizeChangedListener; + + public CallbackFrameLayout(Context context) { + super(context); + } + + public CallbackFrameLayout(Context context, AttributeSet attrs) { + super(context, attrs); + } + + @Override + public final void onSizeChanged(int w, int h, int oldw, int oldh) { + super.onSizeChanged(w, h, oldw, oldh); + + if (null != mSizeChangedListener) { + mSizeChangedListener.onSizeChanged(this, w, h); + } + } + + public void setOnSizeChangedListener(OnSizeChangedListener listener) { + mSizeChangedListener = listener; + } + + public static interface OnSizeChangedListener { + void onSizeChanged(View view, int newWidth, int newHeight); + } + +} diff --git a/library/src/com/handmark/pulltorefresh/library/internal/LoadingLayout.java b/library/src/com/handmark/pulltorefresh/library/internal/LoadingLayout.java index c8c41e42d..21f7c9556 100644 --- a/library/src/com/handmark/pulltorefresh/library/internal/LoadingLayout.java +++ b/library/src/com/handmark/pulltorefresh/library/internal/LoadingLayout.java @@ -41,7 +41,7 @@ import com.handmark.pulltorefresh.library.R; @SuppressLint("ViewConstructor") -public abstract class LoadingLayout extends FrameLayout implements ILoadingLayout { +public abstract class LoadingLayout extends CallbackFrameLayout implements ILoadingLayout { static final String LOG_TAG = "PullToRefresh-LoadingLayout"; @@ -64,8 +64,6 @@ public abstract class LoadingLayout extends FrameLayout implements ILoadingLayou private CharSequence mRefreshingLabel; private CharSequence mReleaseLabel; - private OnSizeChangedListener mSizeChangedListener; - public LoadingLayout(Context context, final Mode mode, final Orientation scrollDirection, TypedArray attrs) { super(context); mMode = mode; @@ -185,11 +183,13 @@ public LoadingLayout(Context context, final Mode mode, final Orientation scrollD public final void setHeight(int height) { ViewGroup.LayoutParams lp = (ViewGroup.LayoutParams) getLayoutParams(); lp.height = height; + requestLayout(); } public final void setWidth(int width) { ViewGroup.LayoutParams lp = (ViewGroup.LayoutParams) getLayoutParams(); lp.width = width; + requestLayout(); } public final int getContentHeight() { @@ -221,15 +221,6 @@ public final void onPull(float scaleOfLayout) { } } - @Override - public final void onSizeChanged(int w, int h, int oldw, int oldh) { - super.onSizeChanged(w, h, oldw, oldh); - - if (null != mSizeChangedListener) { - mSizeChangedListener.onSizeChanged(this, w, h); - } - } - public final void pullToRefresh() { if (null != mHeaderText) { mHeaderText.setText(mPullLabel); @@ -301,10 +292,6 @@ public final void setLoadingDrawable(Drawable imageDrawable) { onLoadingDrawableSet(imageDrawable); } - public void setOnSizeChangedListener(OnSizeChangedListener sizeChangedListener) { - mSizeChangedListener = sizeChangedListener; - } - public void setPullLabel(CharSequence pullLabel) { mPullLabel = pullLabel; } @@ -396,8 +383,4 @@ private void setTextColor(ColorStateList color) { } } - public static interface OnSizeChangedListener { - void onSizeChanged(View view, int newWidth, int newHeight); - } - } From df078d70058e9d56ca19092cd06f9695ad3550cc Mon Sep 17 00:00:00 2001 From: Chris Banes Date: Fri, 21 Dec 2012 10:27:57 +0000 Subject: [PATCH 097/120] Getting there --- .../library/PullToRefreshBase.java | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/library/src/com/handmark/pulltorefresh/library/PullToRefreshBase.java b/library/src/com/handmark/pulltorefresh/library/PullToRefreshBase.java index a679714de..c26a8207f 100644 --- a/library/src/com/handmark/pulltorefresh/library/PullToRefreshBase.java +++ b/library/src/com/handmark/pulltorefresh/library/PullToRefreshBase.java @@ -844,6 +844,7 @@ protected final Parcelable onSaveInstanceState() { @Override protected void onSizeChanged(int w, int h, int oldw, int oldh) { + super.onSizeChanged(w, h, oldw, oldh); // We need to update the header/footer when our size changes // refreshLoadingViewsSize(); @@ -913,7 +914,7 @@ protected final void refreshRefreshableViewSize(int width, int height) { if (DEBUG) { Log.d(LOG_TAG, String.format("refreshRefreshableViewSize. W: %d, H: %d", width, height)); } - + // We need to set the Height of the Refreshable View to the same as // this layout LinearLayout.LayoutParams lp = (LinearLayout.LayoutParams) mRefreshableViewWrapper.getLayoutParams(); @@ -961,7 +962,7 @@ protected final void setHeaderScroll(final int value) { * all. We don't use them on the Header/Footer Views as they change * often, which would negate any HW layer performance boost. */ - ViewCompat.setLayerType(mRefreshableViewWrapper, value != 0 ? View.LAYER_TYPE_HARDWARE : View.LAYER_TYPE_NONE); + //ViewCompat.setLayerType(mRefreshableViewWrapper, value != 0 ? View.LAYER_TYPE_HARDWARE : View.LAYER_TYPE_NONE); switch (getPullToRefreshScrollDirection()) { case VERTICAL: @@ -1429,7 +1430,17 @@ public void onSizeChanged(View view, int newWidth, int newHeight) { String viewString = view == mHeaderLayout ? "Header" : "Footer"; Log.d(LOG_TAG, "onSizeChanged. " + viewString + ": " + newWidth + " x " + newHeight); } - refreshLoadingViewsSize(); + + /** + * We're currently in a layout pass, so we need to post so it gets + * called after the pass has finished. + */ + post(new Runnable() { + @Override + public void run() { + refreshLoadingViewsSize(); + } + }); } } From 342999881034ebd9fc2c113817b5ddfad7940461 Mon Sep 17 00:00:00 2001 From: Chris Banes Date: Fri, 21 Dec 2012 10:56:32 +0000 Subject: [PATCH 098/120] Finally, got an optimised layout routine --- .../library/PullToRefreshBase.java | 30 ++++++++++--------- 1 file changed, 16 insertions(+), 14 deletions(-) diff --git a/library/src/com/handmark/pulltorefresh/library/PullToRefreshBase.java b/library/src/com/handmark/pulltorefresh/library/PullToRefreshBase.java index c26a8207f..eb3d91d00 100644 --- a/library/src/com/handmark/pulltorefresh/library/PullToRefreshBase.java +++ b/library/src/com/handmark/pulltorefresh/library/PullToRefreshBase.java @@ -843,10 +843,11 @@ protected final Parcelable onSaveInstanceState() { } @Override - protected void onSizeChanged(int w, int h, int oldw, int oldh) { + protected final void onSizeChanged(int w, int h, int oldw, int oldh) { super.onSizeChanged(w, h, oldw, oldh); + // We need to update the header/footer when our size changes - // refreshLoadingViewsSize(); + refreshLoadingViewsSize(); // Update the Refreshable View layout refreshRefreshableViewSize(w, h); @@ -868,36 +869,36 @@ protected final void refreshLoadingViewsSize() { switch (getPullToRefreshScrollDirection()) { case HORIZONTAL: - if (mMode.showHeaderLoadingLayout() && mHeaderLayout.getWidth() > 0) { + if (mMode.showHeaderLoadingLayout()) { mHeaderDimension = mHeaderLayout.getContentWidth(); mHeaderLayout.setWidth(maximumPullScroll); - pLeft = -mHeaderLayout.getWidth(); + pLeft = -maximumPullScroll; } else { pLeft = 0; } - if (mMode.showFooterLoadingLayout() && mFooterLayout.getWidth() > 0) { + if (mMode.showFooterLoadingLayout()) { mFooterDimension = mFooterLayout.getContentWidth(); mFooterLayout.setWidth(maximumPullScroll); - pRight = -mFooterLayout.getWidth(); + pRight = -maximumPullScroll; } else { pRight = 0; } break; case VERTICAL: - if (mMode.showHeaderLoadingLayout() && mHeaderLayout.getHeight() > 0) { + if (mMode.showHeaderLoadingLayout()) { mHeaderDimension = mHeaderLayout.getContentHeight(); mHeaderLayout.setHeight(maximumPullScroll); - pTop = -mHeaderLayout.getHeight(); + pTop = -maximumPullScroll; } else { pTop = 0; } - if (mMode.showFooterLoadingLayout() && mFooterLayout.getHeight() > 0) { + if (mMode.showFooterLoadingLayout()) { mFooterDimension = mFooterLayout.getContentHeight(); mFooterLayout.setHeight(maximumPullScroll); - pBottom = -mFooterLayout.getHeight(); + pBottom = -maximumPullScroll; } else { pBottom = 0; } @@ -962,7 +963,7 @@ protected final void setHeaderScroll(final int value) { * all. We don't use them on the Header/Footer Views as they change * often, which would negate any HW layer performance boost. */ - //ViewCompat.setLayerType(mRefreshableViewWrapper, value != 0 ? View.LAYER_TYPE_HARDWARE : View.LAYER_TYPE_NONE); + ViewCompat.setLayerType(mRefreshableViewWrapper, value != 0 ? View.LAYER_TYPE_HARDWARE : View.LAYER_TYPE_NONE); switch (getPullToRefreshScrollDirection()) { case VERTICAL: @@ -1074,9 +1075,10 @@ private void init(Context context, AttributeSet attrs) { mHeaderLayout = createLoadingLayout(context, Mode.PULL_FROM_START, a); mFooterLayout = createLoadingLayout(context, Mode.PULL_FROM_END, a); - LoadingLayout.OnSizeChangedListener listener = new OnLoadingLayoutSizeChangedListener(); - mHeaderLayout.setOnSizeChangedListener(listener); - mFooterLayout.setOnSizeChangedListener(listener); + // LoadingLayout.OnSizeChangedListener listener = new + // OnLoadingLayoutSizeChangedListener(); + // mHeaderLayout.setOnSizeChangedListener(listener); + // mFooterLayout.setOnSizeChangedListener(listener); /** * Styleables from XML From 1ff49a0b6e1973b633adb9eda5a09b90ea4367f8 Mon Sep 17 00:00:00 2001 From: Chris Banes Date: Fri, 21 Dec 2012 11:04:55 +0000 Subject: [PATCH 099/120] New Layout mechanism is now finished --- .../library/PullToRefreshBase.java | 61 ++++--------------- .../library/PullToRefreshListView.java | 8 +-- .../library/internal/CallbackFrameLayout.java | 37 ----------- .../library/internal/LoadingLayout.java | 16 ++--- 4 files changed, 25 insertions(+), 97 deletions(-) delete mode 100644 library/src/com/handmark/pulltorefresh/library/internal/CallbackFrameLayout.java diff --git a/library/src/com/handmark/pulltorefresh/library/PullToRefreshBase.java b/library/src/com/handmark/pulltorefresh/library/PullToRefreshBase.java index eb3d91d00..0f92afaa6 100644 --- a/library/src/com/handmark/pulltorefresh/library/PullToRefreshBase.java +++ b/library/src/com/handmark/pulltorefresh/library/PullToRefreshBase.java @@ -34,7 +34,6 @@ import android.widget.FrameLayout; import android.widget.LinearLayout; -import com.handmark.pulltorefresh.library.internal.CallbackFrameLayout.OnSizeChangedListener; import com.handmark.pulltorefresh.library.internal.FlipLoadingLayout; import com.handmark.pulltorefresh.library.internal.LoadingLayout; import com.handmark.pulltorefresh.library.internal.RotateLoadingLayout; @@ -92,9 +91,6 @@ public abstract class PullToRefreshBase extends LinearLayout imp private LoadingLayout mHeaderLayout; private LoadingLayout mFooterLayout; - private int mHeaderDimension; - private int mFooterDimension; - private OnRefreshListener mOnRefreshListener; private OnRefreshListener2 mOnRefreshListener2; private OnPullEventListener mOnPullEventListener; @@ -146,10 +142,10 @@ public void addView(View child, int index, ViewGroup.LayoutParams params) { @Override public final boolean demo() { if (mMode.showHeaderLoadingLayout() && isReadyForPullStart()) { - smoothScrollToAndBack(-mHeaderDimension * 2); + smoothScrollToAndBack(-getHeaderSize() * 2); return true; } else if (mMode.showFooterLoadingLayout() && isReadyForPullEnd()) { - smoothScrollToAndBack(mFooterDimension * 2); + smoothScrollToAndBack(getFooterSize() * 2); return true; } @@ -587,11 +583,11 @@ void onRefreshing(final boolean doScroll) { switch (mCurrentMode) { case MANUAL_REFRESH_ONLY: case PULL_FROM_END: - smoothScrollTo(mFooterDimension); + smoothScrollTo(getFooterSize()); break; default: case PULL_FROM_START: - smoothScrollTo(-mHeaderDimension); + smoothScrollTo(-getHeaderSize()); break; } } else { @@ -724,22 +720,22 @@ protected final void disableLoadingLayoutVisibilityChanges() { mLayoutVisibilityChangesEnabled = false; } - protected final int getFooterHeight() { - return mFooterDimension; - } - protected final LoadingLayout getFooterLayout() { return mFooterLayout; } - protected final int getHeaderHeight() { - return mHeaderDimension; + protected final int getFooterSize() { + return mFooterLayout.getContentSize(); } protected final LoadingLayout getHeaderLayout() { return mHeaderLayout; } + protected final int getHeaderSize() { + return mHeaderLayout.getContentSize(); + } + protected int getPullToRefreshScrollDuration() { return SMOOTH_SCROLL_DURATION_MS; } @@ -860,8 +856,6 @@ protected final void onSizeChanged(int w, int h, int oldw, int oldh) { protected final void refreshLoadingViewsSize() { final int maximumPullScroll = (int) (getMaximumPullScroll() * 1.2f); - mHeaderDimension = mFooterDimension = 0; - int pLeft = getPaddingLeft(); int pTop = getPaddingTop(); int pRight = getPaddingRight(); @@ -870,7 +864,6 @@ protected final void refreshLoadingViewsSize() { switch (getPullToRefreshScrollDirection()) { case HORIZONTAL: if (mMode.showHeaderLoadingLayout()) { - mHeaderDimension = mHeaderLayout.getContentWidth(); mHeaderLayout.setWidth(maximumPullScroll); pLeft = -maximumPullScroll; } else { @@ -878,7 +871,6 @@ protected final void refreshLoadingViewsSize() { } if (mMode.showFooterLoadingLayout()) { - mFooterDimension = mFooterLayout.getContentWidth(); mFooterLayout.setWidth(maximumPullScroll); pRight = -maximumPullScroll; } else { @@ -888,7 +880,6 @@ protected final void refreshLoadingViewsSize() { case VERTICAL: if (mMode.showHeaderLoadingLayout()) { - mHeaderDimension = mHeaderLayout.getContentHeight(); mHeaderLayout.setHeight(maximumPullScroll); pTop = -maximumPullScroll; } else { @@ -896,7 +887,6 @@ protected final void refreshLoadingViewsSize() { } if (mMode.showFooterLoadingLayout()) { - mFooterDimension = mFooterLayout.getContentHeight(); mFooterLayout.setHeight(maximumPullScroll); pBottom = -maximumPullScroll; } else { @@ -1075,11 +1065,6 @@ private void init(Context context, AttributeSet attrs) { mHeaderLayout = createLoadingLayout(context, Mode.PULL_FROM_START, a); mFooterLayout = createLoadingLayout(context, Mode.PULL_FROM_END, a); - // LoadingLayout.OnSizeChangedListener listener = new - // OnLoadingLayoutSizeChangedListener(); - // mHeaderLayout.setOnSizeChangedListener(listener); - // mFooterLayout.setOnSizeChangedListener(listener); - /** * Styleables from XML */ @@ -1153,12 +1138,12 @@ private void pullEvent() { switch (mCurrentMode) { case PULL_FROM_END: newScrollValue = Math.round(Math.max(initialMotionValue - lastMotionValue, 0) / FRICTION); - itemDimension = mFooterDimension; + itemDimension = getFooterSize(); break; case PULL_FROM_START: default: newScrollValue = Math.round(Math.min(initialMotionValue - lastMotionValue, 0) / FRICTION); - itemDimension = mHeaderDimension; + itemDimension = getHeaderSize(); break; } @@ -1424,28 +1409,6 @@ public static interface OnLastItemVisibleListener { } - final class OnLoadingLayoutSizeChangedListener implements OnSizeChangedListener { - - @Override - public void onSizeChanged(View view, int newWidth, int newHeight) { - if (DEBUG) { - String viewString = view == mHeaderLayout ? "Header" : "Footer"; - Log.d(LOG_TAG, "onSizeChanged. " + viewString + ": " + newWidth + " x " + newHeight); - } - - /** - * We're currently in a layout pass, so we need to post so it gets - * called after the pass has finished. - */ - post(new Runnable() { - @Override - public void run() { - refreshLoadingViewsSize(); - } - }); - } - } - /** * Listener that allows you to be notified when the user has started or * finished a touch event. Useful when you want to append extra UI events diff --git a/library/src/com/handmark/pulltorefresh/library/PullToRefreshListView.java b/library/src/com/handmark/pulltorefresh/library/PullToRefreshListView.java index a94275f33..cef937b8b 100644 --- a/library/src/com/handmark/pulltorefresh/library/PullToRefreshListView.java +++ b/library/src/com/handmark/pulltorefresh/library/PullToRefreshListView.java @@ -92,7 +92,7 @@ void onRefreshing(final boolean doScroll) { listViewLoadingView = mFooterLoadingView; oppositeListViewLoadingView = mHeaderLoadingView; selection = mRefreshableView.getCount() - 1; - scrollToY = getScrollY() - getFooterHeight(); + scrollToY = getScrollY() - getFooterSize(); break; case PULL_FROM_START: default: @@ -100,7 +100,7 @@ void onRefreshing(final boolean doScroll) { listViewLoadingView = mHeaderLoadingView; oppositeListViewLoadingView = mFooterLoadingView; selection = 0; - scrollToY = getScrollY() + getHeaderHeight(); + scrollToY = getScrollY() + getHeaderSize(); break; } @@ -152,14 +152,14 @@ void onReset() { originalLoadingLayout = getFooterLayout(); listViewLoadingLayout = mFooterLoadingView; selection = mRefreshableView.getCount() - 1; - scrollToHeight = getFooterHeight(); + scrollToHeight = getFooterSize(); scrollLvToEdge = Math.abs(mRefreshableView.getLastVisiblePosition() - selection) <= 1; break; case PULL_FROM_START: default: originalLoadingLayout = getHeaderLayout(); listViewLoadingLayout = mHeaderLoadingView; - scrollToHeight = -getHeaderHeight(); + scrollToHeight = -getHeaderSize(); selection = 0; scrollLvToEdge = Math.abs(mRefreshableView.getFirstVisiblePosition() - selection) <= 1; break; diff --git a/library/src/com/handmark/pulltorefresh/library/internal/CallbackFrameLayout.java b/library/src/com/handmark/pulltorefresh/library/internal/CallbackFrameLayout.java deleted file mode 100644 index cc1f7f223..000000000 --- a/library/src/com/handmark/pulltorefresh/library/internal/CallbackFrameLayout.java +++ /dev/null @@ -1,37 +0,0 @@ -package com.handmark.pulltorefresh.library.internal; - -import android.content.Context; -import android.util.AttributeSet; -import android.view.View; -import android.widget.FrameLayout; - -public class CallbackFrameLayout extends FrameLayout { - - private OnSizeChangedListener mSizeChangedListener; - - public CallbackFrameLayout(Context context) { - super(context); - } - - public CallbackFrameLayout(Context context, AttributeSet attrs) { - super(context, attrs); - } - - @Override - public final void onSizeChanged(int w, int h, int oldw, int oldh) { - super.onSizeChanged(w, h, oldw, oldh); - - if (null != mSizeChangedListener) { - mSizeChangedListener.onSizeChanged(this, w, h); - } - } - - public void setOnSizeChangedListener(OnSizeChangedListener listener) { - mSizeChangedListener = listener; - } - - public static interface OnSizeChangedListener { - void onSizeChanged(View view, int newWidth, int newHeight); - } - -} diff --git a/library/src/com/handmark/pulltorefresh/library/internal/LoadingLayout.java b/library/src/com/handmark/pulltorefresh/library/internal/LoadingLayout.java index 21f7c9556..b9e715050 100644 --- a/library/src/com/handmark/pulltorefresh/library/internal/LoadingLayout.java +++ b/library/src/com/handmark/pulltorefresh/library/internal/LoadingLayout.java @@ -41,7 +41,7 @@ import com.handmark.pulltorefresh.library.R; @SuppressLint("ViewConstructor") -public abstract class LoadingLayout extends CallbackFrameLayout implements ILoadingLayout { +public abstract class LoadingLayout extends FrameLayout implements ILoadingLayout { static final String LOG_TAG = "PullToRefresh-LoadingLayout"; @@ -192,12 +192,14 @@ public final void setWidth(int width) { requestLayout(); } - public final int getContentHeight() { - return mInnerLayout.getHeight(); - } - - public final int getContentWidth() { - return mInnerLayout.getWidth(); + public final int getContentSize() { + switch (mScrollDirection) { + case HORIZONTAL: + return mInnerLayout.getWidth(); + case VERTICAL: + default: + return mInnerLayout.getHeight(); + } } public final void hideAllViews() { From 0ec847b3cad89d473c6e5b272244d7e9a1b382e7 Mon Sep 17 00:00:00 2001 From: Michael Basil Date: Wed, 26 Dec 2012 23:03:49 +0000 Subject: [PATCH 100/120] Fix setReleaseLabel(). Fixes #187 --- .../com/handmark/pulltorefresh/library/LoadingLayoutProxy.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/library/src/com/handmark/pulltorefresh/library/LoadingLayoutProxy.java b/library/src/com/handmark/pulltorefresh/library/LoadingLayoutProxy.java index 48eca91a5..72d826461 100644 --- a/library/src/com/handmark/pulltorefresh/library/LoadingLayoutProxy.java +++ b/library/src/com/handmark/pulltorefresh/library/LoadingLayoutProxy.java @@ -52,7 +52,7 @@ public void setPullLabel(CharSequence label) { @Override public void setReleaseLabel(CharSequence label) { for (LoadingLayout layout : mLoadingLayouts) { - layout.setRefreshingLabel(label); + layout.setReleaseLabel(label); } } From c25adb08c373ea7f156f2f863b0b681210ffeafc Mon Sep 17 00:00:00 2001 From: Chris Banes Date: Sat, 29 Dec 2012 16:13:13 +0000 Subject: [PATCH 101/120] Fix typo causing Horizontal Layouts to not layout properly --- .../com/handmark/pulltorefresh/library/PullToRefreshBase.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/library/src/com/handmark/pulltorefresh/library/PullToRefreshBase.java b/library/src/com/handmark/pulltorefresh/library/PullToRefreshBase.java index 0f92afaa6..8439c80c4 100644 --- a/library/src/com/handmark/pulltorefresh/library/PullToRefreshBase.java +++ b/library/src/com/handmark/pulltorefresh/library/PullToRefreshBase.java @@ -912,7 +912,7 @@ protected final void refreshRefreshableViewSize(int width, int height) { switch (getPullToRefreshScrollDirection()) { case HORIZONTAL: - if (lp.weight != width) { + if (lp.width != width) { lp.width = width; mRefreshableViewWrapper.requestLayout(); } From 8b1aef22b9e147d4dfc54b212dd636d740cec1fe Mon Sep 17 00:00:00 2001 From: Chris Banes Date: Sat, 29 Dec 2012 16:38:23 +0000 Subject: [PATCH 102/120] Fix #186 --- .../library/PullToRefreshAdapterViewBase.java | 21 ++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/library/src/com/handmark/pulltorefresh/library/PullToRefreshAdapterViewBase.java b/library/src/com/handmark/pulltorefresh/library/PullToRefreshAdapterViewBase.java index 0222515d7..0ff4ebe44 100644 --- a/library/src/com/handmark/pulltorefresh/library/PullToRefreshAdapterViewBase.java +++ b/library/src/com/handmark/pulltorefresh/library/PullToRefreshAdapterViewBase.java @@ -30,6 +30,7 @@ import android.widget.AdapterView; import android.widget.AdapterView.OnItemClickListener; import android.widget.FrameLayout; +import android.widget.LinearLayout; import android.widget.ListAdapter; import com.handmark.pulltorefresh.library.internal.EmptyViewMethodAccessor; @@ -38,6 +39,22 @@ public abstract class PullToRefreshAdapterViewBase extends PullToRefreshBase implements OnScrollListener { + private static FrameLayout.LayoutParams convertEmptyViewLayoutParams(ViewGroup.LayoutParams lp) { + FrameLayout.LayoutParams newLp = null; + + if (null != lp) { + newLp = new FrameLayout.LayoutParams(lp); + + if (lp instanceof LinearLayout.LayoutParams) { + newLp.gravity = ((LinearLayout.LayoutParams) lp).gravity; + } else { + newLp.gravity = Gravity.CENTER; + } + } + + return newLp; + } + private int mSavedLastVisibleIndex = -1; private OnScrollListener mOnScrollListener; private OnLastItemVisibleListener mOnLastItemVisibleListener; @@ -172,7 +189,9 @@ public final void setEmptyView(View newEmptyView) { ((ViewGroup) newEmptyViewParent).removeView(newEmptyView); } - refreshableViewWrapper.addView(newEmptyView); + // We need to convert any LayoutParams so that it works in our + // FrameLayout + refreshableViewWrapper.addView(newEmptyView, convertEmptyViewLayoutParams(newEmptyView.getLayoutParams())); } if (mRefreshableView instanceof EmptyViewMethodAccessor) { From e10106bfdbc5ac337b0d87c0622dca2ebf3e9b64 Mon Sep 17 00:00:00 2001 From: Chris Banes Date: Sat, 29 Dec 2012 16:49:58 +0000 Subject: [PATCH 103/120] Fix bug caused by 8b1aef22b9e147d4dfc54b212dd636d740cec1fe --- .../library/PullToRefreshAdapterViewBase.java | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/library/src/com/handmark/pulltorefresh/library/PullToRefreshAdapterViewBase.java b/library/src/com/handmark/pulltorefresh/library/PullToRefreshAdapterViewBase.java index 0ff4ebe44..eecd798d8 100644 --- a/library/src/com/handmark/pulltorefresh/library/PullToRefreshAdapterViewBase.java +++ b/library/src/com/handmark/pulltorefresh/library/PullToRefreshAdapterViewBase.java @@ -191,7 +191,12 @@ public final void setEmptyView(View newEmptyView) { // We need to convert any LayoutParams so that it works in our // FrameLayout - refreshableViewWrapper.addView(newEmptyView, convertEmptyViewLayoutParams(newEmptyView.getLayoutParams())); + FrameLayout.LayoutParams lp = convertEmptyViewLayoutParams(newEmptyView.getLayoutParams()); + if (null != lp) { + refreshableViewWrapper.addView(newEmptyView, lp); + } else { + refreshableViewWrapper.addView(newEmptyView); + } } if (mRefreshableView instanceof EmptyViewMethodAccessor) { From a78c6cdaca04f3de371741dd7c80f44be0c614fb Mon Sep 17 00:00:00 2001 From: Chris Banes Date: Sat, 29 Dec 2012 17:10:03 +0000 Subject: [PATCH 104/120] Pretty sure this finally fixes #185. --- .../library/PullToRefreshBase.java | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) diff --git a/library/src/com/handmark/pulltorefresh/library/PullToRefreshBase.java b/library/src/com/handmark/pulltorefresh/library/PullToRefreshBase.java index 8439c80c4..e8a69fccf 100644 --- a/library/src/com/handmark/pulltorefresh/library/PullToRefreshBase.java +++ b/library/src/com/handmark/pulltorefresh/library/PullToRefreshBase.java @@ -840,6 +840,10 @@ protected final Parcelable onSaveInstanceState() { @Override protected final void onSizeChanged(int w, int h, int oldw, int oldh) { + if (DEBUG) { + Log.d(LOG_TAG, String.format("onSizeChanged. W: %d, H: %d", w, h)); + } + super.onSizeChanged(w, h, oldw, oldh); // We need to update the header/footer when our size changes @@ -847,6 +851,17 @@ protected final void onSizeChanged(int w, int h, int oldw, int oldh) { // Update the Refreshable View layout refreshRefreshableViewSize(w, h); + + /** + * As we're currently in a Layout Pass, we need to schedule another one + * to layout any changes we've made here + */ + post(new Runnable() { + @Override + public void run() { + requestLayout(); + } + }); } /** @@ -902,10 +917,6 @@ protected final void refreshLoadingViewsSize() { } protected final void refreshRefreshableViewSize(int width, int height) { - if (DEBUG) { - Log.d(LOG_TAG, String.format("refreshRefreshableViewSize. W: %d, H: %d", width, height)); - } - // We need to set the Height of the Refreshable View to the same as // this layout LinearLayout.LayoutParams lp = (LinearLayout.LayoutParams) mRefreshableViewWrapper.getLayoutParams(); From 333464bed20eb21813d7fe2358936de5f28be8b2 Mon Sep 17 00:00:00 2001 From: Chris Banes Date: Sat, 29 Dec 2012 17:54:13 +0000 Subject: [PATCH 105/120] Fix #191. Much better way of detecting when the last visible item is visible. --- .../library/PullToRefreshAdapterViewBase.java | 35 +++++++++---------- 1 file changed, 16 insertions(+), 19 deletions(-) diff --git a/library/src/com/handmark/pulltorefresh/library/PullToRefreshAdapterViewBase.java b/library/src/com/handmark/pulltorefresh/library/PullToRefreshAdapterViewBase.java index eecd798d8..d39b396b6 100644 --- a/library/src/com/handmark/pulltorefresh/library/PullToRefreshAdapterViewBase.java +++ b/library/src/com/handmark/pulltorefresh/library/PullToRefreshAdapterViewBase.java @@ -55,7 +55,7 @@ private static FrameLayout.LayoutParams convertEmptyViewLayoutParams(ViewGroup.L return newLp; } - private int mSavedLastVisibleIndex = -1; + private boolean mLastItemVisible; private OnScrollListener mOnScrollListener; private OnLastItemVisibleListener mOnLastItemVisibleListener; private View mEmptyView; @@ -110,23 +110,12 @@ public final void onScroll(final AbsListView view, final int firstVisibleItem, f + ". Total Items:" + totalItemCount); } - // If we have a OnItemVisibleListener, do check... + /** + * Set whether the Last Item is Visible. lastVisibleItemIndex is a + * zero-based index, so we minus one totalItemCount to check + */ if (null != mOnLastItemVisibleListener) { - - // Detect whether the last visible item has changed - final int lastVisibleItemIndex = firstVisibleItem + visibleItemCount; - - /** - * Check that the last item has changed, we have any items, and that - * the last item is visible. lastVisibleItemIndex is a zero-based - * index, so we add one to it to check against totalItemCount. - */ - if (visibleItemCount > 0 && (lastVisibleItemIndex + 1) == totalItemCount) { - if (lastVisibleItemIndex != mSavedLastVisibleIndex) { - mSavedLastVisibleIndex = lastVisibleItemIndex; - mOnLastItemVisibleListener.onLastItemVisible(); - } - } + mLastItemVisible = (totalItemCount > 0) && (firstVisibleItem + visibleItemCount >= totalItemCount - 1); } // If we're showing the indicator, check positions... @@ -140,9 +129,17 @@ public final void onScroll(final AbsListView view, final int firstVisibleItem, f } } - public final void onScrollStateChanged(final AbsListView view, final int scrollState) { + public final void onScrollStateChanged(final AbsListView view, final int state) { + /** + * Check that the scrolling has stopped, and that the last item is + * visible. + */ + if (state == OnScrollListener.SCROLL_STATE_IDLE && null != mOnLastItemVisibleListener && mLastItemVisible) { + mOnLastItemVisibleListener.onLastItemVisible(); + } + if (null != mOnScrollListener) { - mOnScrollListener.onScrollStateChanged(view, scrollState); + mOnScrollListener.onScrollStateChanged(view, state); } } From 94fed7dfb1cb2c75636e3136429d87cce4b8e5cc Mon Sep 17 00:00:00 2001 From: Chris Banes Date: Mon, 31 Dec 2012 13:06:59 +0000 Subject: [PATCH 106/120] Expand Fragment classes to include support for ExpandableListView --- .../PullToRefreshBaseListFragment.java | 68 +++++++++++++++++++ .../PullToRefreshExpandableListFragment.java | 46 +++++++++++++ .../PullToRefreshListFragment.java | 61 +++-------------- 3 files changed, 124 insertions(+), 51 deletions(-) create mode 100644 extras/PullToRefreshListFragment/src/com/handmark/pulltorefresh/extras/listfragment/PullToRefreshBaseListFragment.java create mode 100644 extras/PullToRefreshListFragment/src/com/handmark/pulltorefresh/extras/listfragment/PullToRefreshExpandableListFragment.java diff --git a/extras/PullToRefreshListFragment/src/com/handmark/pulltorefresh/extras/listfragment/PullToRefreshBaseListFragment.java b/extras/PullToRefreshListFragment/src/com/handmark/pulltorefresh/extras/listfragment/PullToRefreshBaseListFragment.java new file mode 100644 index 000000000..4350f9257 --- /dev/null +++ b/extras/PullToRefreshListFragment/src/com/handmark/pulltorefresh/extras/listfragment/PullToRefreshBaseListFragment.java @@ -0,0 +1,68 @@ +/******************************************************************************* + * 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.extras.listfragment; + +import android.os.Bundle; +import android.support.v4.app.ListFragment; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.AbsListView; +import android.widget.ListView; + +import com.handmark.pulltorefresh.library.PullToRefreshBase; + +abstract class PullToRefreshBaseListFragment> extends ListFragment { + + private T mPullToRefreshListView; + + @Override + public final View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { + View layout = super.onCreateView(inflater, container, savedInstanceState); + + ListView lv = (ListView) layout.findViewById(android.R.id.list); + ViewGroup parent = (ViewGroup) lv.getParent(); + + // Remove ListView and add PullToRefreshListView in its place + int lvIndex = parent.indexOfChild(lv); + parent.removeViewAt(lvIndex); + mPullToRefreshListView = onCreatePullToRefreshListView(inflater, savedInstanceState); + parent.addView(mPullToRefreshListView, lvIndex, lv.getLayoutParams()); + + return layout; + } + + /** + * @return The {@link PullToRefreshBase} attached to this ListFragment. + */ + public final T getPullToRefreshListView() { + return mPullToRefreshListView; + } + + /** + * Returns the {@link PullToRefreshBase} which will replace the ListView + * created from ListFragment. You should override this method if you wish to + * customise the {@link PullToRefreshBase} from the default. + * + * @param inflater - LayoutInflater which can be used to inflate from XML. + * @param savedInstanceState - Bundle passed through from + * {@link ListFragment#onCreateView(LayoutInflater, ViewGroup, Bundle) + * onCreateView(...)} + * @return The {@link PullToRefreshBase} which will replace the ListView. + */ + protected abstract T onCreatePullToRefreshListView(LayoutInflater inflater, Bundle savedInstanceState); + +} \ No newline at end of file diff --git a/extras/PullToRefreshListFragment/src/com/handmark/pulltorefresh/extras/listfragment/PullToRefreshExpandableListFragment.java b/extras/PullToRefreshListFragment/src/com/handmark/pulltorefresh/extras/listfragment/PullToRefreshExpandableListFragment.java new file mode 100644 index 000000000..aca73a3e7 --- /dev/null +++ b/extras/PullToRefreshListFragment/src/com/handmark/pulltorefresh/extras/listfragment/PullToRefreshExpandableListFragment.java @@ -0,0 +1,46 @@ +/******************************************************************************* + * 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.extras.listfragment; + +import android.os.Bundle; +import android.support.v4.app.ListFragment; +import android.view.LayoutInflater; + +import com.handmark.pulltorefresh.library.PullToRefreshExpandableListView; + +/** + * A sample implementation of how to use {@link PullToRefreshExpandableListView} + * with {@link ListFragment}. This implementation simply replaces the ListView + * that {@code ListFragment} creates with a new + * {@code PullToRefreshExpandableListView}. This means that ListFragment still + * works 100% (e.g. setListShown(...) ). + *

+ * The new PullToRefreshListView is created in the method + * {@link #onCreatePullToRefreshListView(LayoutInflater, Bundle)}. If you wish + * to customise the {@code PullToRefreshExpandableListView} then override this + * method and return your customised instance. + * + * @author Chris Banes + * + */ +public class PullToRefreshExpandableListFragment extends PullToRefreshBaseListFragment { + + protected PullToRefreshExpandableListView onCreatePullToRefreshListView(LayoutInflater inflater, + Bundle savedInstanceState) { + return new PullToRefreshExpandableListView(getActivity()); + } + +} \ No newline at end of file diff --git a/extras/PullToRefreshListFragment/src/com/handmark/pulltorefresh/extras/listfragment/PullToRefreshListFragment.java b/extras/PullToRefreshListFragment/src/com/handmark/pulltorefresh/extras/listfragment/PullToRefreshListFragment.java index 34909f53d..e544797f9 100644 --- a/extras/PullToRefreshListFragment/src/com/handmark/pulltorefresh/extras/listfragment/PullToRefreshListFragment.java +++ b/extras/PullToRefreshListFragment/src/com/handmark/pulltorefresh/extras/listfragment/PullToRefreshListFragment.java @@ -18,66 +18,25 @@ import android.os.Bundle; import android.support.v4.app.ListFragment; import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; -import android.widget.ListView; + import com.handmark.pulltorefresh.library.PullToRefreshListView; /** - * A sample implementation of how to the PullToRefreshListView with - * ListFragment. This implementation simply replaces the ListView that - * ListFragment creates with a new PullToRefreshListView. This means that - * ListFragment still works 100% (e.g. setListShown(...)). - * + * A sample implementation of how to use {@link PullToRefreshListView} with + * {@link ListFragment}. This implementation simply replaces the ListView that + * {@code ListFragment} creates with a new PullToRefreshListView. This means + * that ListFragment still works 100% (e.g. setListShown(...) ). + *

* The new PullToRefreshListView is created in the method - * onCreatePullToRefreshListView(). If you wish to customise the - * PullToRefreshListView then override this method and return your customised - * instance. + * {@link #onCreatePullToRefreshListView(LayoutInflater, Bundle)}. If you wish + * to customise the {@code PullToRefreshListView} then override this method and + * return your customised instance. * * @author Chris Banes * */ -public class PullToRefreshListFragment extends ListFragment { - - private PullToRefreshListView mPullToRefreshListView; - - @Override - public final View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { - View layout = super.onCreateView(inflater, container, savedInstanceState); - - ListView lv = (ListView) layout.findViewById(android.R.id.list); - ViewGroup parent = (ViewGroup) lv.getParent(); - - //Remove ListView and add PullToRefreshListView in its place - int lvIndex = parent.indexOfChild(lv); - parent.removeViewAt(lvIndex); - mPullToRefreshListView = onCreatePullToRefreshListView(inflater, savedInstanceState); - parent.addView(mPullToRefreshListView, lvIndex, lv.getLayoutParams()); - - return layout; - } - - /** - * @return The {@link PullToRefreshListView} attached to this ListFragment. - */ - public final PullToRefreshListView getPullToRefreshListView() { - return mPullToRefreshListView; - } +public class PullToRefreshListFragment extends PullToRefreshBaseListFragment { - /** - * Returns the {@link PullToRefreshListView} which will replace the ListView - * created from ListFragment. You should override this method if you wish to - * customise the {@link PullToRefreshListView} from the default. - * - * @param inflater - * - LayoutInflater which can be used to inflate from XML. - * @param savedInstanceState - * - Bundle passed through from - * {@link ListFragment#onCreateView(LayoutInflater, ViewGroup, Bundle) - * onCreateView(...)} - * @return The {@link PullToRefreshListView} which will replace the - * ListView. - */ protected PullToRefreshListView onCreatePullToRefreshListView(LayoutInflater inflater, Bundle savedInstanceState) { return new PullToRefreshListView(getActivity()); } From 13c90770659cf2a40ec7cc6b466ab86c349d49f2 Mon Sep 17 00:00:00 2001 From: Chris Banes Date: Wed, 2 Jan 2013 14:53:59 +0000 Subject: [PATCH 107/120] Remove the hacky support for Context Menu's. It's not difficult to do it manually. --- .../library/PullToRefreshAdapterViewBase.java | 3 --- .../PullToRefreshExpandableListView.java | 10 ---------- .../library/PullToRefreshGridView.java | 11 ---------- .../library/PullToRefreshListView.java | 10 ---------- .../samples/PullToRefreshListActivity.java | 20 +++++++++++++++++++ 5 files changed, 20 insertions(+), 34 deletions(-) diff --git a/library/src/com/handmark/pulltorefresh/library/PullToRefreshAdapterViewBase.java b/library/src/com/handmark/pulltorefresh/library/PullToRefreshAdapterViewBase.java index d39b396b6..db49794d9 100644 --- a/library/src/com/handmark/pulltorefresh/library/PullToRefreshAdapterViewBase.java +++ b/library/src/com/handmark/pulltorefresh/library/PullToRefreshAdapterViewBase.java @@ -19,7 +19,6 @@ import android.content.res.TypedArray; import android.util.AttributeSet; import android.util.Log; -import android.view.ContextMenu.ContextMenuInfo; import android.view.Gravity; import android.view.View; import android.view.ViewGroup; @@ -86,8 +85,6 @@ public PullToRefreshAdapterViewBase(Context context, Mode mode, AnimationStyle a mRefreshableView.setOnScrollListener(this); } - abstract public ContextMenuInfo getContextMenuInfo(); - /** * Gets whether an indicator graphic should be displayed when the View is in * a state where a Pull-to-Refresh can happen. An example of this state is diff --git a/library/src/com/handmark/pulltorefresh/library/PullToRefreshExpandableListView.java b/library/src/com/handmark/pulltorefresh/library/PullToRefreshExpandableListView.java index 974618be5..649020c6d 100644 --- a/library/src/com/handmark/pulltorefresh/library/PullToRefreshExpandableListView.java +++ b/library/src/com/handmark/pulltorefresh/library/PullToRefreshExpandableListView.java @@ -20,7 +20,6 @@ import android.os.Build.VERSION; import android.os.Build.VERSION_CODES; import android.util.AttributeSet; -import android.view.ContextMenu.ContextMenuInfo; import android.view.View; import android.widget.ExpandableListView; @@ -44,11 +43,6 @@ public PullToRefreshExpandableListView(Context context, Mode mode, AnimationStyl super(context, mode, style); } - @Override - public ContextMenuInfo getContextMenuInfo() { - return ((InternalExpandableListView) getRefreshableView()).getContextMenuInfo(); - } - @Override public final Orientation getPullToRefreshScrollDirection() { return Orientation.VERTICAL; @@ -74,10 +68,6 @@ public InternalExpandableListView(Context context, AttributeSet attrs) { super(context, attrs); } - public ContextMenuInfo getContextMenuInfo() { - return super.getContextMenuInfo(); - } - @Override public void setEmptyView(View emptyView) { PullToRefreshExpandableListView.this.setEmptyView(emptyView); diff --git a/library/src/com/handmark/pulltorefresh/library/PullToRefreshGridView.java b/library/src/com/handmark/pulltorefresh/library/PullToRefreshGridView.java index e1db44977..f9506889a 100644 --- a/library/src/com/handmark/pulltorefresh/library/PullToRefreshGridView.java +++ b/library/src/com/handmark/pulltorefresh/library/PullToRefreshGridView.java @@ -20,7 +20,6 @@ import android.os.Build.VERSION; import android.os.Build.VERSION_CODES; import android.util.AttributeSet; -import android.view.ContextMenu.ContextMenuInfo; import android.view.View; import android.widget.GridView; @@ -44,11 +43,6 @@ public PullToRefreshGridView(Context context, Mode mode, AnimationStyle style) { super(context, mode, style); } - @Override - public ContextMenuInfo getContextMenuInfo() { - return ((InternalGridView) getRefreshableView()).getContextMenuInfo(); - } - @Override public final Orientation getPullToRefreshScrollDirection() { return Orientation.VERTICAL; @@ -74,11 +68,6 @@ public InternalGridView(Context context, AttributeSet attrs) { super(context, attrs); } - @Override - public ContextMenuInfo getContextMenuInfo() { - return super.getContextMenuInfo(); - } - @Override public void setEmptyView(View emptyView) { PullToRefreshGridView.this.setEmptyView(emptyView); diff --git a/library/src/com/handmark/pulltorefresh/library/PullToRefreshListView.java b/library/src/com/handmark/pulltorefresh/library/PullToRefreshListView.java index cef937b8b..4de9c340d 100644 --- a/library/src/com/handmark/pulltorefresh/library/PullToRefreshListView.java +++ b/library/src/com/handmark/pulltorefresh/library/PullToRefreshListView.java @@ -22,7 +22,6 @@ import android.os.Build.VERSION; import android.os.Build.VERSION_CODES; import android.util.AttributeSet; -import android.view.ContextMenu.ContextMenuInfo; import android.view.Gravity; import android.view.MotionEvent; import android.view.View; @@ -58,11 +57,6 @@ public PullToRefreshListView(Context context, Mode mode, AnimationStyle style) { super(context, mode, style); } - @Override - public ContextMenuInfo getContextMenuInfo() { - return ((InternalListView) getRefreshableView()).getContextMenuInfo(); - } - @Override public final Orientation getPullToRefreshScrollDirection() { return Orientation.VERTICAL; @@ -317,10 +311,6 @@ public boolean dispatchTouchEvent(MotionEvent ev) { } } - public ContextMenuInfo getContextMenuInfo() { - return super.getContextMenuInfo(); - } - @Override public void setAdapter(ListAdapter adapter) { // Add the Footer View at the last possible moment diff --git a/sample/src/com/handmark/pulltorefresh/samples/PullToRefreshListActivity.java b/sample/src/com/handmark/pulltorefresh/samples/PullToRefreshListActivity.java index 700185069..13b572ea2 100755 --- a/sample/src/com/handmark/pulltorefresh/samples/PullToRefreshListActivity.java +++ b/sample/src/com/handmark/pulltorefresh/samples/PullToRefreshListActivity.java @@ -22,8 +22,12 @@ import android.os.AsyncTask; import android.os.Bundle; import android.text.format.DateUtils; +import android.view.ContextMenu; +import android.view.ContextMenu.ContextMenuInfo; import android.view.Menu; import android.view.MenuItem; +import android.view.View; +import android.widget.AdapterView.AdapterContextMenuInfo; import android.widget.ArrayAdapter; import android.widget.ListView; import android.widget.Toast; @@ -81,6 +85,9 @@ public void onLastItemVisible() { ListView actualListView = mPullRefreshListView.getRefreshableView(); + // Need to use the Actual ListView when registering for Context Menu + registerForContextMenu(actualListView); + mListItems = new LinkedList(); mListItems.addAll(Arrays.asList(mStrings)); @@ -136,6 +143,19 @@ public boolean onCreateOptionsMenu(Menu menu) { return super.onCreateOptionsMenu(menu); } + @Override + public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) { + AdapterContextMenuInfo info = (AdapterContextMenuInfo) menuInfo; + + menu.setHeaderTitle("Item: " + getListView().getItemAtPosition(info.position)); + menu.add("Item 1"); + menu.add("Item 2"); + menu.add("Item 3"); + menu.add("Item 4"); + + super.onCreateContextMenu(menu, v, menuInfo); + } + @Override public boolean onPrepareOptionsMenu(Menu menu) { MenuItem disableItem = menu.findItem(MENU_DISABLE_SCROLL); From 424ed33721b44d9b6bcc482b87f1cd4606d33f3a Mon Sep 17 00:00:00 2001 From: Chris Banes Date: Wed, 2 Jan 2013 15:15:06 +0000 Subject: [PATCH 108/120] Fix #194 --- .../library/LoadingLayoutProxy.java | 11 +- .../library/PullToRefreshAdapterViewBase.java | 8 +- .../library/PullToRefreshBase.java | 186 +++++++++--------- .../library/PullToRefreshListView.java | 4 +- 4 files changed, 109 insertions(+), 100 deletions(-) diff --git a/library/src/com/handmark/pulltorefresh/library/LoadingLayoutProxy.java b/library/src/com/handmark/pulltorefresh/library/LoadingLayoutProxy.java index 72d826461..5f76645d2 100644 --- a/library/src/com/handmark/pulltorefresh/library/LoadingLayoutProxy.java +++ b/library/src/com/handmark/pulltorefresh/library/LoadingLayoutProxy.java @@ -15,7 +15,16 @@ public class LoadingLayoutProxy implements ILoadingLayout { mLoadingLayouts = new HashSet(); } - void addLayout(LoadingLayout layout) { + /** + * This allows you to add extra LoadingLayout instances to this proxy. This + * is only necessary if you keep your own instances, and want to have them + * included in any + * {@link PullToRefreshBase#createLoadingLayoutProxy(boolean, boolean) + * createLoadingLayoutProxy(...)} calls. + * + * @param layout - LoadingLayout to have included. + */ + public void addLayout(LoadingLayout layout) { if (null != layout) { mLoadingLayouts.add(layout); } diff --git a/library/src/com/handmark/pulltorefresh/library/PullToRefreshAdapterViewBase.java b/library/src/com/handmark/pulltorefresh/library/PullToRefreshAdapterViewBase.java index db49794d9..b5132ed6a 100644 --- a/library/src/com/handmark/pulltorefresh/library/PullToRefreshAdapterViewBase.java +++ b/library/src/com/handmark/pulltorefresh/library/PullToRefreshAdapterViewBase.java @@ -248,7 +248,7 @@ public void setShowIndicator(boolean showIndicator) { ; @Override - void onPullToRefresh() { + protected void onPullToRefresh() { super.onPullToRefresh(); if (getShowIndicatorInternal()) { @@ -266,7 +266,7 @@ void onPullToRefresh() { } } - void onRefreshing(boolean doScroll) { + protected void onRefreshing(boolean doScroll) { super.onRefreshing(doScroll); if (getShowIndicatorInternal()) { @@ -275,7 +275,7 @@ void onRefreshing(boolean doScroll) { } @Override - void onReleaseToRefresh() { + protected void onReleaseToRefresh() { super.onReleaseToRefresh(); if (getShowIndicatorInternal()) { @@ -294,7 +294,7 @@ void onReleaseToRefresh() { } @Override - void onReset() { + protected void onReset() { super.onReset(); if (getShowIndicatorInternal()) { diff --git a/library/src/com/handmark/pulltorefresh/library/PullToRefreshBase.java b/library/src/com/handmark/pulltorefresh/library/PullToRefreshBase.java index e8a69fccf..a76b32891 100644 --- a/library/src/com/handmark/pulltorefresh/library/PullToRefreshBase.java +++ b/library/src/com/handmark/pulltorefresh/library/PullToRefreshBase.java @@ -546,89 +546,6 @@ public final void setShowViewWhileRefreshing(boolean showView) { */ public abstract Orientation getPullToRefreshScrollDirection(); - /** - * Called when the UI has been to be updated to be in the - * {@link State#PULL_TO_REFRESH} state. - */ - void onPullToRefresh() { - switch (mCurrentMode) { - case PULL_FROM_END: - mFooterLayout.pullToRefresh(); - break; - case PULL_FROM_START: - mHeaderLayout.pullToRefresh(); - break; - default: - // NO-OP - break; - } - } - - /** - * Called when the UI has been to be updated to be in the - * {@link State#REFRESHING} or {@link State#MANUAL_REFRESHING} state. - * - * @param doScroll - Whether the UI should scroll for this event. - */ - void onRefreshing(final boolean doScroll) { - if (mMode.showHeaderLoadingLayout()) { - mHeaderLayout.refreshing(); - } - if (mMode.showFooterLoadingLayout()) { - mFooterLayout.refreshing(); - } - - if (doScroll) { - if (mShowViewWhileRefreshing) { - switch (mCurrentMode) { - case MANUAL_REFRESH_ONLY: - case PULL_FROM_END: - smoothScrollTo(getFooterSize()); - break; - default: - case PULL_FROM_START: - smoothScrollTo(-getHeaderSize()); - break; - } - } else { - smoothScrollTo(0); - } - } - } - - /** - * Called when the UI has been to be updated to be in the - * {@link State#RELEASE_TO_REFRESH} state. - */ - void onReleaseToRefresh() { - switch (mCurrentMode) { - case PULL_FROM_END: - mFooterLayout.releaseToRefresh(); - break; - case PULL_FROM_START: - mHeaderLayout.releaseToRefresh(); - break; - default: - // NO-OP - break; - } - } - - /** - * Called when the UI has been to be updated to be in the - * {@link State#RESET} state. - */ - void onReset() { - mIsBeingDragged = false; - mLayoutVisibilityChangesEnabled = true; - - // Always reset both layouts, just in case... - mHeaderLayout.reset(); - mFooterLayout.reset(); - - smoothScrollTo(0); - } - final void setState(State state, final boolean... params) { mState = state; if (DEBUG) { @@ -759,21 +676,21 @@ protected void handleStyledAttributes(TypedArray a) { /** * Implemented by derived class to return whether the View is in a state - * where the user can Pull to Refresh by scrolling from the start. + * where the user can Pull to Refresh by scrolling from the end. * - * @return true if the View is currently the correct state (for example, top - * of a ListView) + * @return true if the View is currently in the correct state (for example, + * bottom of a ListView) */ - protected abstract boolean isReadyForPullStart(); + protected abstract boolean isReadyForPullEnd(); /** * Implemented by derived class to return whether the View is in a state - * where the user can Pull to Refresh by scrolling from the end. + * where the user can Pull to Refresh by scrolling from the start. * - * @return true if the View is currently in the correct state (for example, - * bottom of a ListView) + * @return true if the View is currently the correct state (for example, top + * of a ListView) */ - protected abstract boolean isReadyForPullEnd(); + protected abstract boolean isReadyForPullStart(); /** * Called by {@link #onRestoreInstanceState(Parcelable)} so that derivative @@ -793,6 +710,89 @@ protected void onPtrRestoreInstanceState(Bundle savedInstanceState) { protected void onPtrSaveInstanceState(Bundle saveState) { } + /** + * Called when the UI has been to be updated to be in the + * {@link State#PULL_TO_REFRESH} state. + */ + protected void onPullToRefresh() { + switch (mCurrentMode) { + case PULL_FROM_END: + mFooterLayout.pullToRefresh(); + break; + case PULL_FROM_START: + mHeaderLayout.pullToRefresh(); + break; + default: + // NO-OP + break; + } + } + + /** + * Called when the UI has been to be updated to be in the + * {@link State#REFRESHING} or {@link State#MANUAL_REFRESHING} state. + * + * @param doScroll - Whether the UI should scroll for this event. + */ + protected void onRefreshing(final boolean doScroll) { + if (mMode.showHeaderLoadingLayout()) { + mHeaderLayout.refreshing(); + } + if (mMode.showFooterLoadingLayout()) { + mFooterLayout.refreshing(); + } + + if (doScroll) { + if (mShowViewWhileRefreshing) { + switch (mCurrentMode) { + case MANUAL_REFRESH_ONLY: + case PULL_FROM_END: + smoothScrollTo(getFooterSize()); + break; + default: + case PULL_FROM_START: + smoothScrollTo(-getHeaderSize()); + break; + } + } else { + smoothScrollTo(0); + } + } + } + + /** + * Called when the UI has been to be updated to be in the + * {@link State#RELEASE_TO_REFRESH} state. + */ + protected void onReleaseToRefresh() { + switch (mCurrentMode) { + case PULL_FROM_END: + mFooterLayout.releaseToRefresh(); + break; + case PULL_FROM_START: + mHeaderLayout.releaseToRefresh(); + break; + default: + // NO-OP + break; + } + } + + /** + * Called when the UI has been to be updated to be in the + * {@link State#RESET} state. + */ + protected void onReset() { + mIsBeingDragged = false; + mLayoutVisibilityChangesEnabled = true; + + // Always reset both layouts, just in case... + mHeaderLayout.reset(); + mFooterLayout.reset(); + + smoothScrollTo(0); + } + @Override protected final void onRestoreInstanceState(Parcelable state) { if (state instanceof Bundle) { @@ -1383,14 +1383,14 @@ boolean permitsPullToRefresh() { /** * @return true if this mode wants the Loading Layout Header to be shown */ - boolean showHeaderLoadingLayout() { + public boolean showHeaderLoadingLayout() { return this == PULL_FROM_START || this == BOTH; } /** * @return true if this mode wants the Loading Layout Footer to be shown */ - boolean showFooterLoadingLayout() { + public boolean showFooterLoadingLayout() { return this == PULL_FROM_END || this == BOTH || this == MANUAL_REFRESH_ONLY; } diff --git a/library/src/com/handmark/pulltorefresh/library/PullToRefreshListView.java b/library/src/com/handmark/pulltorefresh/library/PullToRefreshListView.java index 4de9c340d..0aa9a27d6 100644 --- a/library/src/com/handmark/pulltorefresh/library/PullToRefreshListView.java +++ b/library/src/com/handmark/pulltorefresh/library/PullToRefreshListView.java @@ -63,7 +63,7 @@ public final Orientation getPullToRefreshScrollDirection() { } @Override - void onRefreshing(final boolean doScroll) { + protected void onRefreshing(final boolean doScroll) { /** * If we're not showing the Refreshing view, or the list is empty, the * the header/footer views won't show so we use the normal method. @@ -127,7 +127,7 @@ void onRefreshing(final boolean doScroll) { } @Override - void onReset() { + protected void onReset() { /** * If the extras are not enabled, just call up to super and return. */ From 21b9be743781b0d663eb218929a189c2010edcf0 Mon Sep 17 00:00:00 2001 From: Chris Banes Date: Wed, 2 Jan 2013 15:20:34 +0000 Subject: [PATCH 109/120] Update Manifests --- extras/PullToRefreshListFragment/AndroidManifest.xml | 4 ++-- extras/PullToRefreshViewPager/AndroidManifest.xml | 4 ++-- library/AndroidManifest.xml | 4 ++-- sample/AndroidManifest.xml | 4 ++-- 4 files changed, 8 insertions(+), 8 deletions(-) diff --git a/extras/PullToRefreshListFragment/AndroidManifest.xml b/extras/PullToRefreshListFragment/AndroidManifest.xml index 89632e318..6745733d6 100644 --- a/extras/PullToRefreshListFragment/AndroidManifest.xml +++ b/extras/PullToRefreshListFragment/AndroidManifest.xml @@ -1,8 +1,8 @@ + android:versionCode="2110" + android:versionName="2.1.1" > diff --git a/extras/PullToRefreshViewPager/AndroidManifest.xml b/extras/PullToRefreshViewPager/AndroidManifest.xml index 8643bc964..eaffd6803 100644 --- a/extras/PullToRefreshViewPager/AndroidManifest.xml +++ b/extras/PullToRefreshViewPager/AndroidManifest.xml @@ -1,8 +1,8 @@ + android:versionCode="2110" + android:versionName="2.1.1" > diff --git a/library/AndroidManifest.xml b/library/AndroidManifest.xml index 28e0b3a47..c3db5673d 100644 --- a/library/AndroidManifest.xml +++ b/library/AndroidManifest.xml @@ -1,8 +1,8 @@ + android:versionCode="2110" + android:versionName="2.1.1" > diff --git a/sample/AndroidManifest.xml b/sample/AndroidManifest.xml index 7d85691ba..af06dffa8 100755 --- a/sample/AndroidManifest.xml +++ b/sample/AndroidManifest.xml @@ -1,8 +1,8 @@ + android:versionCode="2110" + android:versionName="2.1.1" > Date: Wed, 2 Jan 2013 15:24:50 +0000 Subject: [PATCH 110/120] [maven-release-plugin] prepare release v2.1.1 --- extras/PullToRefreshListFragment/pom.xml | 2 +- extras/PullToRefreshViewPager/pom.xml | 2 +- extras/pom.xml | 2 +- library/pom.xml | 2 +- pom.xml | 4 ++-- sample/pom.xml | 2 +- 6 files changed, 7 insertions(+), 7 deletions(-) diff --git a/extras/PullToRefreshListFragment/pom.xml b/extras/PullToRefreshListFragment/pom.xml index 206f52ed8..06e9a13e8 100644 --- a/extras/PullToRefreshListFragment/pom.xml +++ b/extras/PullToRefreshListFragment/pom.xml @@ -10,7 +10,7 @@ com.github.chrisbanes.pulltorefresh extras - 2.2-SNAPSHOT + 2.1.1 diff --git a/extras/PullToRefreshViewPager/pom.xml b/extras/PullToRefreshViewPager/pom.xml index c9d30d7f8..46761a99c 100644 --- a/extras/PullToRefreshViewPager/pom.xml +++ b/extras/PullToRefreshViewPager/pom.xml @@ -10,7 +10,7 @@ com.github.chrisbanes.pulltorefresh extras - 2.2-SNAPSHOT + 2.1.1 diff --git a/extras/pom.xml b/extras/pom.xml index 216f05023..59ac6507b 100644 --- a/extras/pom.xml +++ b/extras/pom.xml @@ -10,7 +10,7 @@ com.github.chrisbanes.pulltorefresh parent - 2.2-SNAPSHOT + 2.1.1 diff --git a/library/pom.xml b/library/pom.xml index 8db0a8eda..381eb5375 100644 --- a/library/pom.xml +++ b/library/pom.xml @@ -10,7 +10,7 @@ com.github.chrisbanes.pulltorefresh parent - 2.2-SNAPSHOT + 2.1.1 diff --git a/pom.xml b/pom.xml index cb2bd8fe8..516f13b16 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ com.github.chrisbanes.pulltorefresh parent pom - 2.2-SNAPSHOT + 2.1.1 Android-PullToRefresh Project Implementation of the Pull-to-Refresh UI Pattern for Android. https://github.com/chrisbanes/Android-PullToRefresh @@ -24,7 +24,7 @@ https://github.com/chrisbanes/Android-PullToRefresh scm:git:git://github.com/chrisbanes/Android-PullToRefresh.git scm:git:git@github.com:chrisbanes/Android-PullToRefresh.git - HEAD + v2.1.1 diff --git a/sample/pom.xml b/sample/pom.xml index 7bee8d1a1..7f18729d6 100644 --- a/sample/pom.xml +++ b/sample/pom.xml @@ -10,7 +10,7 @@ com.github.chrisbanes.pulltorefresh parent - 2.2-SNAPSHOT + 2.1.1 From 4b3dfb08f519347cccbac60956830f250e4c8252 Mon Sep 17 00:00:00 2001 From: Chris Banes Date: Wed, 2 Jan 2013 15:24:55 +0000 Subject: [PATCH 111/120] [maven-release-plugin] prepare for next development iteration --- extras/PullToRefreshListFragment/pom.xml | 2 +- extras/PullToRefreshViewPager/pom.xml | 2 +- extras/pom.xml | 2 +- library/pom.xml | 2 +- pom.xml | 4 ++-- sample/pom.xml | 2 +- 6 files changed, 7 insertions(+), 7 deletions(-) diff --git a/extras/PullToRefreshListFragment/pom.xml b/extras/PullToRefreshListFragment/pom.xml index 06e9a13e8..b67c8bbe4 100644 --- a/extras/PullToRefreshListFragment/pom.xml +++ b/extras/PullToRefreshListFragment/pom.xml @@ -10,7 +10,7 @@ com.github.chrisbanes.pulltorefresh extras - 2.1.1 + 2.1.2-SNAPSHOT diff --git a/extras/PullToRefreshViewPager/pom.xml b/extras/PullToRefreshViewPager/pom.xml index 46761a99c..55978777f 100644 --- a/extras/PullToRefreshViewPager/pom.xml +++ b/extras/PullToRefreshViewPager/pom.xml @@ -10,7 +10,7 @@ com.github.chrisbanes.pulltorefresh extras - 2.1.1 + 2.1.2-SNAPSHOT diff --git a/extras/pom.xml b/extras/pom.xml index 59ac6507b..78cab515e 100644 --- a/extras/pom.xml +++ b/extras/pom.xml @@ -10,7 +10,7 @@ com.github.chrisbanes.pulltorefresh parent - 2.1.1 + 2.1.2-SNAPSHOT diff --git a/library/pom.xml b/library/pom.xml index 381eb5375..6b48e0adb 100644 --- a/library/pom.xml +++ b/library/pom.xml @@ -10,7 +10,7 @@ com.github.chrisbanes.pulltorefresh parent - 2.1.1 + 2.1.2-SNAPSHOT diff --git a/pom.xml b/pom.xml index 516f13b16..1a755fea7 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ com.github.chrisbanes.pulltorefresh parent pom - 2.1.1 + 2.1.2-SNAPSHOT Android-PullToRefresh Project Implementation of the Pull-to-Refresh UI Pattern for Android. https://github.com/chrisbanes/Android-PullToRefresh @@ -24,7 +24,7 @@ https://github.com/chrisbanes/Android-PullToRefresh scm:git:git://github.com/chrisbanes/Android-PullToRefresh.git scm:git:git@github.com:chrisbanes/Android-PullToRefresh.git - v2.1.1 + HEAD diff --git a/sample/pom.xml b/sample/pom.xml index 7f18729d6..dafd460f2 100644 --- a/sample/pom.xml +++ b/sample/pom.xml @@ -10,7 +10,7 @@ com.github.chrisbanes.pulltorefresh parent - 2.1.1 + 2.1.2-SNAPSHOT From 333ddfe39094edda683950d874d439b6d06b97d2 Mon Sep 17 00:00:00 2001 From: nevalla Date: Tue, 8 Jan 2013 16:36:09 +0200 Subject: [PATCH 112/120] Add Finnish language strings --- library/res/values-fi/pull_refresh_strings.xml | 13 +++++++++++++ 1 file changed, 13 insertions(+) create mode 100755 library/res/values-fi/pull_refresh_strings.xml diff --git a/library/res/values-fi/pull_refresh_strings.xml b/library/res/values-fi/pull_refresh_strings.xml new file mode 100755 index 000000000..0381287ba --- /dev/null +++ b/library/res/values-fi/pull_refresh_strings.xml @@ -0,0 +1,13 @@ + + + + Päivitä vetämällä alas… + Päivitä vapauttamalla… + Päivitetään… + + + Päivitä vetämällä ylös… + @string/pull_to_refresh_release_label + @string/pull_to_refresh_refreshing_label + + \ No newline at end of file From 3571853d5fba94ea1973925adf304550446f17e8 Mon Sep 17 00:00:00 2001 From: Chris Banes Date: Tue, 8 Jan 2013 15:35:14 +0000 Subject: [PATCH 113/120] Set Sample to use Android-16 --- sample/project.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sample/project.properties b/sample/project.properties index bcee3ff1d..87f8ddd3e 100755 --- a/sample/project.properties +++ b/sample/project.properties @@ -8,7 +8,7 @@ # project structure. # Project target. -target=android-15 +target=android-16 android.library.reference.1=../library android.library.reference.2=../extras/PullToRefreshListFragment android.library.reference.3=../extras/PullToRefreshViewPager From 8a71c60fe86bb561e47631983a9e8e100a823667 Mon Sep 17 00:00:00 2001 From: Christopher Banes Date: Tue, 8 Jan 2013 15:44:44 +0000 Subject: [PATCH 114/120] Fix Text Showing on hidden LoadingLayout --- .../pulltorefresh/library/internal/LoadingLayout.java | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/library/src/com/handmark/pulltorefresh/library/internal/LoadingLayout.java b/library/src/com/handmark/pulltorefresh/library/internal/LoadingLayout.java index b9e715050..9c12586df 100644 --- a/library/src/com/handmark/pulltorefresh/library/internal/LoadingLayout.java +++ b/library/src/com/handmark/pulltorefresh/library/internal/LoadingLayout.java @@ -350,7 +350,12 @@ private void setSubHeaderText(CharSequence label) { mSubHeaderText.setVisibility(View.GONE); } else { mSubHeaderText.setText(label); - mSubHeaderText.setVisibility(View.VISIBLE); + + // Only set it to Visible if we're GONE, otherwise VISIBLE will + // be set soon + if (View.GONE == mSubHeaderText.getVisibility()) { + mSubHeaderText.setVisibility(View.VISIBLE); + } } } } From 420b36aa1fb78946baea9e5d9183489486c11e61 Mon Sep 17 00:00:00 2001 From: Chris Banes Date: Tue, 8 Jan 2013 16:00:40 +0000 Subject: [PATCH 115/120] Disable Hardware Layers for now. Fixes #196 --- .../library/PullToRefreshBase.java | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/library/src/com/handmark/pulltorefresh/library/PullToRefreshBase.java b/library/src/com/handmark/pulltorefresh/library/PullToRefreshBase.java index a76b32891..c33877c4f 100644 --- a/library/src/com/handmark/pulltorefresh/library/PullToRefreshBase.java +++ b/library/src/com/handmark/pulltorefresh/library/PullToRefreshBase.java @@ -47,6 +47,8 @@ public abstract class PullToRefreshBase extends LinearLayout imp // =========================================================== static final boolean DEBUG = true; + + static final boolean USE_HW_LAYERS = false; static final String LOG_TAG = "PullToRefresh"; @@ -959,12 +961,15 @@ protected final void setHeaderScroll(final int value) { } } - /** - * Use a Hardware Layer on the Refreshable View if we've scrolled at - * all. We don't use them on the Header/Footer Views as they change - * often, which would negate any HW layer performance boost. - */ - ViewCompat.setLayerType(mRefreshableViewWrapper, value != 0 ? View.LAYER_TYPE_HARDWARE : View.LAYER_TYPE_NONE); + if (USE_HW_LAYERS) { + /** + * Use a Hardware Layer on the Refreshable View if we've scrolled at + * all. We don't use them on the Header/Footer Views as they change + * often, which would negate any HW layer performance boost. + */ + ViewCompat.setLayerType(mRefreshableViewWrapper, value != 0 ? View.LAYER_TYPE_HARDWARE + : View.LAYER_TYPE_NONE); + } switch (getPullToRefreshScrollDirection()) { case VERTICAL: From 684a6166bdb3c5fbb82b2e4089ef37e9861ec0a6 Mon Sep 17 00:00:00 2001 From: Chris Banes Date: Thu, 10 Jan 2013 15:27:41 +0000 Subject: [PATCH 116/120] Fix Rotate Animation Drawable WOBBLE --- .../res/drawable-hdpi/default_ptr_rotate.png | Bin 521 -> 48963 bytes .../res/drawable-mdpi/default_ptr_rotate.png | Bin 419 -> 49665 bytes .../res/drawable-xhdpi/default_ptr_rotate.png | Bin 598 -> 50019 bytes .../library/internal/RotateLoadingLayout.java | 4 ++-- 4 files changed, 2 insertions(+), 2 deletions(-) diff --git a/library/res/drawable-hdpi/default_ptr_rotate.png b/library/res/drawable-hdpi/default_ptr_rotate.png index 5091a06e2a8c5f973e3b3edab04cdfd41fb5b515..dc641b72459953994dd5800438f559dc4659f228 100644 GIT binary patch literal 48963 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

    Ys7l zAukqY^p64u8u$6luCcnyh~(9;R@n~S8EcdVgy@fQN+h)n31;XM$4|D6Nt4XJ++$9S z);5*ajBeYsuYdqEK7Yfm2UeIF#w*l}5_2+UfkUp)`T$|-#<(>WZq_Cx-$1Be1oMBPSq&E}3U z_pk1zP3%6kaZ6J5L_N|vRCT`Pm5JVT;JpoXj%X^}fYEv4p?80uVOkt6EX6kFE1HL2 zy2t7P@4z%~bM2jx*2#(IFhxP_l)H@u7Qv_T^;%(`OV literal 521 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDB3?!H8JlO)In2Vh}LpV4%Za?&Y0Fn#v332`Z z|Nl%C#5R5WfrBD=NDxcD>w(67H)lP#=yX+>*?YcVsSb- zK|-n_lA+yY4bv=!;AgMyUY3=N__xs0VEu1?mU{J@|H>Ug?f=`e>~Wvm@t2>S^TeYZ zheq?Y3q!wOQ2q4(e?8--5OIx*4LP6x|KIQMsOR@Zm5PNieiLM+C#byo|DPeS=e45{ z`-D4H@{4*Z-Q1%yRxodxePJ&*YmC5TgT{ORkKa)J^I!gm-bA2DWu5>2vwGN^4K27= zBf|OnKYxPH_abHyY5oLr3%Tho|NnDF9F;u(pZ|c?!7lBZihuuI99}9`ESq8@p?XE*KMHtnE3jEE?e04zJ7zU?z_cmY;5)mj+_nIZu$QI z;-fS5Y-Im=A5h#VaW~xe^MO|vk4WyQH!^Trb8oMbfUV4q!WI+e*@qTru`{fGu*2nJ TrD_E*fEhep{an^LB{Ts5qZ{FJ diff --git a/library/res/drawable-mdpi/default_ptr_rotate.png b/library/res/drawable-mdpi/default_ptr_rotate.png index ceed80dbfea218e88bbe40cb52319faee9be7879..95b22bd71c4f2ed6c91652ac255b62bb8461e38a 100644 GIT binary patch literal 49665 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%0A-uWX&~N5)pN#W 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 literal 419 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfv=3*z$5DpHG+YkL80J#PMJ|V9E z|Noy!3OFt&ZwS=OUlQaO%pj;_>=K$*-Z694?lX7axoLf!36$b2@Q5sCVBk6o!i*-G zDyxBlG9|7NCBgY=CFO}lsSJ)O`AMk?Zka`?<@rU~#R|^BriEJ{n*r4w_jGX#(Kw%+ zus|=tIjOtMuRJB9`9bzypfm5E*4JR-#_)Qj9edPwZcu+;e*e$1R*W^AMnf37yWDNTrRS-l+DfKx1j++YbxT zKC4JXQK3vbP zd|a^5EfTGV2^pVC*!!3=1ZdZv=Bbw+Kzb}d8;;2zPyD84bzSW(-lgZ{^8!J2>&I1? zSksh;+?urb^&2?9hR@Q@&ewp6mGl^`vEKbM_o&FQX|Gc6w|gg*^ajwZciLJDZ`bWh z^)~3lTl|^sNNZ&mrqAuM01fa z1ObX`D!%3FvjNK3S5%Ok`0wY+UXA+Nb-Qt0Bu=xoMxpKVZlY|T9mXO%ZFkJPF`V?f z#qfDilWpeZr728>*-hms)m=1vmDN#J56y966b{g|OMvn-xWAh5CD!m6>UT8h?WCSA zJGn3$GE*6XdVeIFHN9YN|CvI+rg!ga+BrwI%EooQ-pmjijnekzu6Lr$NXqmq z@Y#W}?+qL-7|YHzfU)e!f%~79tH1JUenf%u79n&V)!}4ErbfBn`<#8e)9JK3pZ)v& z#8T33aJC1u+~H@o|2R9u>wR}6M~p>RKKqOYaT_Z^(bw(qkALCwS^tj;RWWk`7#J6o zjg_*}XXN;-IpK;W`o@jaOK;Uvm=ZpPpmpH(gva2w(QEsXfCUy$K|uI_J^C(E6p-3l z8cRgAt_l4C&@)waadUBbj8IZUU_})2m^5oXuIamb zBAYb*`KTYMOdkme;!*ZLW;m9DIQ!fZb7U4nuR0 zf6>W$p8fEU^(-&;0j*o?*)+Gjjn#T~QwNOt(i7U^PEerc0>R&Ti2(w9+`me5e8o9e zdgZ5h_qdl&=3WeiNuDpRoj1wV~J>~Ip%}w~LUPv1tf4lGUTe*xe-GT5}wlfFR{7IBSFa#$a}pkoCp9P{tn#^dXnNl%UUi>kGz3&ore) zlA(afOe`%apt8tpP`@CBy>NjF9`Mb=$F5fle(*xJ$hy4McH+#BwY>BJEEV&44f zXr>Zm4$@Ng2;)@7LObTASf#9=x8(I#LA&3Nh(#25Bzv&dF<>=Lr$qEjEMuGU$n}`9 z3nXN++6|FLjjrTOil~1WgDnvYG-ZPcD1NYnT;X0Vn60H@E6`UA>;GX)$AeB9&{uqu zcSvvklD-XLpjT6yCFhc<-9f5#fryjytBBd$89HVzLVj5c^SOkiT)ENtM+|1zJYE^p z3{!GQ|H-_5W|g---@d-9z#bhX)IFCtyZ3lWatz!+{TUNw8G_@F2NszApAsNbW|UwN z@b#}?o(MZTR@V#6>YZsUm75>!1sg*hW0}+X#QnngosAEI*u~;&mE>|P>chnht~(Bw zy8bb`G#C{`1>`Q!77jmjalof0p{tyKq<^ntle2A-!Y-<@g5cmH*YQfTj1{%2dum0V z9RIq^AMiGFTL~-Z8bf3pO*VALJkB*RDnsJeSZtmAI|;-7k5fy^r9IU+S(cH&2XQC> z0&z!P_%slc^Vj;~N-gqZ)~NZ}T)c5w=ovMw(tbmzmiCl&E{#iTt_C`{+l~f7Z*v~! zk#r{E7*lR|<`E@X4q~YlCJgh9kR`cL5@Z^>j8SIRMfyp=4^OE44qO=w%z)@iHfHJk z<*%lvVMl|Nd`I}yznUf*00=6*;HNp9IsIv_8Ut5Jd9FFU&y?8JW+yj7JROkMd{+(~ zWJ_9|YlTh7J}2Kj;yn63(!!bM(*pVnTfT(Xsl5mTtuj`B;$$j>%QI1A!Duv$d3}SI zbTqWeptin1+~68$o~|{44A&dZ4W@l%3Ie8km>qBwqRFVeb%iG$e__%)sT56gMt@7a z?U%_)PX0CvhGIQ0$GDq-fsQz8Nd~Fdx?b{QkUTYStLCTv-~=L_}cf zn}8LM49qmmL}g>Et)uh>-eP-Bac-Y_8A|C1Wk#bII+{JDWv~!zp z6H2E@e)b^zn<2x-B)JD`v#JHmrrA?egirW?2Cjt)FT^XK15n8B;#Y* zx#^D7MHuI4ccDYmiggnxOIxt$-CCEhdeaZd-RU0mP>Ye)&a1IAhvG03axH|=ugTUa zj_189rhv)h9~{moQiBvyLUN?d3>>$&ESU?ixjPO#a^I8|*IA4sbq!VFx2d=rqw&o# z?Nb+Zp1W$Ui4vm?b3zhGF#EcaLr-opWR|xS{c44P;Cm5D`n7(wb)@th?4d#eC>@4) z`90$cG|w-5{0ep)3m)i?cq5s?M#>O#f5KQ~nA#?)?tcm4@HDDNaA?vEBuGX{_9xim zqUv@x2tH@5J#V4h3=nyR#nF@kDq@)iCyGLoEHnd$U6Ow}pzfBKN~33|X2T}ZVCAK; za_sTi`Jom@uXAAyLkMDY^8aZ-_AVyPn`4*6@u}_(eGAVeF)3?nUOxz*+Mvz?G^K8E z9|slWJRzrHc*>#{Z(HtPY*8nHZZ^@EZfBUlf`|_(@M6mI4Qw884sWnQib?QN0o4kp6jbVlvR6KB?hlLGx=2-Czq|;G{?skNpj^%6NV62sq=GotVOZiWh_=M$RarK zj!ULhf$F+B812t^MvRrj1R}Gztfo(j*SSz1JDkrmRQ4_w>!%pBc!Qlx)d%ayP)gc} z*7bth;G8Aj9>mEfVxCkFe-E4Je;+5bH{01~mMkE}z6l`BT`|PRTzL)m6Oj!>y=5x` zxBF$~{%sKIx{05PX_XuRpmwq;M02sV0Bh_0IUxY=%Ep+cdlxyGWfVZ{(P%5g_*L?N zym0`uZ?tvdL&%me)GTO5Int`3*g8<6Z?W~YK?29)80KWmOKYz7Cp7{p$G&*3v)Qv+7jFC{Pe1Si4BhE@YEl zds6(Z)vPH>evF_WU}l(O_7vbFJj(`~7vmMq6t$qt*YZlT*eLmS&5!7cV&^LBmYqCm z;+F~p#Wt9LFi_|*?*7dV3tNK)7u{Mc=#M;UID`&WQVcs* z3VKVh9K#n=M~KOy$0b)Jj{Sig(v>eNlP6?%2OkQ4+gRy;`&J#uH*iEk^xLiaiMuuU zAwQC4F z1KLix8i~iCggWKJ?RtMjTP3>}XFvZW=d1Xt2Y1W6zmE$hK*xgPL{&pZ#0M{2!gazj z!udJNF!XVy=u5#q>FTGYa}KJjIM4GCRh$xX%W$g7`m>?u>%iF~PZ$TbmR`=3pkx_m zoIA-nWix+2!Vx7~`I6WHxSC-La>fc382^(jp4cYED>+mZ?^9;2t(LiQ2Lpe3IijoT> zX7-N5wwX+{^?g{RGZ%UG#Wz!XsR_$pz@+E}w%a7*?1S}H99+0zjhc}vK9=dRZ~T%! z<54r=hk);YdWbgrFHPc>V|LpdChG1iIzK8gRnb6lm0ja)8p}e<(Rb*5LXgUw>-6Pj zW(zk=_D^R*aKGTMdilxv=r4$@hF^SpZ3v%RnY)o6Z7_SvzfFEa8TO8=-7ZZ!^&C`D z@>~8UAT_Vm!__uw<8;w&s^d<*maT82aryMKaso@hF;UuZzi;ofFV)-R&k^nOFWh~N z-2@clfI>3^nvUa89rj{VtzQizNu^pz&I}xyZd2t2u3Kf>#+S1Dt2JftR;lA8zo?Dy zZt_LA9T4Q}qpG!JGDrkh;IN91SQ51aLM_RIy-HrlkrIv}-=DZg54g0#PwUR;VHwLf5IJH$DfkBO=N_;Nqq z(e-!g%2p0bHYYI@Z}z8UvN!I>_AD+F(4p0WA#Q!H+N=Y(H)Ye(5as7vl5U`OZ+=VV zsSdM_p_kw~?Khae;el-CGtosK?jLM*EmqB2=oW%!uH!r9XVIb=6uZm{!PjnT3G%=TwG-seUJ3R=;wW4w6E$PotpOLax5D%|S6vmgDfa2_j^Mwg&m`cy&$T~B$Q1Ie z>e@T;4PuSV2Fi16rW5REygEwrM@p zgpH6tcZjkkEWNZzLW?K-{7Hw`K}<9!E879?jAy)5` z6T&emHJk9&$yb_u_aN}EJwiY)(h#Z`b!|tB>|SO%0k<`plI=j*Zi=X$U?1X!oc@;) zYj705ai0K(7N}{mNV?u>00%cnv>AZQbI@d}il^i7FwePO&C$Mp8d-$kJ`0g~`POcD z5}A`WJ>3+UL*rV#$_c}52X*IP#^^jWJ7Ie2IW&tQq=u;DUl4*P_D|F26jVhP z(1ccFwSx(v>}|hqng46h6ZF@CCk7`qcAs)Kt9SNa=g-&C_0Q_f{FCef1r-@?|8Y0CpeOgAwEH5Y z#(Yiv=`9z^f7J9g;&ip?wo0~+gX`#;4hO=cUVIsg?I^9+(B&mqUK0y0A9|~v6VYXM zbyNNHQVHH!*XWYQ{huMHwJZ@KHVaAZAGsCFjF)JW$<2crbAdFLG;?fvLCqvw%E}uA zPBsXBjK?a6l{GSNcoN%D3w#~5Pe2hX@8Nbp_(ksO_2|bLK>KZ$B*gb1D$mSX;x+Ly zYMfx<to2K?COaQ?Ev z4z{((nGUQR&YN3*E8r^JjBS52j5K?|y%|j}Q^l1b(g*(fdZ?MZGQ==)&8|k;AnGWE zU+0I898+-=7yDH}VK+nyzdWOQEAd@N{mefCl0 zg>_rWYf;QdZreW&>Ex~5q_2h1Vue&cjobsAz=G)M^8T|4l$wfy?`D*;g%tKy$M?1@ zKkFt>vqV|eUn{-G;v?}D@m=E=Is`Q}bYnCdBuQ!-M~^0nulq+2$xrZ&@>T2#NZw$o zOyDR7Bu!>o0-{kfM!ccgiSMky z-uI)-y3b*7m-ap7+V0RA$im2-xcqwa=eZ9&{8tHI zqb@17qJ9wZ53ItvcB72&E1H^W9agnruft-kZ*zpoS~?BQV@Rp})Tw(ou6t0j$@4XO zrwD&wbo)q1N6rg!=rt^?lt4Af!2ND=WZ|b=YIpk1#Rq|++; zyj>R4BArP!e&)q&qT{MLy{s`GWDM;>=lGeVwNOmz^Cox1!P+0ZC!OCDFgQ`enLhBZ zXV2Qfv<98{*sfn6A&HrKAl!yj7?pmF^Uf==(M_0|B}X{&WF{2`k)paqoAclhB8jy* zM>@(AT*Npo(&~l`4bA!W-xqwm7TXZ`T=nMg?{X-?Nu-lPB>fyA${PxqFGaIv+^(Dx zm+R&fo=6aOy-*`cu?td==}|k`uzx~pBI85&8OMudKS_eJgM3%-3+k3o==sxi(aXD; z``yMUXbxGc4LLf`+)F+y?l2*5LH*SA2XH7_;PjX8#5%`igBJbrp4~T4q}iLo4cUR>kFAKLR*tor>gXou&b zYJCoMqD;?fb*GEp*d@^IwcABA{W1S0&`FPS*F_-l)cd-LWX3Pw9a;6GfE(@J7iIo9 z5$OgGE^NOs+Ft?%&d<>iEA+FEHehGo2)xM*u-@5y&xfMz4n)GvCorawKKF5O*+_o| z!!DAo+e~lmEjpbp#zOX)Q8EAJSdmr(F1L&KbXhp>_otJo=J5Is+bWHv>|Lk!FI#&{ z>!Qy26yxwfhUw3Jql>TmXnICf!0ydum4`mdMM7b~G={d1@#jR~9M<6WE*5FU)x=3ZVZ?1ePG_M)DUD`a7winz z)d%%(l|=L#Ao-$ZVVO?iCD&;D%Yl1{9f*7J!X`{i@?s;IMXao?-Dtd_tyl^3v7Iii z_r@+pmGq^-udXIXF)oI0&GM4Jd};1uuAo7;&*{D4PU1rBD2332s)k`rkS;ncyhFj7cpf{^B zP@3<4tj>RCGgu1F3<0`%5-b4g;`AP2PtryPhgQ7l^CAu|kZI_uTc0Nm_TMYkRO?Ea zBBFXAlIce)^87L9W2e^3j8J7Ay>gnVcvO((@ffQ5oELL%_qsP!S$0!=eSy=k6bZyjl_zC z3(rb4#4hhUMNVqWUsK9}dWCfF0u9!Dx6SoS^Le`+QzZd3NUjiem*KUfJ(jVI<>Zf> zO7+&MX}0s?CFyC^3-8~fL`iPxH-;Sr-&C3JiMO{^j7cL$g&$t*CxahTFA`;}OrA2A z|H>rI8CfKI3EK=(RL_K3(s&U{dTyu@RS;SXueS{kvxUx%JAEJl-5#!lEqn;4xwPxO zaekyg$4s)D2NQsn%WEnV+#2Cu2DLiiBQ_~6%UHZHdF}o9s(U1RqH!CNcH%BtN~^cX=AZus0wc>n@1eFsC4!wmWkw=f2Ee*w=kq{UfcAc;f3f; z;ed!aA|GE;JBidrac|ma8j6Tu9iDK3SJ%Uqmm%atoAhd|z# zjxP9}m~Zaibbt0ZWx5-GGMkBhk`R5%eiKt!c(<{q4O0QX#mp2B3bj2766NRGvP!yO zA?kN_$3fywwu+Hi_a-FOijBL>(t3sn%u(2@>(>vV!;pWv@!kzykA^>WiVfr9kqesN zEg6%F8s9oV&ShWcEEavx({~8nXEx1wqRLsYNK$cK=WcB25YpNz%Gwy%9_?7lTQV(5 z;(KG_*!5bcc%P_r5{+c#<_bN>$9Fr+ZTQ$`9NP0SzqHyngisDxZ1l4qh39$XFA!rG z<2Q%0nqL3$B`J=WeeC1|=9yiG1O4Rg>`);erViqLJE*}SRu9G*-I9l!!{J|sb*pSxMLypwjcPMcf;aN>VfOiGOJuU0m7$1c(XQDGW zdz{YLXu=R`D+=eyQ#U+I66^Y#s4dHpJviF|Qz9L}!^_G5xC#VKqWyx$;%xmaI zh_ogYy9!iys10i38P*Iy&cn*Ll}~ri`Wqo4GSmAve}nmdAk+dCuIo`|5KNpeUg6Ui zH6!!!;G{aHDS*>-((O&);&0u8#K5rWs=^)Wo^6d}Q2keIIQV&7oUIi^56xtwCRu8z z8U3;?ZAm` z;U6nq4~raV#OQs|8cnD$Xz|61 zh6-3lEczM{O$u(>Skg^t2-D*@((!T3jcc^;7m)HCsZ5OeYpvT6$Ik-sV0otk7^LQV z)+Qkg6#SbZ{a3AL0cY4hx214YZT+@pulBc$Wy~1R42b1*H9ZRu6^pG^lPGY08YyCR zTywalPxq)&s|pFqoFmTf3v{x4$;?2~JQHA`H?+y!v`k|X)mwpPQ3G?i()q)QQ#G`H zz{Nl#r4EApYv#lz9DIo*G>Rn^d1RLC5}J@D`e81yMyWtSv#We!OS878m@LIM;{Ps! zcnyP9-&9UF^`kAGr4l_Fu1riQQ3t2AqER|x2FKQcwZWr$anI9K=5o`=%mZx0_c)o^ z!k2Wyo!Bz9DA}1Qy;=irvKOU115xIywk%7Gg>AJ_E==GlhW}q%78P|!ruvOZh5${e z^a8?E^oG}Dx8IOUbTixZ%HS~hZpY5>dg~@gEi=m(Sh+S4kqeJLC=Kf=zd0(EOlq$x^a%8aC`pvtvFUU(=n z&blUPjAoZmn;ZizvsI=qgY-sn{g^%(eZG^O4Gws7;iVNoU113)@QfNKRT7Ez2%ib} zy;2!TN%&I;PSmE9GdpbIYiPcLB4BQUf&~+Y7NV@9JS4}X$K$-IIa8oAHF<1({aO5& z|FU}~a<*EkhK0k{Vfr%XZx?O}-k>^JLg^U=CW|<7V(o?EYp1IqVjo|)c-wms%$^0F zBD@>SIn^SzsiZ`O4nc&w){8o#=jObGh%l;`+KrPa?SYlniPe{btHbX2stdFuV_7+A z&XhU$M=6g1L$mVLqp)+^V7MJx*I;@xPf5MW&a^LA#K_-m~%0D731?v8faG#q))U_N1H8!D-i( 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%0DB)*GP*zwyj4yv)M9;>dco3RUK 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 Date: Sun, 27 Jan 2013 10:32:28 +0000 Subject: [PATCH 117/120] Hopefully fix #216. We now clamp the scroll value to within the Pull Scroll range --- .../handmark/pulltorefresh/library/PullToRefreshBase.java | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/library/src/com/handmark/pulltorefresh/library/PullToRefreshBase.java b/library/src/com/handmark/pulltorefresh/library/PullToRefreshBase.java index c33877c4f..8c8189fdb 100644 --- a/library/src/com/handmark/pulltorefresh/library/PullToRefreshBase.java +++ b/library/src/com/handmark/pulltorefresh/library/PullToRefreshBase.java @@ -47,7 +47,7 @@ public abstract class PullToRefreshBase extends LinearLayout imp // =========================================================== static final boolean DEBUG = true; - + static final boolean USE_HW_LAYERS = false; static final String LOG_TAG = "PullToRefresh"; @@ -945,11 +945,15 @@ protected final void refreshRefreshableViewSize(int width, int height) { * * @param value - New Scroll value */ - protected final void setHeaderScroll(final int value) { + protected final void setHeaderScroll(int value) { if (DEBUG) { Log.d(LOG_TAG, "setHeaderScroll: " + value); } + // Clamp value to with pull scroll range + final int maximumPullScroll = getMaximumPullScroll(); + value = Math.min(maximumPullScroll, Math.max(-maximumPullScroll, value)); + if (mLayoutVisibilityChangesEnabled) { if (value < 0) { mHeaderLayout.setVisibility(View.VISIBLE); From 5229b27288461ae65e11ec2e59db84160607ca36 Mon Sep 17 00:00:00 2001 From: Chris Banes Date: Sun, 27 Jan 2013 10:46:51 +0000 Subject: [PATCH 118/120] Fix #218. Don't call Refresh Listener until we've finished scrolling --- .../library/PullToRefreshBase.java | 59 +++++++++++++------ 1 file changed, 41 insertions(+), 18 deletions(-) diff --git a/library/src/com/handmark/pulltorefresh/library/PullToRefreshBase.java b/library/src/com/handmark/pulltorefresh/library/PullToRefreshBase.java index 8c8189fdb..e76b234f3 100644 --- a/library/src/com/handmark/pulltorefresh/library/PullToRefreshBase.java +++ b/library/src/com/handmark/pulltorefresh/library/PullToRefreshBase.java @@ -347,22 +347,10 @@ public final boolean onTouchEvent(MotionEvent event) { if (mIsBeingDragged) { mIsBeingDragged = false; - if (mState == State.RELEASE_TO_REFRESH) { - - if (null != mOnRefreshListener) { - setState(State.REFRESHING, true); - mOnRefreshListener.onRefresh(this); - return true; - - } else if (null != mOnRefreshListener2) { - setState(State.REFRESHING, true); - if (mCurrentMode == Mode.PULL_FROM_START) { - mOnRefreshListener2.onPullDownToRefresh(this); - } else if (mCurrentMode == Mode.PULL_FROM_END) { - mOnRefreshListener2.onPullUpToRefresh(this); - } - return true; - } + if (mState == State.RELEASE_TO_REFRESH + && (null != mOnRefreshListener || null != mOnRefreshListener2)) { + setState(State.REFRESHING, true); + return true; } // If we're already refreshing, just scroll back to the top @@ -746,19 +734,31 @@ protected void onRefreshing(final boolean doScroll) { if (doScroll) { if (mShowViewWhileRefreshing) { + + // Call Refresh Listener when the Scroll has finished + OnSmoothScrollFinishedListener listener = new OnSmoothScrollFinishedListener() { + @Override + public void onSmoothScrollFinished() { + callRefreshListener(); + } + }; + switch (mCurrentMode) { case MANUAL_REFRESH_ONLY: case PULL_FROM_END: - smoothScrollTo(getFooterSize()); + smoothScrollTo(getFooterSize(), listener); break; default: case PULL_FROM_START: - smoothScrollTo(-getHeaderSize()); + smoothScrollTo(-getHeaderSize(), listener); break; } } else { smoothScrollTo(0); } + } else { + // We're not scrolling, so just call Refresh Listener now + callRefreshListener(); } } @@ -995,6 +995,17 @@ protected final void smoothScrollTo(int scrollValue) { smoothScrollTo(scrollValue, getPullToRefreshScrollDuration()); } + /** + * Smooth Scroll to position using the default duration of + * {@value #SMOOTH_SCROLL_DURATION_MS} ms. + * + * @param scrollValue - Position to scroll to + * @param listener - Listener for scroll + */ + protected final void smoothScrollTo(int scrollValue, OnSmoothScrollFinishedListener listener) { + smoothScrollTo(scrollValue, getPullToRefreshScrollDuration(), 0, listener); + } + /** * Smooth Scroll to position using the longer default duration of * {@value #SMOOTH_SCROLL_LONG_DURATION_MS} ms. @@ -1047,6 +1058,18 @@ private void addRefreshableView(Context context, T refreshableView) { LayoutParams.MATCH_PARENT)); } + private void callRefreshListener() { + if (null != mOnRefreshListener) { + mOnRefreshListener.onRefresh(this); + } else if (null != mOnRefreshListener2) { + if (mCurrentMode == Mode.PULL_FROM_START) { + mOnRefreshListener2.onPullDownToRefresh(this); + } else if (mCurrentMode == Mode.PULL_FROM_END) { + mOnRefreshListener2.onPullUpToRefresh(this); + } + } + } + @SuppressWarnings("deprecation") private void init(Context context, AttributeSet attrs) { switch (getPullToRefreshScrollDirection()) { From ee10c53107a50574975c5b4fb619dcd3364a7a9c Mon Sep 17 00:00:00 2001 From: Chris Banes Date: Sun, 27 Jan 2013 10:51:56 +0000 Subject: [PATCH 119/120] Fix #220. Don't remove Empty View from View Hierarchy, leave it up to the dev. --- .../pulltorefresh/library/PullToRefreshAdapterViewBase.java | 5 ----- 1 file changed, 5 deletions(-) diff --git a/library/src/com/handmark/pulltorefresh/library/PullToRefreshAdapterViewBase.java b/library/src/com/handmark/pulltorefresh/library/PullToRefreshAdapterViewBase.java index b5132ed6a..cfff83716 100644 --- a/library/src/com/handmark/pulltorefresh/library/PullToRefreshAdapterViewBase.java +++ b/library/src/com/handmark/pulltorefresh/library/PullToRefreshAdapterViewBase.java @@ -168,11 +168,6 @@ public void setAdapter(ListAdapter adapter) { public final void setEmptyView(View newEmptyView) { FrameLayout refreshableViewWrapper = getRefreshableViewWrapper(); - // If we already have an Empty View, remove it - if (null != mEmptyView) { - refreshableViewWrapper.removeView(mEmptyView); - } - if (null != newEmptyView) { // New view needs to be clickable so that Android recognizes it as a // target for Touch Events From bff78c406f2dd9e856c60f4755b15d1d0ff5c35b Mon Sep 17 00:00:00 2001 From: Chris Banes Date: Sat, 2 Feb 2013 12:31:33 +0000 Subject: [PATCH 120/120] Update README to notify you of me no longer maintaining project --- README.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/README.md b/README.md index 1c9891884..b05891dd4 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,7 @@ +# PLEASE NOTE, THIS PROJECT IS NO LONGER BEING MAINTAINED + +* * * + # Pull To Refresh Views for Android ![Screenshot](https://github.com/chrisbanes/Android-PullToRefresh/raw/master/header_graphic.png)

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�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 nKwb%0FlSsh;2Zo_FJZpq}z>+KE8btpO6-W8x literal 0 HcmV?d00001 From 0aa78bc3b7173d4d2c74197502f7318e881bc4b0 Mon Sep 17 00:00:00 2001 From: Chris Banes Date: Thu, 6 Dec 2012 10:00:08 +0000 Subject: [PATCH 049/120] #172: Expose constructor so that Animation Style can be set in code. Close issues. - Also exposes the remaining constructors in the *ScrollView classes --- .../library/PullToRefreshAdapterViewBase.java | 5 +++++ .../library/PullToRefreshBase.java | 13 +++++++++++-- .../PullToRefreshExpandableListView.java | 4 ++++ .../library/PullToRefreshGridView.java | 4 ++++ .../PullToRefreshHorizontalScrollView.java | 18 +++++++++++++++--- .../library/PullToRefreshListView.java | 5 +++++ .../library/PullToRefreshScrollView.java | 18 +++++++++++++++--- .../library/PullToRefreshWebView.java | 12 ++++++++++++ 8 files changed, 71 insertions(+), 8 deletions(-) diff --git a/library/src/com/handmark/pulltorefresh/library/PullToRefreshAdapterViewBase.java b/library/src/com/handmark/pulltorefresh/library/PullToRefreshAdapterViewBase.java index bffaebe39..1cbba1267 100644 --- a/library/src/com/handmark/pulltorefresh/library/PullToRefreshAdapterViewBase.java +++ b/library/src/com/handmark/pulltorefresh/library/PullToRefreshAdapterViewBase.java @@ -64,6 +64,11 @@ public PullToRefreshAdapterViewBase(Context context, Mode mode) { mRefreshableView.setOnScrollListener(this); } + public PullToRefreshAdapterViewBase(Context context, Mode mode, AnimationStyle animStyle) { + super(context, mode, animStyle); + mRefreshableView.setOnScrollListener(this); + } + abstract public ContextMenuInfo getContextMenuInfo(); /** diff --git a/library/src/com/handmark/pulltorefresh/library/PullToRefreshBase.java b/library/src/com/handmark/pulltorefresh/library/PullToRefreshBase.java index a16d403c5..8ed2a2bce 100644 --- a/library/src/com/handmark/pulltorefresh/library/PullToRefreshBase.java +++ b/library/src/com/handmark/pulltorefresh/library/PullToRefreshBase.java @@ -122,6 +122,13 @@ public PullToRefreshBase(Context context, Mode mode) { init(context, null); } + public PullToRefreshBase(Context context, Mode mode, AnimationStyle animStyle) { + super(context); + mMode = mode; + mLoadingAnimationStyle = animStyle; + init(context, null); + } + @Override public void addView(View child, int index, ViewGroup.LayoutParams params) { if (DEBUG) { @@ -917,8 +924,10 @@ private void init(Context context, AttributeSet attrs) { mMode = Mode.mapIntToValue(a.getInteger(R.styleable.PullToRefresh_ptrMode, 0)); } - mLoadingAnimationStyle = AnimationStyle.mapIntToValue(a.getInteger(R.styleable.PullToRefresh_ptrAnimationStyle, - 0)); + if (a.hasValue(R.styleable.PullToRefresh_ptrAnimationStyle)) { + mLoadingAnimationStyle = AnimationStyle.mapIntToValue(a.getInteger(R.styleable.PullToRefresh_ptrAnimationStyle, + 0)); + } // Refreshable View // By passing the attrs, we can add ListView/GridView params via XML diff --git a/library/src/com/handmark/pulltorefresh/library/PullToRefreshExpandableListView.java b/library/src/com/handmark/pulltorefresh/library/PullToRefreshExpandableListView.java index 7606ab74a..c861c6bc1 100644 --- a/library/src/com/handmark/pulltorefresh/library/PullToRefreshExpandableListView.java +++ b/library/src/com/handmark/pulltorefresh/library/PullToRefreshExpandableListView.java @@ -40,6 +40,10 @@ public PullToRefreshExpandableListView(Context context, Mode mode) { super(context, mode); } + public PullToRefreshExpandableListView(Context context, Mode mode, AnimationStyle style) { + super(context, mode, style); + } + @Override public ContextMenuInfo getContextMenuInfo() { return ((InternalExpandableListView) getRefreshableView()).getContextMenuInfo(); diff --git a/library/src/com/handmark/pulltorefresh/library/PullToRefreshGridView.java b/library/src/com/handmark/pulltorefresh/library/PullToRefreshGridView.java index 6aceb0fbb..f7c5f2618 100644 --- a/library/src/com/handmark/pulltorefresh/library/PullToRefreshGridView.java +++ b/library/src/com/handmark/pulltorefresh/library/PullToRefreshGridView.java @@ -40,6 +40,10 @@ public PullToRefreshGridView(Context context, Mode mode) { super(context, mode); } + public PullToRefreshGridView(Context context, Mode mode, AnimationStyle style) { + super(context, mode, style); + } + @Override public ContextMenuInfo getContextMenuInfo() { return ((InternalGridView) getRefreshableView()).getContextMenuInfo(); diff --git a/library/src/com/handmark/pulltorefresh/library/PullToRefreshHorizontalScrollView.java b/library/src/com/handmark/pulltorefresh/library/PullToRefreshHorizontalScrollView.java index 9a0e945ba..84442364e 100644 --- a/library/src/com/handmark/pulltorefresh/library/PullToRefreshHorizontalScrollView.java +++ b/library/src/com/handmark/pulltorefresh/library/PullToRefreshHorizontalScrollView.java @@ -25,9 +25,21 @@ public class PullToRefreshHorizontalScrollView extends PullToRefreshBase { - public PullToRefreshHorizontalScrollView(Context context, AttributeSet attrs) { - super(context, attrs); - } + public PullToRefreshHorizontalScrollView(Context context) { + super(context); + } + + public PullToRefreshHorizontalScrollView(Context context, AttributeSet attrs) { + super(context, attrs); + } + + public PullToRefreshHorizontalScrollView(Context context, Mode mode) { + super(context, mode); + } + + public PullToRefreshHorizontalScrollView(Context context, Mode mode, AnimationStyle style) { + super(context, mode, style); + } @Override public final int getPullToRefreshScrollDirection() { diff --git a/library/src/com/handmark/pulltorefresh/library/PullToRefreshListView.java b/library/src/com/handmark/pulltorefresh/library/PullToRefreshListView.java index c65ba87d2..60c7b6fb1 100644 --- a/library/src/com/handmark/pulltorefresh/library/PullToRefreshListView.java +++ b/library/src/com/handmark/pulltorefresh/library/PullToRefreshListView.java @@ -57,6 +57,11 @@ public PullToRefreshListView(Context context, Mode mode) { setDisableScrollingWhileRefreshing(false); } + public PullToRefreshListView(Context context, Mode mode, AnimationStyle style) { + super(context, mode, style); + setDisableScrollingWhileRefreshing(false); + } + @Override public ContextMenuInfo getContextMenuInfo() { return ((InternalListView) getRefreshableView()).getContextMenuInfo(); diff --git a/library/src/com/handmark/pulltorefresh/library/PullToRefreshScrollView.java b/library/src/com/handmark/pulltorefresh/library/PullToRefreshScrollView.java index c5f0e0100..1df146df2 100644 --- a/library/src/com/handmark/pulltorefresh/library/PullToRefreshScrollView.java +++ b/library/src/com/handmark/pulltorefresh/library/PullToRefreshScrollView.java @@ -25,9 +25,21 @@ public class PullToRefreshScrollView extends PullToRefreshBase { - public PullToRefreshScrollView(Context context, AttributeSet attrs) { - super(context, attrs); - } + public PullToRefreshScrollView(Context context) { + super(context); + } + + public PullToRefreshScrollView(Context context, AttributeSet attrs) { + super(context, attrs); + } + + public PullToRefreshScrollView(Context context, Mode mode) { + super(context, mode); + } + + public PullToRefreshScrollView(Context context, Mode mode, AnimationStyle style) { + super(context, mode, style); + } @Override public final int getPullToRefreshScrollDirection() { diff --git a/library/src/com/handmark/pulltorefresh/library/PullToRefreshWebView.java b/library/src/com/handmark/pulltorefresh/library/PullToRefreshWebView.java index 175126018..5fc72e242 100644 --- a/library/src/com/handmark/pulltorefresh/library/PullToRefreshWebView.java +++ b/library/src/com/handmark/pulltorefresh/library/PullToRefreshWebView.java @@ -76,6 +76,18 @@ public PullToRefreshWebView(Context context, Mode mode) { 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 int getPullToRefreshScrollDirection() { From a5c0f7cd7ec858f1b8e218219f72ce7727e8dc00 Mon Sep 17 00:00:00 2001 From: Chris Banes Date: Thu, 6 Dec 2012 12:47:32 +0000 Subject: [PATCH 050/120] Small Javadoc fixes --- .../com/handmark/pulltorefresh/library/IPullToRefresh.java | 4 ++-- .../pulltorefresh/library/PullToRefreshAdapterViewBase.java | 6 +++--- .../library/internal/EmptyViewMethodAccessor.java | 4 ++-- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/library/src/com/handmark/pulltorefresh/library/IPullToRefresh.java b/library/src/com/handmark/pulltorefresh/library/IPullToRefresh.java index 5172f1768..42e270b24 100644 --- a/library/src/com/handmark/pulltorefresh/library/IPullToRefresh.java +++ b/library/src/com/handmark/pulltorefresh/library/IPullToRefresh.java @@ -224,7 +224,7 @@ public interface IPullToRefresh { * Set Text to show when the Widget is being Pulled * setPullLabel(releaseLabel, Mode.BOTH) * - * @param releaseLabel + * @param pullLabel * - CharSequence to display */ public void setPullLabel(CharSequence pullLabel); @@ -260,7 +260,7 @@ public interface IPullToRefresh { * Set Text to show when the Widget is refreshing * setRefreshingLabel(releaseLabel, Mode.BOTH) * - * @param releaseLabel + * @param refreshingLabel * - CharSequence to display */ public void setRefreshingLabel(CharSequence refreshingLabel); diff --git a/library/src/com/handmark/pulltorefresh/library/PullToRefreshAdapterViewBase.java b/library/src/com/handmark/pulltorefresh/library/PullToRefreshAdapterViewBase.java index 1cbba1267..caab8ec7f 100644 --- a/library/src/com/handmark/pulltorefresh/library/PullToRefreshAdapterViewBase.java +++ b/library/src/com/handmark/pulltorefresh/library/PullToRefreshAdapterViewBase.java @@ -75,7 +75,7 @@ public PullToRefreshAdapterViewBase(Context context, Mode mode, AnimationStyle a * Gets whether an indicator graphic should be displayed when the View is in * a state where a Pull-to-Refresh can happen. An example of this state is * when the Adapter View is scrolled to the top and the mode is set to - * {@link Mode#PULL_DOWN_TO_REFRESH}. The default value is true + * {@link Mode#PULL_FROM_START}. The default value is true * if {@link PullToRefreshBase#isPullToRefreshOverScrollEnabled() * isPullToRefreshOverScrollEnabled()} returns false. * @@ -131,7 +131,7 @@ public final void onScrollStateChanged(final AbsListView view, final int scrollS /** * Pass-through method for {@link PullToRefreshBase#getRefreshableView() - * getRefreshableView()}.{@link AdapterView#setAdapter(ListAdapter) + * getRefreshableView()}.{@link AdapterView#setAdapter(android.widget.Adapter)} * setAdapter(adapter)}. This is just for convenience! * * @param adapter @@ -214,7 +214,7 @@ public final void setScrollEmptyView(boolean doScroll) { * Sets whether an indicator graphic should be displayed when the View is in * a state where a Pull-to-Refresh can happen. An example of this state is * when the Adapter View is scrolled to the top and the mode is set to - * {@link Mode#PULL_DOWN_TO_REFRESH} + * {@link Mode#PULL_FROM_START} * * @param showIndicator * - true if the indicators should be shown. diff --git a/library/src/com/handmark/pulltorefresh/library/internal/EmptyViewMethodAccessor.java b/library/src/com/handmark/pulltorefresh/library/internal/EmptyViewMethodAccessor.java index 9b561ece4..1a7940d75 100644 --- a/library/src/com/handmark/pulltorefresh/library/internal/EmptyViewMethodAccessor.java +++ b/library/src/com/handmark/pulltorefresh/library/internal/EmptyViewMethodAccessor.java @@ -28,7 +28,7 @@ public interface EmptyViewMethodAccessor { /** * Calls upto AdapterView.setEmptyView() * - * @param View + * @param emptyView - * to set as Empty View */ public void setEmptyViewInternal(View emptyView); @@ -37,7 +37,7 @@ public interface EmptyViewMethodAccessor { * Should call PullToRefreshBase.setEmptyView() which will then * automatically call through to setEmptyViewInternal() * - * @param View + * @param emptyView - * to set as Empty View */ public void setEmptyView(View emptyView); From 4f9ed52f36dfdcd661c3b0bfcd2eb5876eabaaef Mon Sep 17 00:00:00 2001 From: Chris Banes Date: Thu, 6 Dec 2012 15:39:24 +0000 Subject: [PATCH 051/120] New code formatter. Whooo. --- .../pulltorefresh/library/IPullToRefresh.java | 141 ++++++++---------- .../library/OverscrollHelper.java | 133 +++++++---------- .../library/PullToRefreshAdapterViewBase.java | 47 +++--- .../library/PullToRefreshBase.java | 141 ++++++++---------- .../PullToRefreshExpandableListView.java | 12 +- .../library/PullToRefreshGridView.java | 10 +- .../PullToRefreshHorizontalScrollView.java | 28 ++-- .../library/PullToRefreshListView.java | 16 +- .../library/PullToRefreshScrollView.java | 28 ++-- .../library/PullToRefreshWebView.java | 32 ++-- .../library/extras/PullToRefreshWebView2.java | 14 +- .../extras/SoundPullEventListener.java | 17 +-- .../internal/EmptyViewMethodAccessor.java | 10 +- 13 files changed, 282 insertions(+), 347 deletions(-) diff --git a/library/src/com/handmark/pulltorefresh/library/IPullToRefresh.java b/library/src/com/handmark/pulltorefresh/library/IPullToRefresh.java index 42e270b24..95f873ad4 100644 --- a/library/src/com/handmark/pulltorefresh/library/IPullToRefresh.java +++ b/library/src/com/handmark/pulltorefresh/library/IPullToRefresh.java @@ -33,7 +33,7 @@ public interface IPullToRefresh { * app, etc. The animation will only happen if the Refresh View (ListView, * ScrollView, etc) is in a state where a Pull-to-Refresh could occur by a * user's touch gesture (i.e. scrolled to the top/bottom). - * + * * @return true - if the Demo has been started, false if not. */ public boolean demo(); @@ -41,7 +41,7 @@ public interface IPullToRefresh { /** * Get the mode that this view is currently in. This is only really useful * when using Mode.BOTH. - * + * * @return Mode that the view is currently in */ public Mode getCurrentMode(); @@ -52,7 +52,7 @@ public interface IPullToRefresh { * in the Y-axis is greater than the difference in the X-axis. This means * that the View will not interfere when it is used in a horizontal * scrolling View (such as a ViewPager). - * + * * @return boolean - true if the View is filtering Touch Events */ public boolean getFilterTouchEvents(); @@ -61,7 +61,7 @@ public interface IPullToRefresh { * Get the mode that this view has been set to. If this returns * Mode.BOTH, you can use getCurrentMode() to * check which mode the view is currently in - * + * * @return Mode that the view has been set to */ public Mode getMode(); @@ -69,7 +69,7 @@ public interface IPullToRefresh { /** * Get the Wrapped Refreshable View. Anything returned here has already been * added to the content view. - * + * * @return The View which is currently wrapped */ public T getRefreshableView(); @@ -77,7 +77,7 @@ public interface IPullToRefresh { /** * Get whether the 'Refreshing' View should be automatically shown when * refreshing. Returns true by default. - * + * * @return - true if the Refreshing View will be show */ public boolean getShowViewWhileRefreshing(); @@ -90,7 +90,7 @@ public interface IPullToRefresh { /** * Returns whether the widget has disabled scrolling on the Refreshable View * while refreshing. - * + * * @return true if the widget has disabled scrolling while refreshing */ public boolean isDisableScrollingWhileRefreshing(); @@ -99,7 +99,7 @@ public interface IPullToRefresh { * Gets whether Overscroll support is enabled. This is different to * Android's standard Overscroll support (the edge-glow) which is available * from GINGERBREAD onwards - * + * * @return true - if both PullToRefresh-OverScroll and Android's inbuilt * OverScroll are enabled */ @@ -107,14 +107,14 @@ public interface IPullToRefresh { /** * Whether Pull-to-Refresh is enabled - * + * * @return enabled */ public boolean isPullToRefreshEnabled(); /** * Returns whether the Widget is currently in the Refreshing mState - * + * * @return true if the Widget is currently refreshing */ public boolean isRefreshing(); @@ -128,9 +128,9 @@ public interface IPullToRefresh { /** * By default the Widget disabled scrolling on the Refreshable View while * refreshing. This method can change this behaviour. - * + * * @param disableScrollingWhileRefreshing - * - true if you want to disable scrolling while refreshing + * - true if you want to disable scrolling while refreshing */ public void setDisableScrollingWhileRefreshing(boolean disableScrollingWhileRefreshing); @@ -141,72 +141,63 @@ public interface IPullToRefresh { * interfere when it is used in a horizontal scrolling View (such as a * ViewPager), but will restrict which types of finger scrolls will trigger * the View. - * - * @param filterEvents - * - true if you want to filter Touch Events. Default is true. + * + * @param filterEvents - true if you want to filter Touch Events. Default is true. */ public void setFilterTouchEvents(boolean filterEvents); /** * Set the Last Updated Text. This displayed under the main label when * Pulling - * - * @param label - * - Label to set + * + * @param label - Label to set */ public void setLastUpdatedLabel(CharSequence label); /** * Set the drawable used in the loading layout. This is the same as calling * setLoadingDrawable(drawable, Mode.BOTH) - * - * @param drawable - * - Drawable to display + * + * @param drawable - Drawable to display */ public void setLoadingDrawable(Drawable drawable); /** * Set the drawable used in the loading layout. - * - * @param drawable - * - Drawable to display - * @param mode - * - Controls which Header/Footer Views will be updated. - * Mode.BOTH will update all available, other values - * will update the relevant View. + * + * @param drawable - Drawable to display + * @param mode - Controls which Header/Footer Views will be updated. + * Mode.BOTH will update all available, other values + * will update the relevant View. */ public void setLoadingDrawable(Drawable drawable, Mode mode); /** * Set the mode of Pull-to-Refresh that this view will use. - * - * @param mode - * - Mode to set the View to + * + * @param mode - Mode to set the View to */ public void setMode(Mode mode); /** * Set OnPullEventListener for the Widget - * - * @param listener - * - Listener to be used when the Widget has a pull event to - * propogate. + * + * @param listener - Listener to be used when the Widget has a pull event to + * propogate. */ public void setOnPullEventListener(OnPullEventListener listener); /** * Set OnRefreshListener for the Widget - * - * @param listener - * - Listener to be used when the Widget is set to Refresh + * + * @param listener - Listener to be used when the Widget is set to Refresh */ public void setOnRefreshListener(OnRefreshListener listener); /** * Set OnRefreshListener for the Widget - * - * @param listener - * - Listener to be used when the Widget is set to Refresh + * + * @param listener - Listener to be used when the Widget is set to Refresh */ public void setOnRefreshListener(OnRefreshListener2 listener); @@ -214,30 +205,26 @@ public interface IPullToRefresh { * Sets whether Overscroll support is enabled. This is different to * Android's standard Overscroll support (the edge-glow). This setting only * takes effect when running on device with Android v2.3 or greater. - * - * @param enabled - * - true if you want Overscroll enabled + * + * @param enabled - true if you want Overscroll enabled */ public void setPullToRefreshOverScrollEnabled(boolean enabled); /** * Set Text to show when the Widget is being Pulled * setPullLabel(releaseLabel, Mode.BOTH) - * - * @param pullLabel - * - CharSequence to display + * + * @param pullLabel - CharSequence to display */ public void setPullLabel(CharSequence pullLabel); /** * Set Text to show when the Widget is being Pulled - * - * @param pullLabel - * - CharSequence to display - * @param mode - * - Controls which Header/Footer Views will be updated. - * Mode.BOTH will update all available, other values - * will update the relevant View. + * + * @param pullLabel - CharSequence to display + * @param mode - Controls which Header/Footer Views will be updated. + * Mode.BOTH will update all available, other values + * will update the relevant View. */ public void setPullLabel(CharSequence pullLabel, Mode mode); @@ -250,30 +237,26 @@ public interface IPullToRefresh { /** * Sets the Widget to be in the refresh state. The UI will be updated to * show the 'Refreshing' view. - * - * @param doScroll - * - true if you want to force a scroll to the Refreshing view. + * + * @param doScroll - true if you want to force a scroll to the Refreshing view. */ public void setRefreshing(boolean doScroll); /** * Set Text to show when the Widget is refreshing * setRefreshingLabel(releaseLabel, Mode.BOTH) - * - * @param refreshingLabel - * - CharSequence to display + * + * @param refreshingLabel - CharSequence to display */ public void setRefreshingLabel(CharSequence refreshingLabel); /** * Set Text to show when the Widget is refreshing - * - * @param refreshingLabel - * - CharSequence to display - * @param mode - * - Controls which Header/Footer Views will be updated. - * Mode.BOTH will update all available, other values - * will update the relevant View. + * + * @param refreshingLabel - CharSequence to display + * @param mode - Controls which Header/Footer Views will be updated. + * Mode.BOTH will update all available, other values + * will update the relevant View. */ public void setRefreshingLabel(CharSequence refreshingLabel, Mode mode); @@ -281,38 +264,34 @@ public interface IPullToRefresh { * Set Text to show when the Widget is being pulled, and will refresh when * released. This is the same as calling * setReleaseLabel(releaseLabel, Mode.BOTH) - * - * @param releaseLabel - * - CharSequence to display + * + * @param releaseLabel - CharSequence to display */ public void setReleaseLabel(CharSequence releaseLabel); /** * Set Text to show when the Widget is being pulled, and will refresh when * released - * - * @param releaseLabel - * - CharSequence to display - * @param mode - * - Controls which Header/Footer Views will be updated. - * Mode.BOTH will update all available, other values - * will update the relevant View. + * + * @param releaseLabel - CharSequence to display + * @param mode - Controls which Header/Footer Views will be updated. + * Mode.BOTH will update all available, other values + * will update the relevant View. */ public void setReleaseLabel(CharSequence releaseLabel, Mode mode); /** * Sets the Animation Interpolator that is used for animated scrolling. * Defaults to a DecelerateInterpolator - * - * @param interpolator - * - Interpolator to use + * + * @param interpolator - Interpolator to use */ public void setScrollAnimationInterpolator(Interpolator interpolator); /** * A mutator to enable/disable whether the 'Refreshing' View should be * automatically shown when refreshing. - * + * * @param showView */ public void setShowViewWhileRefreshing(boolean showView); diff --git a/library/src/com/handmark/pulltorefresh/library/OverscrollHelper.java b/library/src/com/handmark/pulltorefresh/library/OverscrollHelper.java index 07860ccc8..c91e7234f 100644 --- a/library/src/com/handmark/pulltorefresh/library/OverscrollHelper.java +++ b/library/src/com/handmark/pulltorefresh/library/OverscrollHelper.java @@ -30,31 +30,25 @@ public final class OverscrollHelper { /** * Helper method for Overscrolling that encapsulates all of the necessary * function. - * + *

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�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 nKwb%0FlSsh;2Zo_FJZpq}z>+KE8btpO6-W8x literal 0 HcmV?d00001 diff --git a/extras/PullToRefreshViewPager/pom.xml b/extras/PullToRefreshViewPager/pom.xml new file mode 100644 index 000000000..031995557 --- /dev/null +++ b/extras/PullToRefreshViewPager/pom.xml @@ -0,0 +1,46 @@ + + + 4.0.0 + + com.github.chrisbanes.pulltorefresh + extra-viewpager + apklib + Android-PullToRefresh Extras: ViewPager + + + com.github.chrisbanes.pulltorefresh + extras + 1.4.3-SNAPSHOT + + + + + com.google.android + android + + + com.google.android + support-v4 + r7 + + + ${project.groupId} + library + apklib + ${project.version} + + + + + + + com.jayway.maven.plugins.android.generation2 + android-maven-plugin + + + org.apache.maven.plugins + maven-eclipse-plugin + + + + diff --git a/extras/PullToRefreshViewPager/proguard-project.txt b/extras/PullToRefreshViewPager/proguard-project.txt new file mode 100644 index 000000000..f2fe1559a --- /dev/null +++ b/extras/PullToRefreshViewPager/proguard-project.txt @@ -0,0 +1,20 @@ +# To enable ProGuard in your project, edit project.properties +# to define the proguard.config property as described in that file. +# +# Add project specific ProGuard rules here. +# By default, the flags in this file are appended to flags specified +# in ${sdk.dir}/tools/proguard/proguard-android.txt +# You can edit the include path and order by changing the ProGuard +# include property in project.properties. +# +# For more details, see +# http://developer.android.com/guide/developing/tools/proguard.html + +# Add any project specific keep options here: + +# If your project uses WebView with JS, uncomment the following +# and specify the fully qualified class name to the JavaScript interface +# class: +#-keepclassmembers class fqcn.of.javascript.interface.for.webview { +# public *; +#} diff --git a/extras/PullToRefreshViewPager/project.properties b/extras/PullToRefreshViewPager/project.properties new file mode 100644 index 000000000..927fba41c --- /dev/null +++ b/extras/PullToRefreshViewPager/project.properties @@ -0,0 +1,16 @@ +# This file is automatically generated by Android Tools. +# Do not modify this file -- YOUR CHANGES WILL BE ERASED! +# +# This file must be checked in Version Control Systems. +# +# To customize properties used by the Ant build system edit +# "ant.properties", and override values to adapt the script to your +# project structure. +# +# To enable ProGuard to shrink and obfuscate your code, uncomment this (available properties: sdk.dir, user.home): +#proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt + +android.library=true +# Project target. +target=android-16 +android.library.reference.1=../../library diff --git a/extras/PullToRefreshViewPager/res/layout/need_this_for_maven.xml b/extras/PullToRefreshViewPager/res/layout/need_this_for_maven.xml new file mode 100644 index 000000000..f59ab8781 --- /dev/null +++ b/extras/PullToRefreshViewPager/res/layout/need_this_for_maven.xml @@ -0,0 +1,9 @@ + + + + + + \ No newline at end of file diff --git a/extras/PullToRefreshViewPager/res/values/ids.xml b/extras/PullToRefreshViewPager/res/values/ids.xml new file mode 100644 index 000000000..81cebf0eb --- /dev/null +++ b/extras/PullToRefreshViewPager/res/values/ids.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/extras/PullToRefreshViewPager/src/com/handmark/pulltorefresh/extras/viewpager/PullToRefreshViewPager.java b/extras/PullToRefreshViewPager/src/com/handmark/pulltorefresh/extras/viewpager/PullToRefreshViewPager.java new file mode 100644 index 000000000..d7305e34c --- /dev/null +++ b/extras/PullToRefreshViewPager/src/com/handmark/pulltorefresh/extras/viewpager/PullToRefreshViewPager.java @@ -0,0 +1,70 @@ +/******************************************************************************* + * 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.extras.viewpager; + +import android.content.Context; +import android.support.v4.view.PagerAdapter; +import android.support.v4.view.ViewPager; +import android.util.AttributeSet; + +import com.handmark.pulltorefresh.library.PullToRefreshBase; + +public class PullToRefreshViewPager extends PullToRefreshBase { + + public PullToRefreshViewPager(Context context) { + super(context); + } + + public PullToRefreshViewPager(Context context, AttributeSet attrs) { + super(context, attrs); + } + + @Override + public final int getPullToRefreshScrollDirection() { + return HORIZONTAL_SCROLL; + } + + @Override + protected ViewPager createRefreshableView(Context context, AttributeSet attrs) { + ViewPager viewPager = new ViewPager(context, attrs); + viewPager.setId(R.id.viewpager); + return viewPager; + } + + @Override + protected boolean isReadyForPullStart() { + ViewPager refreshableView = getRefreshableView(); + + PagerAdapter adapter = refreshableView.getAdapter(); + if (null != adapter) { + return refreshableView.getCurrentItem() == 0; + } + + return false; + } + + @Override + protected boolean isReadyForPullEnd() { + ViewPager refreshableView = getRefreshableView(); + + PagerAdapter adapter = refreshableView.getAdapter(); + if (null != adapter) { + return refreshableView.getCurrentItem() == adapter.getCount() - 1; + } + + return false; + } +} diff --git a/extras/pom.xml b/extras/pom.xml index 277693fc9..a88bfd1ee 100644 --- a/extras/pom.xml +++ b/extras/pom.xml @@ -15,5 +15,6 @@ PullToRefreshListFragment + PullToRefreshViewPager diff --git a/sample/AndroidManifest.xml b/sample/AndroidManifest.xml index f693d209e..c35fe2fd4 100755 --- a/sample/AndroidManifest.xml +++ b/sample/AndroidManifest.xml @@ -50,6 +50,10 @@ android:name=".PullToRefreshHorizontalScrollViewActivity" android:label="PtR HorizontalScrollView" > + + diff --git a/sample/project.properties b/sample/project.properties index 0c37987ca..bcee3ff1d 100755 --- a/sample/project.properties +++ b/sample/project.properties @@ -11,3 +11,4 @@ target=android-15 android.library.reference.1=../library android.library.reference.2=../extras/PullToRefreshListFragment +android.library.reference.3=../extras/PullToRefreshViewPager diff --git a/sample/res/drawable-nodpi/wallpaper.jpg b/sample/res/drawable-nodpi/wallpaper.jpg new file mode 100644 index 0000000000000000000000000000000000000000..6bc52926c5cd2866455da366d585434353c6fb36 GIT binary patch literal 94597 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