diff --git a/core/pulltorefresh/build.gradle b/core/pulltorefresh/build.gradle deleted file mode 100644 index 102c5711..00000000 --- a/core/pulltorefresh/build.gradle +++ /dev/null @@ -1,8 +0,0 @@ -apply from: bootstrap.androidModule - -android { - lintOptions { - baselineFile file("lint-baseline.xml") - abortOnError true - } -} diff --git a/core/pulltorefresh/lint-baseline.xml b/core/pulltorefresh/lint-baseline.xml deleted file mode 100644 index 771b65e4..00000000 --- a/core/pulltorefresh/lint-baseline.xml +++ /dev/null @@ -1,326 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/pulltorefresh/src/main/AndroidManifest.xml b/core/pulltorefresh/src/main/AndroidManifest.xml deleted file mode 100644 index 2dc1eb5f..00000000 --- a/core/pulltorefresh/src/main/AndroidManifest.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - \ No newline at end of file diff --git a/core/pulltorefresh/src/main/java/com/handmark/pulltorefresh/library/ILoadingLayout.java b/core/pulltorefresh/src/main/java/com/handmark/pulltorefresh/library/ILoadingLayout.java deleted file mode 100644 index ff2a9572..00000000 --- a/core/pulltorefresh/src/main/java/com/handmark/pulltorefresh/library/ILoadingLayout.java +++ /dev/null @@ -1,57 +0,0 @@ -package com.handmark.pulltorefresh.library; - -import android.graphics.Typeface; -import android.graphics.drawable.Drawable; - -public interface ILoadingLayout { - - /** - * 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 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 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'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/core/pulltorefresh/src/main/java/com/handmark/pulltorefresh/library/IPullToRefresh.java b/core/pulltorefresh/src/main/java/com/handmark/pulltorefresh/library/IPullToRefresh.java deleted file mode 100644 index a06cdd7c..00000000 --- a/core/pulltorefresh/src/main/java/com/handmark/pulltorefresh/library/IPullToRefresh.java +++ /dev/null @@ -1,246 +0,0 @@ -/******************************************************************************* - * 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.view.View; -import android.view.animation.Interpolator; - -import com.handmark.pulltorefresh.library.PullToRefreshBase.Mode; -import com.handmark.pulltorefresh.library.PullToRefreshBase.OnPullEventListener; -import com.handmark.pulltorefresh.library.PullToRefreshBase.OnRefreshListener; -import com.handmark.pulltorefresh.library.PullToRefreshBase.OnRefreshListener2; -import com.handmark.pulltorefresh.library.PullToRefreshBase.State; - -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. - * - * @return Mode that the view is currently in - */ - public Mode getCurrentMode(); - - /** - * Returns whether the Touch Events are filtered or not. If true is - * returned, then the View will only use touch events where the difference - * 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(); - - /** - * 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 - * check which mode the view is currently in - * - * @return Mode that the view has been set to - */ - public Mode getMode(); - - /** - * 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(); - - /** - * 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(); - - /** - * @return - The state that the View is currently in. - */ - public State getState(); - - /** - * Whether Pull-to-Refresh is enabled - * - * @return enabled - */ - 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(); - - /** - * Returns whether the Widget is currently in the Refreshing mState - * - * @return true if the Widget is currently refreshing - */ - public boolean isRefreshing(); - - /** - * Returns whether the widget has enabled scrolling on the Refreshable View - * while refreshing. - * - * @return true if the widget has enabled scrolling while refreshing - */ - public boolean isScrollingWhileRefreshingEnabled(); - - /** - * Mark the current Refresh as complete. Will Reset the UI and hide the - * Refreshing View - */ - public void onRefreshComplete(); - - /** - * Set the Touch Events to be filtered or not. If set to true, then the View - * will only use touch events where the difference 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), 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. - */ - public void setFilterTouchEvents(boolean filterEvents); - - /** - * 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. - */ - 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); - - /** - * 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. - */ - public void setRefreshing(); - - /** - * 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. - */ - public void setRefreshing(boolean doScroll); - - /** - * 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); - -} \ No newline at end of file diff --git a/core/pulltorefresh/src/main/java/com/handmark/pulltorefresh/library/LoadingLayoutProxy.java b/core/pulltorefresh/src/main/java/com/handmark/pulltorefresh/library/LoadingLayoutProxy.java deleted file mode 100644 index 5f76645d..00000000 --- a/core/pulltorefresh/src/main/java/com/handmark/pulltorefresh/library/LoadingLayoutProxy.java +++ /dev/null @@ -1,73 +0,0 @@ -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 HashSet mLoadingLayouts; - - LoadingLayoutProxy() { - mLoadingLayouts = new HashSet(); - } - - /** - * 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); - } - } - - @Override - public void setLastUpdatedLabel(CharSequence label) { - for (LoadingLayout layout : mLoadingLayouts) { - layout.setLastUpdatedLabel(label); - } - } - - @Override - public void setLoadingDrawable(Drawable drawable) { - for (LoadingLayout layout : mLoadingLayouts) { - layout.setLoadingDrawable(drawable); - } - } - - @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.setReleaseLabel(label); - } - } - - public void setTextTypeface(Typeface tf) { - for (LoadingLayout layout : mLoadingLayouts) { - layout.setTextTypeface(tf); - } - } -} diff --git a/core/pulltorefresh/src/main/java/com/handmark/pulltorefresh/library/OverscrollHelper.java b/core/pulltorefresh/src/main/java/com/handmark/pulltorefresh/library/OverscrollHelper.java deleted file mode 100644 index 52a20de2..00000000 --- a/core/pulltorefresh/src/main/java/com/handmark/pulltorefresh/library/OverscrollHelper.java +++ /dev/null @@ -1,178 +0,0 @@ -/******************************************************************************* - * 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.util.Log; -import android.view.View; - -import com.handmark.pulltorefresh.library.PullToRefreshBase.Mode; -import com.handmark.pulltorefresh.library.PullToRefreshBase.State; - -@TargetApi(9) -public final class OverscrollHelper { - - static final String LOG_TAG = "OverscrollHelper"; - static final float DEFAULT_OVERSCROLL_SCALE = 1f; - - /** - * Helper method for Overscrolling that encapsulates all of the necessary - * function. - *

- * 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 - */ - 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); - } - - /** - * 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 - */ - 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 - */ - 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()) { - case HORIZONTAL: - deltaValue = deltaX; - scrollValue = scrollX; - currentScrollValue = view.getScrollX(); - break; - case VERTICAL: - default: - deltaValue = deltaY; - scrollValue = scrollY; - currentScrollValue = view.getScrollY(); - break; - } - - // 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 - // touch - if (mode.permitsPullToRefresh() && !isTouchEvent && deltaValue != 0) { - 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); - } - - 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()) { - // 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) { - // Means we've stopped overscrolling, so scroll back to 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); - } - } - } - - static boolean isAndroidOverScrollEnabled(View view) { - return view.getOverScrollMode() != View.OVER_SCROLL_NEVER; - } -} diff --git a/core/pulltorefresh/src/main/java/com/handmark/pulltorefresh/library/PullToRefreshAdapterViewBase.java b/core/pulltorefresh/src/main/java/com/handmark/pulltorefresh/library/PullToRefreshAdapterViewBase.java deleted file mode 100644 index cfff8371..00000000 --- a/core/pulltorefresh/src/main/java/com/handmark/pulltorefresh/library/PullToRefreshAdapterViewBase.java +++ /dev/null @@ -1,475 +0,0 @@ -/******************************************************************************* - * 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.content.Context; -import android.content.res.TypedArray; -import android.util.AttributeSet; -import android.util.Log; -import android.view.Gravity; -import android.view.View; -import android.view.ViewGroup; -import android.view.ViewParent; -import android.widget.AbsListView; -import android.widget.AbsListView.OnScrollListener; -import android.widget.Adapter; -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; -import com.handmark.pulltorefresh.library.internal.IndicatorLayout; - -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 boolean mLastItemVisible; - private OnScrollListener mOnScrollListener; - private OnLastItemVisibleListener mOnLastItemVisibleListener; - private View mEmptyView; - - private IndicatorLayout mIndicatorIvTop; - private IndicatorLayout mIndicatorIvBottom; - - private boolean mShowIndicator; - private boolean mScrollEmptyView = true; - - public PullToRefreshAdapterViewBase(Context context) { - super(context); - mRefreshableView.setOnScrollListener(this); - } - - public PullToRefreshAdapterViewBase(Context context, AttributeSet attrs) { - super(context, attrs); - mRefreshableView.setOnScrollListener(this); - } - - public PullToRefreshAdapterViewBase(Context context, Mode mode) { - super(context, mode); - mRefreshableView.setOnScrollListener(this); - } - - public PullToRefreshAdapterViewBase(Context context, Mode mode, AnimationStyle animStyle) { - super(context, mode, animStyle); - mRefreshableView.setOnScrollListener(this); - } - - /** - * 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() - * isPullToRefreshOverScrollEnabled()} returns false. - * - * @return true if the indicators will be shown - */ - public boolean getShowIndicator() { - return mShowIndicator; - } - - public final void onScroll(final AbsListView view, final int firstVisibleItem, final int visibleItemCount, - final int totalItemCount) { - - if (DEBUG) { - Log.d(LOG_TAG, "First Visible: " + firstVisibleItem + ". Visible Count: " + visibleItemCount - + ". Total Items:" + totalItemCount); - } - - /** - * Set whether the Last Item is Visible. lastVisibleItemIndex is a - * zero-based index, so we minus one totalItemCount to check - */ - if (null != mOnLastItemVisibleListener) { - mLastItemVisible = (totalItemCount > 0) && (firstVisibleItem + visibleItemCount >= totalItemCount - 1); - } - - // If we're showing the indicator, check positions... - if (getShowIndicatorInternal()) { - updateIndicatorViewsVisibility(); - } - - // Finally call OnScrollListener if we have one - if (null != mOnScrollListener) { - mOnScrollListener.onScroll(view, firstVisibleItem, visibleItemCount, totalItemCount); - } - } - - 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, state); - } - } - - /** - * 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 - */ - public void setAdapter(ListAdapter adapter) { - ((AdapterView) mRefreshableView).setAdapter(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 - */ - public final void setEmptyView(View newEmptyView) { - FrameLayout refreshableViewWrapper = getRefreshableViewWrapper(); - - if (null != newEmptyView) { - // New view needs to be clickable so that Android recognizes it as a - // target for Touch Events - newEmptyView.setClickable(true); - - ViewParent newEmptyViewParent = newEmptyView.getParent(); - if (null != newEmptyViewParent && newEmptyViewParent instanceof ViewGroup) { - ((ViewGroup) newEmptyViewParent).removeView(newEmptyView); - } - - // We need to convert any LayoutParams so that it works in our - // FrameLayout - FrameLayout.LayoutParams lp = convertEmptyViewLayoutParams(newEmptyView.getLayoutParams()); - if (null != lp) { - refreshableViewWrapper.addView(newEmptyView, lp); - } else { - refreshableViewWrapper.addView(newEmptyView); - } - } - - if (mRefreshableView instanceof EmptyViewMethodAccessor) { - ((EmptyViewMethodAccessor) mRefreshableView).setEmptyViewInternal(newEmptyView); - } else { - mRefreshableView.setEmptyView(newEmptyView); - } - mEmptyView = newEmptyView; - } - - /** - * Pass-through method for {@link PullToRefreshBase#getRefreshableView() - * getRefreshableView()}. - * {@link AdapterView#setOnItemClickListener(OnItemClickListener) - * setOnItemClickListener(listener)}. This is just for convenience! - * - * @param listener - OnItemClickListener to use - */ - public void setOnItemClickListener(OnItemClickListener listener) { - mRefreshableView.setOnItemClickListener(listener); - } - - public final void setOnLastItemVisibleListener(OnLastItemVisibleListener listener) { - mOnLastItemVisibleListener = listener; - } - - public final void setOnScrollListener(OnScrollListener listener) { - mOnScrollListener = listener; - } - - public final void setScrollEmptyView(boolean doScroll) { - mScrollEmptyView = 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_FROM_START} - * - * @param showIndicator - true if the indicators should be shown. - */ - public void setShowIndicator(boolean showIndicator) { - mShowIndicator = showIndicator; - - if (getShowIndicatorInternal()) { - // If we're set to Show Indicator, add/update them - addIndicatorViews(); - } else { - // If not, then remove then - removeIndicatorViews(); - } - } - - ; - - @Override - protected void onPullToRefresh() { - super.onPullToRefresh(); - - if (getShowIndicatorInternal()) { - switch (getCurrentMode()) { - case PULL_FROM_END: - mIndicatorIvBottom.pullToRefresh(); - break; - case PULL_FROM_START: - mIndicatorIvTop.pullToRefresh(); - break; - default: - // NO-OP - break; - } - } - } - - protected void onRefreshing(boolean doScroll) { - super.onRefreshing(doScroll); - - if (getShowIndicatorInternal()) { - updateIndicatorViewsVisibility(); - } - } - - @Override - protected void onReleaseToRefresh() { - super.onReleaseToRefresh(); - - if (getShowIndicatorInternal()) { - switch (getCurrentMode()) { - case PULL_FROM_END: - mIndicatorIvBottom.releaseToRefresh(); - break; - case PULL_FROM_START: - mIndicatorIvTop.releaseToRefresh(); - break; - default: - // NO-OP - break; - } - } - } - - @Override - protected void onReset() { - super.onReset(); - - if (getShowIndicatorInternal()) { - updateIndicatorViewsVisibility(); - } - } - - @Override - protected void handleStyledAttributes(TypedArray a) { - // Set Show Indicator to the XML value, or default value - mShowIndicator = a.getBoolean(R.styleable.PullToRefresh_ptrShowIndicator, !isPullToRefreshOverScrollEnabled()); - } - - protected boolean isReadyForPullStart() { - return isFirstItemVisible(); - } - - protected boolean isReadyForPullEnd() { - return isLastItemVisible(); - } - - @Override - protected void onScrollChanged(int l, int t, int oldl, int oldt) { - super.onScrollChanged(l, t, oldl, oldt); - if (null != mEmptyView && !mScrollEmptyView) { - mEmptyView.scrollTo(-l, -t); - } - } - - @Override - protected void updateUIForMode() { - super.updateUIForMode(); - - // Check Indicator Views consistent with new Mode - if (getShowIndicatorInternal()) { - addIndicatorViews(); - } else { - removeIndicatorViews(); - } - } - - private void addIndicatorViews() { - Mode mode = getMode(); - FrameLayout refreshableViewWrapper = getRefreshableViewWrapper(); - - 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_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); - params.gravity = Gravity.TOP | Gravity.RIGHT; - refreshableViewWrapper.addView(mIndicatorIvTop, params); - - } 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.showFooterLoadingLayout() && null == mIndicatorIvBottom) { - // If the mode can pull down, and we don't have one set already - 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); - params.gravity = Gravity.BOTTOM | Gravity.RIGHT; - refreshableViewWrapper.addView(mIndicatorIvBottom, params); - - } else if (!mode.showFooterLoadingLayout() && null != mIndicatorIvBottom) { - // If we can't pull down, but have a View then remove it - refreshableViewWrapper.removeView(mIndicatorIvBottom); - mIndicatorIvBottom = null; - } - } - - private boolean getShowIndicatorInternal() { - return mShowIndicator && isPullToRefreshEnabled(); - } - - private boolean isFirstItemVisible() { - final Adapter adapter = mRefreshableView.getAdapter(); - - if (null == adapter || adapter.isEmpty()) { - if (DEBUG) { - Log.d(LOG_TAG, "isFirstItemVisible. Empty View."); - } - return true; - - } else { - - /** - * This check should really just be: - * mRefreshableView.getFirstVisiblePosition() == 0, but PtRListView - * internally use a HeaderView which messes the positions up. For - * now we'll just add one to account for it and rely on the inner - * condition which checks getTop(). - */ - if (mRefreshableView.getFirstVisiblePosition() <= 1) { - final View firstVisibleChild = mRefreshableView.getChildAt(0); - if (firstVisibleChild != null) { - return firstVisibleChild.getTop() >= mRefreshableView.getTop(); - } - } - } - - return false; - } - - private boolean isLastItemVisible() { - final Adapter adapter = mRefreshableView.getAdapter(); - - if (null == adapter || adapter.isEmpty()) { - if (DEBUG) { - Log.d(LOG_TAG, "isLastItemVisible. Empty View."); - } - return true; - } else { - final int lastItemPosition = mRefreshableView.getCount() - 1; - final int lastVisiblePosition = mRefreshableView.getLastVisiblePosition(); - - if (DEBUG) { - Log.d(LOG_TAG, "isLastItemVisible. Last Item Position: " + lastItemPosition + " Last Visible Pos: " - + lastVisiblePosition); - } - - /** - * This check should really just be: lastVisiblePosition == - * lastItemPosition, but PtRListView internally uses a FooterView - * which messes the positions up. For me we'll just subtract one to - * account for it and rely on the inner condition which checks - * getBottom(). - */ - if (lastVisiblePosition >= lastItemPosition - 1) { - final int childIndex = lastVisiblePosition - mRefreshableView.getFirstVisiblePosition(); - final View lastVisibleChild = mRefreshableView.getChildAt(childIndex); - if (lastVisibleChild != null) { - return lastVisibleChild.getBottom() <= mRefreshableView.getBottom(); - } - } - } - - return false; - } - - private void removeIndicatorViews() { - if (null != mIndicatorIvTop) { - getRefreshableViewWrapper().removeView(mIndicatorIvTop); - mIndicatorIvTop = null; - } - - if (null != mIndicatorIvBottom) { - getRefreshableViewWrapper().removeView(mIndicatorIvBottom); - mIndicatorIvBottom = null; - } - } - - private void updateIndicatorViewsVisibility() { - if (null != mIndicatorIvTop) { - if (!isRefreshing() && isReadyForPullStart()) { - if (!mIndicatorIvTop.isVisible()) { - mIndicatorIvTop.show(); - } - } else { - if (mIndicatorIvTop.isVisible()) { - mIndicatorIvTop.hide(); - } - } - } - - if (null != mIndicatorIvBottom) { - if (!isRefreshing() && isReadyForPullEnd()) { - if (!mIndicatorIvBottom.isVisible()) { - mIndicatorIvBottom.show(); - } - } else { - if (mIndicatorIvBottom.isVisible()) { - mIndicatorIvBottom.hide(); - } - } - } - } -} diff --git a/core/pulltorefresh/src/main/java/com/handmark/pulltorefresh/library/PullToRefreshBase.java b/core/pulltorefresh/src/main/java/com/handmark/pulltorefresh/library/PullToRefreshBase.java deleted file mode 100644 index e76b234f..00000000 --- a/core/pulltorefresh/src/main/java/com/handmark/pulltorefresh/library/PullToRefreshBase.java +++ /dev/null @@ -1,1653 +0,0 @@ -/******************************************************************************* - * 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.content.Context; -import android.content.res.TypedArray; -import android.graphics.drawable.Drawable; -import android.os.Build.VERSION; -import android.os.Build.VERSION_CODES; -import android.os.Bundle; -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; -import android.view.ViewGroup; -import android.view.animation.DecelerateInterpolator; -import android.view.animation.Interpolator; -import android.widget.FrameLayout; -import android.widget.LinearLayout; - -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.Utils; -import com.handmark.pulltorefresh.library.internal.ViewCompat; - -public abstract class PullToRefreshBase extends LinearLayout implements IPullToRefresh { - - // =========================================================== - // Constants - // =========================================================== - - static final boolean DEBUG = true; - - static final boolean USE_HW_LAYERS = false; - - static final String LOG_TAG = "PullToRefresh"; - - static final float FRICTION = 2.0f; - - 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"; - static final String STATE_CURRENT_MODE = "ptr_current_mode"; - 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"; - - // =========================================================== - // Fields - // =========================================================== - - private int mTouchSlop; - private float mLastMotionX, mLastMotionY; - private float mInitialMotionX, mInitialMotionY; - - private boolean mIsBeingDragged = false; - private State mState = State.RESET; - private Mode mMode = Mode.getDefault(); - - private Mode mCurrentMode; - T mRefreshableView; - private FrameLayout mRefreshableViewWrapper; - - private boolean mShowViewWhileRefreshing = true; - private boolean mScrollingWhileRefreshingEnabled = false; - private boolean mFilterTouchEvents = true; - private boolean mOverScrollEnabled = true; - private boolean mLayoutVisibilityChangesEnabled = true; - - private Interpolator mScrollAnimationInterpolator; - private AnimationStyle mLoadingAnimationStyle = AnimationStyle.getDefault(); - - private LoadingLayout mHeaderLayout; - private LoadingLayout mFooterLayout; - - private OnRefreshListener mOnRefreshListener; - private OnRefreshListener2 mOnRefreshListener2; - private OnPullEventListener mOnPullEventListener; - - private SmoothScrollRunnable mCurrentSmoothScrollRunnable; - - // =========================================================== - // Constructors - // =========================================================== - - public PullToRefreshBase(Context context) { - super(context); - init(context, null); - } - - public PullToRefreshBase(Context context, AttributeSet attrs) { - super(context, attrs); - init(context, attrs); - } - - public PullToRefreshBase(Context context, Mode mode) { - super(context); - mMode = 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) { - Log.d(LOG_TAG, "addView: " + child.getClass().getSimpleName()); - } - - final T refreshableView = getRefreshableView(); - - if (refreshableView instanceof ViewGroup) { - ((ViewGroup) refreshableView).addView(child, index, params); - } else { - throw new UnsupportedOperationException("Refreshable View is not a ViewGroup so can't addView"); - } - } - - @Override - public final boolean demo() { - if (mMode.showHeaderLoadingLayout() && isReadyForPullStart()) { - smoothScrollToAndBack(-getHeaderSize() * 2); - return true; - } else if (mMode.showFooterLoadingLayout() && isReadyForPullEnd()) { - smoothScrollToAndBack(getFooterSize() * 2); - return true; - } - - return false; - } - - @Override - public final Mode getCurrentMode() { - return mCurrentMode; - } - - @Override - public final boolean getFilterTouchEvents() { - return mFilterTouchEvents; - } - - @Override - public final ILoadingLayout getLoadingLayoutProxy() { - return getLoadingLayoutProxy(true, true); - } - - @Override - public final ILoadingLayout getLoadingLayoutProxy(boolean includeStart, boolean includeEnd) { - return createLoadingLayoutProxy(includeStart, includeEnd); - } - - @Override - public final Mode getMode() { - return mMode; - } - - @Override - public final T getRefreshableView() { - return mRefreshableView; - } - - @Override - public final boolean getShowViewWhileRefreshing() { - return mShowViewWhileRefreshing; - } - - @Override - public final State getState() { - return mState; - } - - /** - * @deprecated See {@link #isScrollingWhileRefreshingEnabled()}. - */ - public final boolean isDisableScrollingWhileRefreshing() { - return !isScrollingWhileRefreshingEnabled(); - } - - @Override - public final boolean isPullToRefreshEnabled() { - return mMode.permitsPullToRefresh(); - } - - @Override - public final boolean isPullToRefreshOverScrollEnabled() { - return VERSION.SDK_INT >= VERSION_CODES.GINGERBREAD && mOverScrollEnabled - && OverscrollHelper.isAndroidOverScrollEnabled(mRefreshableView); - } - - @Override - 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) { - - if (!isPullToRefreshEnabled()) { - return false; - } - - final int action = event.getAction(); - - if (action == MotionEvent.ACTION_CANCEL || action == MotionEvent.ACTION_UP) { - mIsBeingDragged = false; - return false; - } - - if (action != MotionEvent.ACTION_DOWN && mIsBeingDragged) { - return true; - } - - switch (action) { - case MotionEvent.ACTION_MOVE: { - // If we're refreshing, and the flag is set. Eat all MOVE events - if (!mScrollingWhileRefreshingEnabled && isRefreshing()) { - return true; - } - - if (isReadyForPull()) { - 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: - diff = x - mLastMotionX; - oppositeDiff = y - mLastMotionY; - break; - case VERTICAL: - default: - diff = y - mLastMotionY; - oppositeDiff = x - mLastMotionX; - break; - } - absDiff = Math.abs(diff); - - 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_FROM_START; - } - } else if (mMode.showFooterLoadingLayout() && diff <= -1f && isReadyForPullEnd()) { - mLastMotionY = y; - mLastMotionX = x; - mIsBeingDragged = true; - if (mMode == Mode.BOTH) { - mCurrentMode = Mode.PULL_FROM_END; - } - } - } - } - break; - } - case MotionEvent.ACTION_DOWN: { - if (isReadyForPull()) { - mLastMotionY = mInitialMotionY = event.getY(); - mLastMotionX = mInitialMotionX = event.getX(); - mIsBeingDragged = false; - } - break; - } - } - - return mIsBeingDragged; - } - - @Override - public final void onRefreshComplete() { - if (isRefreshing()) { - setState(State.RESET); - } - } - - @Override - public final boolean onTouchEvent(MotionEvent event) { - - if (!isPullToRefreshEnabled()) { - return false; - } - - // If we're refreshing, and the flag is set. Eat the event - if (!mScrollingWhileRefreshingEnabled && isRefreshing()) { - return true; - } - - if (event.getAction() == MotionEvent.ACTION_DOWN && event.getEdgeFlags() != 0) { - return false; - } - - switch (event.getAction()) { - case MotionEvent.ACTION_MOVE: { - if (mIsBeingDragged) { - mLastMotionY = event.getY(); - mLastMotionX = event.getX(); - pullEvent(); - return true; - } - break; - } - - case MotionEvent.ACTION_DOWN: { - if (isReadyForPull()) { - mLastMotionY = mInitialMotionY = event.getY(); - mLastMotionX = mInitialMotionX = event.getX(); - return true; - } - break; - } - - case MotionEvent.ACTION_CANCEL: - case MotionEvent.ACTION_UP: { - if (mIsBeingDragged) { - mIsBeingDragged = false; - - 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 - 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); - - return true; - } - break; - } - } - - return false; - } - - public final void setScrollingWhileRefreshingEnabled(boolean allowScrollingWhileRefreshing) { - mScrollingWhileRefreshingEnabled = allowScrollingWhileRefreshing; - } - - /** - * @deprecated See {@link #setScrollingWhileRefreshingEnabled(boolean)} - */ - public void setDisableScrollingWhileRefreshing(boolean disableScrollingWhileRefreshing) { - setScrollingWhileRefreshingEnabled(!disableScrollingWhileRefreshing); - } - - @Override - public final void setFilterTouchEvents(boolean filterEvents) { - mFilterTouchEvents = filterEvents; - } - - /** - * @deprecated You should now call this method on the result of - * {@link #getLoadingLayoutProxy()}. - */ - public void setLastUpdatedLabel(CharSequence label) { - getLoadingLayoutProxy().setLastUpdatedLabel(label); - } - - /** - * @deprecated You should now call this method on the result of - * {@link #getLoadingLayoutProxy()}. - */ - public void setLoadingDrawable(Drawable drawable) { - getLoadingLayoutProxy().setLoadingDrawable(drawable); - } - - /** - * @deprecated You should now call this method on the result of - * {@link #getLoadingLayoutProxy(boolean, boolean)}. - */ - public void setLoadingDrawable(Drawable drawable, Mode mode) { - getLoadingLayoutProxy(mode.showHeaderLoadingLayout(), mode.showFooterLoadingLayout()).setLoadingDrawable( - drawable); - } - - @Override - public void setLongClickable(boolean longClickable) { - getRefreshableView().setLongClickable(longClickable); - } - - @Override - public final void setMode(Mode mode) { - if (mode != mMode) { - if (DEBUG) { - Log.d(LOG_TAG, "Setting mode to: " + mode); - } - mMode = mode; - updateUIForMode(); - } - } - - public void setOnPullEventListener(OnPullEventListener listener) { - mOnPullEventListener = listener; - } - - @Override - public final void setOnRefreshListener(OnRefreshListener listener) { - mOnRefreshListener = listener; - mOnRefreshListener2 = null; - } - - @Override - public final void setOnRefreshListener(OnRefreshListener2 listener) { - mOnRefreshListener2 = listener; - mOnRefreshListener = null; - } - - /** - * @deprecated You should now call this method on the result of - * {@link #getLoadingLayoutProxy()}. - */ - public void setPullLabel(CharSequence pullLabel) { - getLoadingLayoutProxy().setPullLabel(pullLabel); - } - - /** - * @deprecated You should now call this method on the result of - * {@link #getLoadingLayoutProxy(boolean, boolean)}. - */ - public void setPullLabel(CharSequence pullLabel, Mode mode) { - getLoadingLayoutProxy(mode.showHeaderLoadingLayout(), mode.showFooterLoadingLayout()).setPullLabel(pullLabel); - } - - /** - * @param enable Whether Pull-To-Refresh should be used - * @deprecated This simple calls setMode with an appropriate mode based on - * the passed value. - */ - public final void setPullToRefreshEnabled(boolean enable) { - setMode(enable ? Mode.getDefault() : Mode.DISABLED); - } - - @Override - public final void setPullToRefreshOverScrollEnabled(boolean enabled) { - mOverScrollEnabled = enabled; - } - - @Override - public final void setRefreshing() { - setRefreshing(true); - } - - @Override - public final void setRefreshing(boolean doScroll) { - if (!isRefreshing()) { - setState(State.MANUAL_REFRESHING, doScroll); - } - } - - /** - * @deprecated You should now call this method on the result of - * {@link #getLoadingLayoutProxy()}. - */ - public void setRefreshingLabel(CharSequence refreshingLabel) { - getLoadingLayoutProxy().setRefreshingLabel(refreshingLabel); - } - - /** - * @deprecated You should now call this method on the result of - * {@link #getLoadingLayoutProxy(boolean, boolean)}. - */ - public void setRefreshingLabel(CharSequence refreshingLabel, Mode mode) { - getLoadingLayoutProxy(mode.showHeaderLoadingLayout(), mode.showFooterLoadingLayout()).setRefreshingLabel( - refreshingLabel); - } - - /** - * @deprecated You should now call this method on the result of - * {@link #getLoadingLayoutProxy()}. - */ - public void setReleaseLabel(CharSequence releaseLabel) { - setReleaseLabel(releaseLabel, Mode.BOTH); - } - - /** - * @deprecated You should now call this method on the result of - * {@link #getLoadingLayoutProxy(boolean, boolean)}. - */ - public void setReleaseLabel(CharSequence releaseLabel, Mode mode) { - getLoadingLayoutProxy(mode.showHeaderLoadingLayout(), mode.showFooterLoadingLayout()).setReleaseLabel( - releaseLabel); - } - - public void setScrollAnimationInterpolator(Interpolator interpolator) { - mScrollAnimationInterpolator = interpolator; - } - - @Override - public final void setShowViewWhileRefreshing(boolean showView) { - mShowViewWhileRefreshing = showView; - } - - /** - * @return Either {@link Orientation#VERTICAL} or - * {@link Orientation#HORIZONTAL} depending on the scroll direction. - */ - public abstract Orientation getPullToRefreshScrollDirection(); - - 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 - */ - protected final void addViewInternal(View child, int index, ViewGroup.LayoutParams params) { - super.addView(child, index, params); - } - - /** - * Used internally for adding view. Need because we override addView to - * pass-through to the Refreshable View - */ - protected final void addViewInternal(View child, ViewGroup.LayoutParams params) { - super.addView(child, -1, params); - } - - protected LoadingLayout createLoadingLayout(Context context, Mode mode, TypedArray attrs) { - LoadingLayout layout = mLoadingAnimationStyle.createLoadingLayout(context, mode, - getPullToRefreshScrollDirection(), attrs); - layout.setVisibility(View.INVISIBLE); - 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 - * 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 - * @return New instance of the Refreshable View - */ - protected abstract T createRefreshableView(Context context, AttributeSet attrs); - - protected final void disableLoadingLayoutVisibilityChanges() { - mLayoutVisibilityChangesEnabled = false; - } - - protected final LoadingLayout getFooterLayout() { - return mFooterLayout; - } - - 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; - } - - protected int getPullToRefreshScrollDurationLonger() { - return SMOOTH_SCROLL_LONG_DURATION_MS; - } - - protected FrameLayout getRefreshableViewWrapper() { - return mRefreshableViewWrapper; - } - - /** - * Allows Derivative classes to handle the XML Attrs without creating a - * TypedArray themsevles - * - * @param a - TypedArray of PullToRefresh Attributes - */ - 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) - */ - 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 start. - * - * @return true if the View is currently the correct state (for example, top - * of a ListView) - */ - protected abstract boolean isReadyForPullStart(); - - /** - * 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) { - } - - /** - * 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) { - } - - /** - * 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) { - - // 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(), listener); - break; - default: - case PULL_FROM_START: - smoothScrollTo(-getHeaderSize(), listener); - break; - } - } else { - smoothScrollTo(0); - } - } else { - // We're not scrolling, so just call Refresh Listener now - callRefreshListener(); - } - } - - /** - * 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) { - Bundle bundle = (Bundle) state; - - 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); - mShowViewWhileRefreshing = bundle.getBoolean(STATE_SHOW_REFRESHING_VIEW, true); - - // Let super Restore Itself - super.onRestoreInstanceState(bundle.getParcelable(STATE_SUPER)); - - State viewState = State.mapIntToValue(bundle.getInt(STATE_STATE, 0)); - if (viewState == State.REFRESHING || viewState == State.MANUAL_REFRESHING) { - setState(viewState, true); - } - - // Now let derivative classes restore their state - onPtrRestoreInstanceState(bundle); - return; - } - - super.onRestoreInstanceState(state); - } - - @Override - protected final Parcelable onSaveInstanceState() { - Bundle bundle = new Bundle(); - - // Let derivative classes get a chance to save state first, that way we - // can make sure they don't overrite any of our values - onPtrSaveInstanceState(bundle); - - bundle.putInt(STATE_STATE, mState.getIntValue()); - bundle.putInt(STATE_MODE, mMode.getIntValue()); - bundle.putInt(STATE_CURRENT_MODE, mCurrentMode.getIntValue()); - bundle.putBoolean(STATE_SCROLLING_REFRESHING_ENABLED, mScrollingWhileRefreshingEnabled); - bundle.putBoolean(STATE_SHOW_REFRESHING_VIEW, mShowViewWhileRefreshing); - bundle.putParcelable(STATE_SUPER, super.onSaveInstanceState()); - - return bundle; - } - - @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 - refreshLoadingViewsSize(); - - // 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(); - } - }); - } - - /** - * Re-measure the Loading Views height, and adjust internal padding as - * necessary - */ - protected final void refreshLoadingViewsSize() { - final int maximumPullScroll = (int) (getMaximumPullScroll() * 1.2f); - - int pLeft = getPaddingLeft(); - int pTop = getPaddingTop(); - int pRight = getPaddingRight(); - int pBottom = getPaddingBottom(); - - switch (getPullToRefreshScrollDirection()) { - case HORIZONTAL: - if (mMode.showHeaderLoadingLayout()) { - mHeaderLayout.setWidth(maximumPullScroll); - pLeft = -maximumPullScroll; - } else { - pLeft = 0; - } - - if (mMode.showFooterLoadingLayout()) { - mFooterLayout.setWidth(maximumPullScroll); - pRight = -maximumPullScroll; - } else { - pRight = 0; - } - break; - - case VERTICAL: - if (mMode.showHeaderLoadingLayout()) { - mHeaderLayout.setHeight(maximumPullScroll); - pTop = -maximumPullScroll; - } else { - pTop = 0; - } - - if (mMode.showFooterLoadingLayout()) { - mFooterLayout.setHeight(maximumPullScroll); - pBottom = -maximumPullScroll; - } 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: - if (lp.width != width) { - lp.width = width; - mRefreshableViewWrapper.requestLayout(); - } - break; - case VERTICAL: - if (lp.height != height) { - lp.height = height; - mRefreshableViewWrapper.requestLayout(); - } - break; - } - } - - /** - * Helper method which just calls scrollTo() in the correct scrolling - * direction. - * - * @param value - New Scroll 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); - } else if (value > 0) { - mFooterLayout.setVisibility(View.VISIBLE); - } else { - mHeaderLayout.setVisibility(View.INVISIBLE); - mFooterLayout.setVisibility(View.INVISIBLE); - } - } - - 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: - scrollTo(0, value); - break; - case HORIZONTAL: - scrollTo(value, 0); - break; - } - } - - /** - * 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) { - 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. - * - * @param scrollValue - Position to scroll to - */ - protected final void smoothScrollToLonger(int scrollValue) { - smoothScrollTo(scrollValue, getPullToRefreshScrollDurationLonger()); - } - - /** - * Updates the View State when the mode has been set. This does not do any - * 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 = getLoadingLayoutLayoutParams(); - - // Remove Header, and then add Header Loading View again if needed - if (this == mHeaderLayout.getParent()) { - removeView(mHeaderLayout); - } - if (mMode.showHeaderLoadingLayout()) { - addViewInternal(mHeaderLayout, 0, lp); - } - - // Remove Footer, and then add Footer Loading View again if needed - if (this == mFooterLayout.getParent()) { - removeView(mFooterLayout); - } - if (mMode.showFooterLoadingLayout()) { - addViewInternal(mFooterLayout, lp); - } - - // Hide Loading Views - refreshLoadingViewsSize(); - - // If we're not using Mode.BOTH, set mCurrentMode to mMode, otherwise - // set it to pull down - mCurrentMode = (mMode != Mode.BOTH) ? mMode : Mode.PULL_FROM_START; - } - - 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, - 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()) { - case HORIZONTAL: - setOrientation(LinearLayout.HORIZONTAL); - break; - case VERTICAL: - default: - setOrientation(LinearLayout.VERTICAL); - break; - } - - setGravity(Gravity.CENTER); - - ViewConfiguration config = ViewConfiguration.get(context); - mTouchSlop = config.getScaledTouchSlop(); - - // Styleables from XML - TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.PullToRefresh); - - if (a.hasValue(R.styleable.PullToRefresh_ptrMode)) { - 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)); - } - - // Refreshable View - // By passing the attrs, we can add ListView/GridView params via XML - mRefreshableView = createRefreshableView(context, attrs); - addRefreshableView(context, mRefreshableView); - - // We need to create now layouts now - 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_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); - } - - 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); - a.recycle(); - - // Finally update the UI for the modes - updateUIForMode(); - } - - private boolean isReadyForPull() { - switch (mMode) { - case PULL_FROM_START: - return isReadyForPullStart(); - case PULL_FROM_END: - return isReadyForPullEnd(); - case BOTH: - return isReadyForPullEnd() || isReadyForPullStart(); - default: - return false; - } - } - - /** - * Actions a Pull Event - * - * @return true if the Event has been handled, false if there has been no - * change - */ - private void pullEvent() { - final int newScrollValue; - final int itemDimension; - final float initialMotionValue, lastMotionValue; - - switch (getPullToRefreshScrollDirection()) { - case HORIZONTAL: - initialMotionValue = mInitialMotionX; - lastMotionValue = mLastMotionX; - break; - case VERTICAL: - default: - initialMotionValue = mInitialMotionY; - lastMotionValue = mLastMotionY; - break; - } - - switch (mCurrentMode) { - case PULL_FROM_END: - newScrollValue = Math.round(Math.max(initialMotionValue - lastMotionValue, 0) / FRICTION); - itemDimension = getFooterSize(); - break; - case PULL_FROM_START: - default: - newScrollValue = Math.round(Math.min(initialMotionValue - lastMotionValue, 0) / FRICTION); - itemDimension = getHeaderSize(); - break; - } - - setHeaderScroll(newScrollValue); - - if (newScrollValue != 0 && !isRefreshing()) { - float scale = Math.abs(newScrollValue) / (float) itemDimension; - switch (mCurrentMode) { - case PULL_FROM_END: - mFooterLayout.onPull(scale); - break; - case PULL_FROM_START: - default: - mHeaderLayout.onPull(scale); - break; - } - - if (mState != State.PULL_TO_REFRESH && itemDimension >= Math.abs(newScrollValue)) { - setState(State.PULL_TO_REFRESH); - } else if (mState == State.PULL_TO_REFRESH && itemDimension < Math.abs(newScrollValue)) { - setState(State.RELEASE_TO_REFRESH); - } - } - } - - private LinearLayout.LayoutParams getLoadingLayoutLayoutParams() { - switch (getPullToRefreshScrollDirection()) { - case HORIZONTAL: - return new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, - LinearLayout.LayoutParams.MATCH_PARENT); - case VERTICAL: - default: - return new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, - LinearLayout.LayoutParams.WRAP_CONTENT); - } - } - - private int getMaximumPullScroll() { - switch (getPullToRefreshScrollDirection()) { - case HORIZONTAL: - return Math.round(getWidth() / FRICTION); - case VERTICAL: - default: - return Math.round(getHeight() / FRICTION); - } - } - - /** - * Smooth Scroll to position using the specific duration - * - * @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); - } - - private final void smoothScrollTo(int newScrollValue, long duration, long delayMillis, - OnSmoothScrollFinishedListener listener) { - if (null != mCurrentSmoothScrollRunnable) { - mCurrentSmoothScrollRunnable.stop(); - } - - final int oldScrollValue; - switch (getPullToRefreshScrollDirection()) { - case HORIZONTAL: - oldScrollValue = getScrollX(); - break; - case VERTICAL: - default: - oldScrollValue = getScrollY(); - break; - } - - if (oldScrollValue != newScrollValue) { - if (null == mScrollAnimationInterpolator) { - // Default interpolator is a Decelerate Interpolator - mScrollAnimationInterpolator = new DecelerateInterpolator(); - } - mCurrentSmoothScrollRunnable = new SmoothScrollRunnable(oldScrollValue, newScrollValue, 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 - * drawable, which is automatically rotated and used as a Progress Bar. - */ - ROTATE, - - /** - * This is the old default, and what is commonly used on iOS. Uses an - * arrow image which flips depending on where the user has scrolled. - */ - 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 - * int. - * - * @param modeInt - int to map a Mode to - * @return Mode that modeInt maps to, or ROTATE by default. - */ - static AnimationStyle mapIntToValue(int modeInt) { - switch (modeInt) { - case 0x0: - default: - return ROTATE; - case 0x1: - return FLIP; - } - } - - LoadingLayout createLoadingLayout(Context context, Mode mode, Orientation scrollDirection, TypedArray attrs) { - switch (this) { - case ROTATE: - default: - return new RotateLoadingLayout(context, mode, scrollDirection, attrs); - case FLIP: - return new FlipLoadingLayout(context, mode, scrollDirection, attrs); - } - } - } - - public static enum Mode { - - /** - * Disable all Pull-to-Refresh gesture and Refreshing handling - */ - DISABLED(0x0), - - /** - * 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_FROM_START(0x1), - - /** - * 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_FROM_END(0x2), - - /** - * Allow the user to both Pull from the start, from the end to refresh. - */ - BOTH(0x3), - - /** - * Disables Pull-to-Refresh gesture handling, but allows manually - * setting the Refresh state via - * {@link PullToRefreshBase#setRefreshing() setRefreshing()}. - */ - 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 - * int. - * - * @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) { - for (Mode value : Mode.values()) { - if (modeInt == value.getIntValue()) { - return value; - } - } - - // If not, return default - return getDefault(); - } - - static Mode getDefault() { - return PULL_FROM_START; - } - - private int mIntValue; - - // The modeInt values need to match those from attrs.xml - Mode(int modeInt) { - mIntValue = modeInt; - } - - /** - * @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 - */ - public boolean showHeaderLoadingLayout() { - return this == PULL_FROM_START || this == BOTH; - } - - /** - * @return true if this mode wants the Loading Layout Footer to be shown - */ - public boolean showFooterLoadingLayout() { - return this == PULL_FROM_END || this == BOTH || this == MANUAL_REFRESH_ONLY; - } - - int getIntValue() { - return mIntValue; - } - - } - - // =========================================================== - // 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 ( - * {@link PullToRefreshAdapterViewBase#setOnLastItemVisibleListener}. - * - * @author Chris Banes - */ - public static interface OnLastItemVisibleListener { - - /** - * Called when the user has scrolled to the end of the list - */ - public void onLastItemVisible(); - - } - - /** - * 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 - * (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}. - */ - public void onPullEvent(final PullToRefreshBase refreshView, State state, Mode direction); - - } - - /** - * Simple Listener to listen for any callbacks to Refresh. - * - * @author Chris Banes - */ - public static interface OnRefreshListener { - - /** - * onRefresh will be called for both a Pull from start, and Pull from - * end - */ - public void onRefresh(final PullToRefreshBase refreshView); - - } - - /** - * 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 { - // TODO These methods need renaming to START/END rather than DOWN/UP - - /** - * 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 from - * the end, and released. - */ - public void onPullUpToRefresh(final PullToRefreshBase refreshView); - - } - - public static enum Orientation { - VERTICAL, HORIZONTAL; - } - - public static enum State { - - /** - * When the UI is in a state which means that user is not interacting - * with the Pull-to-Refresh function. - */ - RESET(0x0), - - /** - * When the UI is being pulled by the user, but has not been pulled far - * enough so that it refreshes when released. - */ - PULL_TO_REFRESH(0x1), - - /** - * When the UI is being pulled by the user, and has - * been pulled far enough so that it will refresh when released. - */ - RELEASE_TO_REFRESH(0x2), - - /** - * When the UI is currently refreshing, caused by a pull gesture. - */ - REFRESHING(0x8), - - /** - * When the UI is currently refreshing, caused by a call to - * {@link PullToRefreshBase#setRefreshing() setRefreshing()}. - */ - 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. - * - * @param stateInt - int to map a State to - * @return State that stateInt maps to - */ - 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; - - State(int intValue) { - mIntValue = intValue; - } - - int getIntValue() { - return mIntValue; - } - } - - final class SmoothScrollRunnable implements Runnable { - private final Interpolator mInterpolator; - 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, OnSmoothScrollFinishedListener listener) { - mScrollFromY = fromY; - mScrollToY = toY; - mInterpolator = mScrollAnimationInterpolator; - mDuration = duration; - mListener = listener; - } - - @Override - public void run() { - - /** - * Only set mStartTime if this is the first time we're starting, - * else actually calculate the Y delta - */ - if (mStartTime == -1) { - mStartTime = System.currentTimeMillis(); - } else { - - /** - * We do do all calculations in long to reduce software float - * calculations. We use 1000 as it gives us good accuracy and - * small rounding errors - */ - 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)); - mCurrentY = mScrollFromY - deltaY; - setHeaderScroll(mCurrentY); - } - - // If we're not at the target Y, keep going... - if (mContinueRunning && mScrollToY != mCurrentY) { - ViewCompat.postOnAnimation(PullToRefreshBase.this, this); - } else { - if (null != mListener) { - mListener.onSmoothScrollFinished(); - } - } - } - - public void stop() { - mContinueRunning = false; - removeCallbacks(this); - } - } - - static interface OnSmoothScrollFinishedListener { - void onSmoothScrollFinished(); - } - -} diff --git a/core/pulltorefresh/src/main/java/com/handmark/pulltorefresh/library/PullToRefreshExpandableListView.java b/core/pulltorefresh/src/main/java/com/handmark/pulltorefresh/library/PullToRefreshExpandableListView.java deleted file mode 100644 index 649020c6..00000000 --- a/core/pulltorefresh/src/main/java/com/handmark/pulltorefresh/library/PullToRefreshExpandableListView.java +++ /dev/null @@ -1,103 +0,0 @@ -/******************************************************************************* - * 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.ExpandableListView; - -import com.handmark.pulltorefresh.library.internal.EmptyViewMethodAccessor; - -public class PullToRefreshExpandableListView extends PullToRefreshAdapterViewBase { - - public PullToRefreshExpandableListView(Context context) { - super(context); - } - - public PullToRefreshExpandableListView(Context context, AttributeSet attrs) { - super(context, attrs); - } - - public PullToRefreshExpandableListView(Context context, Mode mode) { - super(context, mode); - } - - public PullToRefreshExpandableListView(Context context, Mode mode, AnimationStyle style) { - super(context, mode, style); - } - - @Override - public final Orientation getPullToRefreshScrollDirection() { - return Orientation.VERTICAL; - } - - @Override - protected ExpandableListView createRefreshableView(Context context, AttributeSet attrs) { - final ExpandableListView lv; - if (VERSION.SDK_INT >= VERSION_CODES.GINGERBREAD) { - lv = new InternalExpandableListViewSDK9(context, attrs); - } else { - lv = new InternalExpandableListView(context, attrs); - } - - // Set it to this so it can be used in ListActivity/ListFragment - lv.setId(android.R.id.list); - return lv; - } - - class InternalExpandableListView extends ExpandableListView implements EmptyViewMethodAccessor { - - public InternalExpandableListView(Context context, AttributeSet attrs) { - super(context, attrs); - } - - @Override - public void setEmptyView(View emptyView) { - PullToRefreshExpandableListView.this.setEmptyView(emptyView); - } - - @Override - public void setEmptyViewInternal(View emptyView) { - super.setEmptyView(emptyView); - } - } - - @TargetApi(9) - final class InternalExpandableListViewSDK9 extends InternalExpandableListView { - - public InternalExpandableListViewSDK9(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(PullToRefreshExpandableListView.this, deltaX, scrollX, deltaY, scrollY, - isTouchEvent); - - return returnValue; - } - } -} diff --git a/core/pulltorefresh/src/main/java/com/handmark/pulltorefresh/library/PullToRefreshGridView.java b/core/pulltorefresh/src/main/java/com/handmark/pulltorefresh/library/PullToRefreshGridView.java deleted file mode 100644 index f9506889..00000000 --- a/core/pulltorefresh/src/main/java/com/handmark/pulltorefresh/library/PullToRefreshGridView.java +++ /dev/null @@ -1,102 +0,0 @@ -/******************************************************************************* - * 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.GridView; - -import com.handmark.pulltorefresh.library.internal.EmptyViewMethodAccessor; - -public class PullToRefreshGridView extends PullToRefreshAdapterViewBase { - - public PullToRefreshGridView(Context context) { - super(context); - } - - public PullToRefreshGridView(Context context, AttributeSet attrs) { - super(context, attrs); - } - - public PullToRefreshGridView(Context context, Mode mode) { - super(context, mode); - } - - public PullToRefreshGridView(Context context, Mode mode, AnimationStyle style) { - super(context, mode, style); - } - - @Override - public final Orientation getPullToRefreshScrollDirection() { - return Orientation.VERTICAL; - } - - @Override - protected final GridView createRefreshableView(Context context, AttributeSet attrs) { - final GridView gv; - if (VERSION.SDK_INT >= VERSION_CODES.GINGERBREAD) { - gv = new InternalGridViewSDK9(context, attrs); - } else { - gv = new InternalGridView(context, attrs); - } - - // Use Generated ID (from res/values/ids.xml) - gv.setId(R.id.gridview); - return gv; - } - - class InternalGridView extends GridView implements EmptyViewMethodAccessor { - - public InternalGridView(Context context, AttributeSet attrs) { - super(context, attrs); - } - - @Override - public void setEmptyView(View emptyView) { - PullToRefreshGridView.this.setEmptyView(emptyView); - } - - @Override - public void setEmptyViewInternal(View emptyView) { - super.setEmptyView(emptyView); - } - } - - @TargetApi(9) - final class InternalGridViewSDK9 extends InternalGridView { - - public InternalGridViewSDK9(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(PullToRefreshGridView.this, deltaX, scrollX, deltaY, scrollY, isTouchEvent); - - return returnValue; - } - } -} diff --git a/core/pulltorefresh/src/main/java/com/handmark/pulltorefresh/library/PullToRefreshHorizontalScrollView.java b/core/pulltorefresh/src/main/java/com/handmark/pulltorefresh/library/PullToRefreshHorizontalScrollView.java deleted file mode 100644 index a70f7ad2..00000000 --- a/core/pulltorefresh/src/main/java/com/handmark/pulltorefresh/library/PullToRefreshHorizontalScrollView.java +++ /dev/null @@ -1,110 +0,0 @@ -/******************************************************************************* - * 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; - -public class PullToRefreshHorizontalScrollView extends PullToRefreshBase { - - 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 Orientation getPullToRefreshScrollDirection() { - return Orientation.HORIZONTAL; - } - - @Override - protected HorizontalScrollView createRefreshableView(Context context, AttributeSet attrs) { - HorizontalScrollView scrollView; - - 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 boolean isReadyForPullStart() { - return mRefreshableView.getScrollX() == 0; - } - - @Override - protected boolean isReadyForPullEnd() { - View scrollViewChild = mRefreshableView.getChildAt(0); - if (null != scrollViewChild) { - return mRefreshableView.getScrollX() >= (scrollViewChild.getWidth() - getWidth()); - } - 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, deltaX, scrollX, 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.getWidth() - (getWidth() - getPaddingLeft() - getPaddingRight())); - } - return scrollRange; - } - } -} diff --git a/core/pulltorefresh/src/main/java/com/handmark/pulltorefresh/library/PullToRefreshListView.java b/core/pulltorefresh/src/main/java/com/handmark/pulltorefresh/library/PullToRefreshListView.java deleted file mode 100644 index 0aa9a27d..00000000 --- a/core/pulltorefresh/src/main/java/com/handmark/pulltorefresh/library/PullToRefreshListView.java +++ /dev/null @@ -1,337 +0,0 @@ -/******************************************************************************* - * 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.content.res.TypedArray; -import android.graphics.Canvas; -import android.os.Build.VERSION; -import android.os.Build.VERSION_CODES; -import android.util.AttributeSet; -import android.view.Gravity; -import android.view.MotionEvent; -import android.view.View; -import android.widget.FrameLayout; -import android.widget.ListAdapter; -import android.widget.ListView; - -import com.handmark.pulltorefresh.library.internal.EmptyViewMethodAccessor; -import com.handmark.pulltorefresh.library.internal.LoadingLayout; - -public class PullToRefreshListView extends PullToRefreshAdapterViewBase { - - private LoadingLayout mHeaderLoadingView; - private LoadingLayout mFooterLoadingView; - - private FrameLayout mLvFooterLoadingFrame; - - private boolean mListViewExtrasEnabled; - - public PullToRefreshListView(Context context) { - super(context); - } - - public PullToRefreshListView(Context context, AttributeSet attrs) { - super(context, attrs); - } - - public PullToRefreshListView(Context context, Mode mode) { - super(context, mode); - } - - public PullToRefreshListView(Context context, Mode mode, AnimationStyle style) { - super(context, mode, style); - } - - @Override - public final Orientation getPullToRefreshScrollDirection() { - return Orientation.VERTICAL; - } - - @Override - 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. - */ - ListAdapter adapter = mRefreshableView.getAdapter(); - if (!mListViewExtrasEnabled || !getShowViewWhileRefreshing() || null == adapter || adapter.isEmpty()) { - super.onRefreshing(doScroll); - return; - } - - super.onRefreshing(false); - - final LoadingLayout origLoadingView, listViewLoadingView, oppositeListViewLoadingView; - final int selection, scrollToY; - - switch (getCurrentMode()) { - case MANUAL_REFRESH_ONLY: - case PULL_FROM_END: - origLoadingView = getFooterLayout(); - listViewLoadingView = mFooterLoadingView; - oppositeListViewLoadingView = mHeaderLoadingView; - selection = mRefreshableView.getCount() - 1; - scrollToY = getScrollY() - getFooterSize(); - break; - case PULL_FROM_START: - default: - origLoadingView = getHeaderLayout(); - listViewLoadingView = mHeaderLoadingView; - oppositeListViewLoadingView = mFooterLoadingView; - selection = 0; - scrollToY = getScrollY() + getHeaderSize(); - break; - } - - // Hide our original Loading View - origLoadingView.reset(); - origLoadingView.hideAllViews(); - - // Make sure the opposite end is hidden too - oppositeListViewLoadingView.setVisibility(View.GONE); - - // Show the ListView Loading View and set it to refresh. - listViewLoadingView.setVisibility(View.VISIBLE); - 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); - - // Make sure the ListView is scrolled to show the loading - // header/footer - mRefreshableView.setSelection(selection); - - // Smooth scroll as normal - smoothScrollTo(0); - } - } - - @Override - protected void onReset() { - /** - * If the extras are not enabled, just call up to super and return. - */ - if (!mListViewExtrasEnabled) { - super.onReset(); - return; - } - - final LoadingLayout originalLoadingLayout, listViewLoadingLayout; - final int scrollToHeight, selection; - final boolean scrollLvToEdge; - - switch (getCurrentMode()) { - case MANUAL_REFRESH_ONLY: - case PULL_FROM_END: - originalLoadingLayout = getFooterLayout(); - listViewLoadingLayout = mFooterLoadingView; - selection = mRefreshableView.getCount() - 1; - scrollToHeight = getFooterSize(); - scrollLvToEdge = Math.abs(mRefreshableView.getLastVisiblePosition() - selection) <= 1; - break; - case PULL_FROM_START: - default: - originalLoadingLayout = getHeaderLayout(); - listViewLoadingLayout = mHeaderLoadingView; - scrollToHeight = -getHeaderSize(); - selection = 0; - scrollLvToEdge = Math.abs(mRefreshableView.getFirstVisiblePosition() - selection) <= 1; - break; - } - - // 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) { - - // Set our Original View to Visible - originalLoadingLayout.showInvisibleViews(); - - // 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(); - } - - @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) { - lv = new InternalListViewSDK9(context, attrs); - } else { - lv = new InternalListView(context, attrs); - } - return lv; - } - - @Override - protected ListView createRefreshableView(Context context, AttributeSet attrs) { - ListView lv = createListView(context, attrs); - - // Set it to this so it can be used in ListActivity/ListFragment - lv.setId(android.R.id.list); - return lv; - } - - @Override - protected void handleStyledAttributes(TypedArray a) { - super.handleStyledAttributes(a); - - mListViewExtrasEnabled = a.getBoolean(R.styleable.PullToRefresh_ptrListViewExtrasEnabled, true); - - if (mListViewExtrasEnabled) { - 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(getContext()); - mHeaderLoadingView = createLoadingLayout(getContext(), Mode.PULL_FROM_START, a); - mHeaderLoadingView.setVisibility(View.GONE); - frame.addView(mHeaderLoadingView, lp); - mRefreshableView.addHeaderView(frame, null, false); - - mLvFooterLoadingFrame = new FrameLayout(getContext()); - mFooterLoadingView = createLoadingLayout(getContext(), Mode.PULL_FROM_END, a); - mFooterLoadingView.setVisibility(View.GONE); - mLvFooterLoadingFrame.addView(mFooterLoadingView, lp); - - /** - * If the value for Scrolling While Refreshing hasn't been - * explicitly set via XML, enable Scrolling While Refreshing. - */ - if (!a.hasValue(R.styleable.PullToRefresh_ptrScrollingWhileRefreshingEnabled)) { - setScrollingWhileRefreshingEnabled(true); - } - } - } - - @TargetApi(9) - final class InternalListViewSDK9 extends InternalListView { - - public InternalListViewSDK9(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(PullToRefreshListView.this, deltaX, scrollX, deltaY, scrollY, isTouchEvent); - - return returnValue; - } - } - - protected class InternalListView extends ListView implements EmptyViewMethodAccessor { - - private boolean mAddedLvFooter = false; - - public InternalListView(Context context, AttributeSet attrs) { - super(context, 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. - */ - try { - 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; - } - } - - @Override - public void setAdapter(ListAdapter adapter) { - // Add the Footer View at the last possible moment - if (null != mLvFooterLoadingFrame && !mAddedLvFooter) { - addFooterView(mLvFooterLoadingFrame, null, false); - mAddedLvFooter = true; - } - - super.setAdapter(adapter); - } - - @Override - public void setEmptyView(View emptyView) { - PullToRefreshListView.this.setEmptyView(emptyView); - } - - @Override - public void setEmptyViewInternal(View emptyView) { - super.setEmptyView(emptyView); - } - - } - -} diff --git a/core/pulltorefresh/src/main/java/com/handmark/pulltorefresh/library/PullToRefreshScrollView.java b/core/pulltorefresh/src/main/java/com/handmark/pulltorefresh/library/PullToRefreshScrollView.java deleted file mode 100644 index 3ae3627f..00000000 --- a/core/pulltorefresh/src/main/java/com/handmark/pulltorefresh/library/PullToRefreshScrollView.java +++ /dev/null @@ -1,109 +0,0 @@ -/******************************************************************************* - * 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.ScrollView; - -public class PullToRefreshScrollView extends PullToRefreshBase { - - 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 Orientation getPullToRefreshScrollDirection() { - return Orientation.VERTICAL; - } - - @Override - protected ScrollView createRefreshableView(Context context, AttributeSet attrs) { - ScrollView scrollView; - if (VERSION.SDK_INT >= VERSION_CODES.GINGERBREAD) { - scrollView = new InternalScrollViewSDK9(context, attrs); - } else { - scrollView = new ScrollView(context, attrs); - } - - scrollView.setId(R.id.scrollview); - return scrollView; - } - - @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 InternalScrollViewSDK9 extends ScrollView { - - public InternalScrollViewSDK9(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(PullToRefreshScrollView.this, deltaX, scrollX, 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/core/pulltorefresh/src/main/java/com/handmark/pulltorefresh/library/PullToRefreshWebView.java b/core/pulltorefresh/src/main/java/com/handmark/pulltorefresh/library/PullToRefreshWebView.java deleted file mode 100644 index a008e424..00000000 --- a/core/pulltorefresh/src/main/java/com/handmark/pulltorefresh/library/PullToRefreshWebView.java +++ /dev/null @@ -1,164 +0,0 @@ -/******************************************************************************* - * Copyright 2011, 2012 Chris Banes. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - *******************************************************************************/ -package com.handmark.pulltorefresh.library; - -import android.annotation.TargetApi; -import android.content.Context; -import android.os.Build.VERSION; -import android.os.Build.VERSION_CODES; -import android.os.Bundle; -import android.util.AttributeSet; -import android.webkit.WebChromeClient; -import android.webkit.WebView; - -public class PullToRefreshWebView extends PullToRefreshBase { - - private static final OnRefreshListener defaultOnRefreshListener = new OnRefreshListener() { - - @Override - public void onRefresh(PullToRefreshBase refreshView) { - refreshView.getRefreshableView().reload(); - } - - }; - - private final WebChromeClient defaultWebChromeClient = new WebChromeClient() { - - @Override - public void onProgressChanged(WebView view, int newProgress) { - if (newProgress == 100) { - onRefreshComplete(); - } - } - - }; - - public PullToRefreshWebView(Context context) { - super(context); - - /** - * Added so that by default, Pull-to-Refresh refreshes the page - */ - setOnRefreshListener(defaultOnRefreshListener); - mRefreshableView.setWebChromeClient(defaultWebChromeClient); - } - - public PullToRefreshWebView(Context context, AttributeSet attrs) { - super(context, attrs); - - /** - * Added so that by default, Pull-to-Refresh refreshes the page - */ - setOnRefreshListener(defaultOnRefreshListener); - mRefreshableView.setWebChromeClient(defaultWebChromeClient); - } - - public PullToRefreshWebView(Context context, Mode mode) { - super(context, mode); - - /** - * Added so that by default, Pull-to-Refresh refreshes the page - */ - setOnRefreshListener(defaultOnRefreshListener); - mRefreshableView.setWebChromeClient(defaultWebChromeClient); - } - - public PullToRefreshWebView(Context context, Mode mode, AnimationStyle style) { - super(context, mode, style); - - /** - * Added so that by default, Pull-to-Refresh refreshes the page - */ - setOnRefreshListener(defaultOnRefreshListener); - mRefreshableView.setWebChromeClient(defaultWebChromeClient); - } - - @Override - public final Orientation getPullToRefreshScrollDirection() { - return Orientation.VERTICAL; - } - - @Override - protected WebView createRefreshableView(Context context, AttributeSet attrs) { - WebView webView; - if (VERSION.SDK_INT >= VERSION_CODES.GINGERBREAD) { - webView = new InternalWebViewSDK9(context, attrs); - } else { - webView = new WebView(context, attrs); - } - - webView.setId(R.id.webview); - return webView; - } - - @Override - protected boolean isReadyForPullStart() { - return mRefreshableView.getScrollY() == 0; - } - - @Override - protected boolean isReadyForPullEnd() { - float exactContentHeight = (float) Math.floor(mRefreshableView.getContentHeight() * mRefreshableView.getScale()); - return mRefreshableView.getScrollY() >= (exactContentHeight - mRefreshableView.getHeight()); - } - - @Override - protected void onPtrRestoreInstanceState(Bundle savedInstanceState) { - super.onPtrRestoreInstanceState(savedInstanceState); - mRefreshableView.restoreState(savedInstanceState); - } - - @Override - protected void onPtrSaveInstanceState(Bundle saveState) { - super.onPtrSaveInstanceState(saveState); - mRefreshableView.saveState(saveState); - } - - @TargetApi(9) - final class InternalWebViewSDK9 extends WebView { - - // WebView doesn't always scroll back to it's edge so we add some - // fuzziness - static final int OVERSCROLL_FUZZY_THRESHOLD = 2; - - // WebView seems quite reluctant to overscroll so we use the scale - // factor to scale it's value - static final float OVERSCROLL_SCALE_FACTOR = 1.5f; - - public InternalWebViewSDK9(Context context, AttributeSet attrs) { - super(context, attrs); - } - - @Override - protected boolean overScrollBy(int deltaX, int deltaY, int scrollX, int scrollY, int scrollRangeX, - int scrollRangeY, int maxOverScrollX, int maxOverScrollY, boolean isTouchEvent) { - - final boolean returnValue = super.overScrollBy(deltaX, deltaY, scrollX, scrollY, scrollRangeX, - scrollRangeY, maxOverScrollX, maxOverScrollY, isTouchEvent); - - // Does all of the hard work... - OverscrollHelper.overScrollBy(PullToRefreshWebView.this, deltaX, scrollX, deltaY, scrollY, - getScrollRange(), OVERSCROLL_FUZZY_THRESHOLD, OVERSCROLL_SCALE_FACTOR, isTouchEvent); - - return returnValue; - } - - private int getScrollRange() { - return (int) Math.max(0, Math.floor(mRefreshableView.getContentHeight() * mRefreshableView.getScale()) - - (getHeight() - getPaddingBottom() - getPaddingTop())); - } - } -} diff --git a/core/pulltorefresh/src/main/java/com/handmark/pulltorefresh/library/extras/PullToRefreshWebView2.java b/core/pulltorefresh/src/main/java/com/handmark/pulltorefresh/library/extras/PullToRefreshWebView2.java deleted file mode 100644 index 78192037..00000000 --- a/core/pulltorefresh/src/main/java/com/handmark/pulltorefresh/library/extras/PullToRefreshWebView2.java +++ /dev/null @@ -1,132 +0,0 @@ -/******************************************************************************* - * 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.extras; - -import java.util.concurrent.atomic.AtomicBoolean; - -import android.content.Context; -import android.util.AttributeSet; -import android.webkit.WebView; - -import com.handmark.pulltorefresh.library.PullToRefreshWebView; - -/** - * 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 { - - static final String JS_INTERFACE_PKG = "ptr"; - static final String DEF_JS_READY_PULL_DOWN_CALL = "javascript:isReadyForPullDown();"; - static final String DEF_JS_READY_PULL_UP_CALL = "javascript:isReadyForPullUp();"; - - public PullToRefreshWebView2(Context context) { - super(context); - } - - public PullToRefreshWebView2(Context context, AttributeSet attrs) { - super(context, attrs); - } - - public PullToRefreshWebView2(Context context, Mode mode) { - super(context, mode); - } - - private JsValueCallback mJsCallback; - private final AtomicBoolean mIsReadyForPullDown = new AtomicBoolean(false); - private final AtomicBoolean mIsReadyForPullUp = new AtomicBoolean(false); - - @Override - protected WebView createRefreshableView(Context context, AttributeSet attrs) { - WebView webView = super.createRefreshableView(context, attrs); - - // Need to add JS Interface so we can get the response back - mJsCallback = new JsValueCallback(); - webView.addJavascriptInterface(mJsCallback, JS_INTERFACE_PKG); - - return webView; - } - - @Override - protected boolean isReadyForPullStart() { - // Call Javascript... - getRefreshableView().loadUrl(DEF_JS_READY_PULL_DOWN_CALL); - - // Response will be given to JsValueCallback, which will update - // mIsReadyForPullDown - - return mIsReadyForPullDown.get(); - } - - @Override - protected boolean isReadyForPullEnd() { - // Call Javascript... - getRefreshableView().loadUrl(DEF_JS_READY_PULL_UP_CALL); - - // Response will be given to JsValueCallback, which will update - // mIsReadyForPullUp - - return mIsReadyForPullUp.get(); - } - - /** - * Used for response from Javascript - * - * @author Chris Banes - */ - final class JsValueCallback { - - public void isReadyForPullUpResponse(boolean response) { - mIsReadyForPullUp.set(response); - } - - public void isReadyForPullDownResponse(boolean response) { - mIsReadyForPullDown.set(response); - } - } -} diff --git a/core/pulltorefresh/src/main/java/com/handmark/pulltorefresh/library/extras/SoundPullEventListener.java b/core/pulltorefresh/src/main/java/com/handmark/pulltorefresh/library/extras/SoundPullEventListener.java deleted file mode 100644 index a7aac306..00000000 --- a/core/pulltorefresh/src/main/java/com/handmark/pulltorefresh/library/extras/SoundPullEventListener.java +++ /dev/null @@ -1,96 +0,0 @@ -/******************************************************************************* - * 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.extras; - -import java.util.HashMap; - -import android.content.Context; -import android.media.MediaPlayer; -import android.view.View; - -import com.handmark.pulltorefresh.library.PullToRefreshBase; -import com.handmark.pulltorefresh.library.PullToRefreshBase.Mode; -import com.handmark.pulltorefresh.library.PullToRefreshBase.State; - -public class SoundPullEventListener implements PullToRefreshBase.OnPullEventListener { - - private final Context mContext; - private final HashMap mSoundMap; - - private MediaPlayer mCurrentMediaPlayer; - - /** - * Constructor - * - * @param context - Context - */ - public SoundPullEventListener(Context context) { - mContext = context; - mSoundMap = new HashMap(); - } - - @Override - public final void onPullEvent(PullToRefreshBase refreshView, State event, Mode direction) { - Integer soundResIdObj = mSoundMap.get(event); - if (null != soundResIdObj) { - playSound(soundResIdObj.intValue()); - } - } - - /** - * 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) - */ - public void addSoundEvent(State event, int resId) { - mSoundMap.put(event, resId); - } - - /** - * Clears all of the previously set sounds and events. - */ - public void clearSounds() { - mSoundMap.clear(); - } - - /** - * Gets the current (or last) MediaPlayer instance. - */ - public MediaPlayer getCurrentMediaPlayer() { - return mCurrentMediaPlayer; - } - - private void playSound(int resId) { - // Stop current player, if there's one playing - if (null != mCurrentMediaPlayer) { - mCurrentMediaPlayer.stop(); - mCurrentMediaPlayer.release(); - } - - mCurrentMediaPlayer = MediaPlayer.create(mContext, resId); - if (null != mCurrentMediaPlayer) { - mCurrentMediaPlayer.start(); - } - } - -} diff --git a/core/pulltorefresh/src/main/java/com/handmark/pulltorefresh/library/internal/EmptyViewMethodAccessor.java b/core/pulltorefresh/src/main/java/com/handmark/pulltorefresh/library/internal/EmptyViewMethodAccessor.java deleted file mode 100644 index 369f21e8..00000000 --- a/core/pulltorefresh/src/main/java/com/handmark/pulltorefresh/library/internal/EmptyViewMethodAccessor.java +++ /dev/null @@ -1,43 +0,0 @@ -/******************************************************************************* - * 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.internal; - -import android.view.View; - -/** - * 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 - */ - public void setEmptyViewInternal(View emptyView); - - /** - * Should call PullToRefreshBase.setEmptyView() which will then - * automatically call through to setEmptyViewInternal() - * - * @param emptyView - to set as Empty View - */ - public void setEmptyView(View emptyView); - -} diff --git a/core/pulltorefresh/src/main/java/com/handmark/pulltorefresh/library/internal/FlipLoadingLayout.java b/core/pulltorefresh/src/main/java/com/handmark/pulltorefresh/library/internal/FlipLoadingLayout.java deleted file mode 100644 index fef31605..00000000 --- a/core/pulltorefresh/src/main/java/com/handmark/pulltorefresh/library/internal/FlipLoadingLayout.java +++ /dev/null @@ -1,146 +0,0 @@ -/******************************************************************************* - * 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.internal; - -import android.annotation.SuppressLint; -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.Mode; -import com.handmark.pulltorefresh.library.PullToRefreshBase.Orientation; -import com.handmark.pulltorefresh.library.R; - -@SuppressLint("ViewConstructor") -public class FlipLoadingLayout extends LoadingLayout { - - static final int FLIP_ANIMATION_DURATION = 150; - - private final Animation mRotateAnimation, mResetRotateAnimation; - - 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; - - 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); - - mResetRotateAnimation = new RotateAnimation(rotateAngle, 0, Animation.RELATIVE_TO_SELF, 0.5f, - Animation.RELATIVE_TO_SELF, 0.5f); - mResetRotateAnimation.setInterpolator(ANIMATION_INTERPOLATOR); - mResetRotateAnimation.setDuration(FLIP_ANIMATION_DURATION); - mResetRotateAnimation.setFillAfter(true); - } - - @Override - protected void onLoadingDrawableSet(Drawable imageDrawable) { - 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(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(), lp.width / 2f, lp.height / 2f); - mHeaderImage.setImageMatrix(matrix); - } - } - - @Override - protected void onPullImpl(float scaleOfLayout) { - // NO-OP - } - - @Override - protected void pullToRefreshImpl() { - // Only start reset Animation, we've previously show the rotate anim - if (mRotateAnimation == mHeaderImage.getAnimation()) { - mHeaderImage.startAnimation(mResetRotateAnimation); - } - } - - @Override - protected void refreshingImpl() { - mHeaderImage.clearAnimation(); - mHeaderImage.setVisibility(View.INVISIBLE); - mHeaderProgress.setVisibility(View.VISIBLE); - } - - @Override - protected void releaseToRefreshImpl() { - mHeaderImage.startAnimation(mRotateAnimation); - } - - @Override - protected void resetImpl() { - mHeaderImage.clearAnimation(); - mHeaderProgress.setVisibility(View.GONE); - mHeaderImage.setVisibility(View.VISIBLE); - } - - @Override - protected int getDefaultDrawableResId() { - return R.drawable.default_ptr_flip; - } - - private float getDrawableRotationAngle() { - float angle = 0f; - switch (mMode) { - case PULL_FROM_END: - if (mScrollDirection == Orientation.HORIZONTAL) { - angle = 90f; - } else { - angle = 180f; - } - break; - - case PULL_FROM_START: - if (mScrollDirection == Orientation.HORIZONTAL) { - angle = 270f; - } - break; - - default: - break; - } - - return angle; - } - -} diff --git a/core/pulltorefresh/src/main/java/com/handmark/pulltorefresh/library/internal/IndicatorLayout.java b/core/pulltorefresh/src/main/java/com/handmark/pulltorefresh/library/internal/IndicatorLayout.java deleted file mode 100644 index a9069f2a..00000000 --- a/core/pulltorefresh/src/main/java/com/handmark/pulltorefresh/library/internal/IndicatorLayout.java +++ /dev/null @@ -1,147 +0,0 @@ -/******************************************************************************* - * 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.internal; - -import android.annotation.SuppressLint; -import android.content.Context; -import android.graphics.Matrix; -import android.graphics.drawable.Drawable; -import android.view.View; -import android.view.animation.Animation; -import android.view.animation.Animation.AnimationListener; -import android.view.animation.AnimationUtils; -import android.view.animation.Interpolator; -import android.view.animation.LinearInterpolator; -import android.view.animation.RotateAnimation; -import android.widget.FrameLayout; -import android.widget.ImageView; -import android.widget.ImageView.ScaleType; - -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; - - private Animation mInAnim, mOutAnim; - private ImageView mArrowImageView; - - private final Animation mRotateAnimation, mResetRotateAnimation; - - public IndicatorLayout(Context context, PullToRefreshBase.Mode mode) { - super(context); - mArrowImageView = new ImageView(context); - - Drawable arrowD = getResources().getDrawable(R.drawable.indicator_arrow); - mArrowImageView.setImageDrawable(arrowD); - - final int padding = getResources().getDimensionPixelSize(R.dimen.indicator_internal_padding); - mArrowImageView.setPadding(padding, padding, padding, padding); - addView(mArrowImageView); - - int inAnimResId, outAnimResId; - switch (mode) { - case PULL_FROM_END: - inAnimResId = R.anim.slide_in_from_bottom; - outAnimResId = R.anim.slide_out_to_bottom; - setBackgroundResource(R.drawable.indicator_bg_bottom); - - // Rotate Arrow so it's pointing the correct way - mArrowImageView.setScaleType(ScaleType.MATRIX); - Matrix matrix = new Matrix(); - matrix.setRotate(180f, arrowD.getIntrinsicWidth() / 2f, arrowD.getIntrinsicHeight() / 2f); - mArrowImageView.setImageMatrix(matrix); - break; - default: - case PULL_FROM_START: - inAnimResId = R.anim.slide_in_from_top; - outAnimResId = R.anim.slide_out_to_top; - setBackgroundResource(R.drawable.indicator_bg_top); - break; - } - - mInAnim = AnimationUtils.loadAnimation(context, inAnimResId); - mInAnim.setAnimationListener(this); - - mOutAnim = AnimationUtils.loadAnimation(context, outAnimResId); - mOutAnim.setAnimationListener(this); - - final Interpolator interpolator = new LinearInterpolator(); - mRotateAnimation = new RotateAnimation(0, -180, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, - 0.5f); - mRotateAnimation.setInterpolator(interpolator); - mRotateAnimation.setDuration(DEFAULT_ROTATION_ANIMATION_DURATION); - mRotateAnimation.setFillAfter(true); - - mResetRotateAnimation = new RotateAnimation(-180, 0, Animation.RELATIVE_TO_SELF, 0.5f, - Animation.RELATIVE_TO_SELF, 0.5f); - mResetRotateAnimation.setInterpolator(interpolator); - mResetRotateAnimation.setDuration(DEFAULT_ROTATION_ANIMATION_DURATION); - mResetRotateAnimation.setFillAfter(true); - - } - - public final boolean isVisible() { - Animation currentAnim = getAnimation(); - if (null != currentAnim) { - return mInAnim == currentAnim; - } - - return getVisibility() == View.VISIBLE; - } - - public void hide() { - startAnimation(mOutAnim); - } - - public void show() { - mArrowImageView.clearAnimation(); - startAnimation(mInAnim); - } - - @Override - public void onAnimationEnd(Animation animation) { - if (animation == mOutAnim) { - mArrowImageView.clearAnimation(); - setVisibility(View.GONE); - } else if (animation == mInAnim) { - setVisibility(View.VISIBLE); - } - - clearAnimation(); - } - - @Override - public void onAnimationRepeat(Animation animation) { - // NO-OP - } - - @Override - public void onAnimationStart(Animation animation) { - setVisibility(View.VISIBLE); - } - - public void releaseToRefresh() { - mArrowImageView.startAnimation(mRotateAnimation); - } - - public void pullToRefresh() { - mArrowImageView.startAnimation(mResetRotateAnimation); - } - -} diff --git a/core/pulltorefresh/src/main/java/com/handmark/pulltorefresh/library/internal/LoadingLayout.java b/core/pulltorefresh/src/main/java/com/handmark/pulltorefresh/library/internal/LoadingLayout.java deleted file mode 100644 index 9c12586d..00000000 --- a/core/pulltorefresh/src/main/java/com/handmark/pulltorefresh/library/internal/LoadingLayout.java +++ /dev/null @@ -1,393 +0,0 @@ -/******************************************************************************* - * 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.internal; - -import android.annotation.SuppressLint; -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; -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; -import android.widget.ImageView; -import android.widget.ProgressBar; -import android.widget.TextView; - -import com.handmark.pulltorefresh.library.ILoadingLayout; -import com.handmark.pulltorefresh.library.PullToRefreshBase.Mode; -import com.handmark.pulltorefresh.library.PullToRefreshBase.Orientation; -import com.handmark.pulltorefresh.library.R; - -@SuppressLint("ViewConstructor") -public abstract class LoadingLayout extends FrameLayout implements ILoadingLayout { - - static final String LOG_TAG = "PullToRefresh-LoadingLayout"; - - static final Interpolator ANIMATION_INTERPOLATOR = new LinearInterpolator(); - - private FrameLayout mInnerLayout; - - protected final ImageView mHeaderImage; - protected final ProgressBar mHeaderProgress; - - private boolean mUseIntrinsicAnimation; - - private final TextView mHeaderText; - private final TextView mSubHeaderText; - - protected final Mode mMode; - protected final Orientation mScrollDirection; - - private CharSequence mPullLabel; - private CharSequence mRefreshingLabel; - private CharSequence mReleaseLabel; - - public LoadingLayout(Context context, final Mode mode, final Orientation scrollDirection, TypedArray attrs) { - super(context); - mMode = mode; - mScrollDirection = scrollDirection; - - switch (scrollDirection) { - case HORIZONTAL: - LayoutInflater.from(context).inflate(R.layout.pull_to_refresh_header_horizontal, this); - break; - case VERTICAL: - default: - LayoutInflater.from(context).inflate(R.layout.pull_to_refresh_header_vertical, this); - break; - } - - 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); - mReleaseLabel = context.getString(R.string.pull_to_refresh_from_bottom_release_label); - break; - - 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); - mReleaseLabel = context.getString(R.string.pull_to_refresh_release_label); - break; - } - - if (attrs.hasValue(R.styleable.PullToRefresh_ptrHeaderBackground)) { - Drawable background = attrs.getDrawable(R.styleable.PullToRefresh_ptrHeaderBackground); - if (null != background) { - ViewCompat.setBackground(this, background); - } - } - - if (attrs.hasValue(R.styleable.PullToRefresh_ptrHeaderTextAppearance)) { - TypedValue styleID = new TypedValue(); - attrs.getValue(R.styleable.PullToRefresh_ptrHeaderTextAppearance, styleID); - setTextAppearance(styleID.data); - } - if (attrs.hasValue(R.styleable.PullToRefresh_ptrSubHeaderTextAppearance)) { - TypedValue styleID = new TypedValue(); - attrs.getValue(R.styleable.PullToRefresh_ptrSubHeaderTextAppearance, styleID); - 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); - if (null != colors) { - setTextColor(colors); - } - } - if (attrs.hasValue(R.styleable.PullToRefresh_ptrHeaderSubTextColor)) { - ColorStateList colors = attrs.getColorStateList(R.styleable.PullToRefresh_ptrHeaderSubTextColor); - if (null != colors) { - setSubTextColor(colors); - } - } - - // Try and get defined drawable from Attrs - Drawable imageDrawable = null; - if (attrs.hasValue(R.styleable.PullToRefresh_ptrDrawable)) { - imageDrawable = attrs.getDrawable(R.styleable.PullToRefresh_ptrDrawable); - } - - // Check Specific Drawable from Attrs, these overrite the generic - // 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)) { - 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 - if (null == imageDrawable) { - imageDrawable = context.getResources().getDrawable(getDefaultDrawableResId()); - } - - // Set Drawable, and save width/height - setLoadingDrawable(imageDrawable); - - reset(); - } - - 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 getContentSize() { - switch (mScrollDirection) { - case HORIZONTAL: - return mInnerLayout.getWidth(); - case VERTICAL: - default: - return mInnerLayout.getHeight(); - } - } - - 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 onPull(float scaleOfLayout) { - if (!mUseIntrinsicAnimation) { - onPullImpl(scaleOfLayout); - } - } - - public final void pullToRefresh() { - if (null != mHeaderText) { - mHeaderText.setText(mPullLabel); - } - - // Now call the callback - pullToRefreshImpl(); - } - - public final void refreshing() { - if (null != mHeaderText) { - mHeaderText.setText(mRefreshingLabel); - } - - if (mUseIntrinsicAnimation) { - ((AnimationDrawable) mHeaderImage.getDrawable()).start(); - } else { - // Now call the callback - refreshingImpl(); - } - - if (null != mSubHeaderText) { - mSubHeaderText.setVisibility(View.GONE); - } - } - - public final void releaseToRefresh() { - if (null != mHeaderText) { - mHeaderText.setText(mReleaseLabel); - } - - // Now call the callback - releaseToRefreshImpl(); - } - - public final void reset() { - if (null != mHeaderText) { - mHeaderText.setText(mPullLabel); - } - mHeaderImage.setVisibility(View.VISIBLE); - - if (mUseIntrinsicAnimation) { - ((AnimationDrawable) mHeaderImage.getDrawable()).stop(); - } else { - // Now call the callback - resetImpl(); - } - - if (null != mSubHeaderText) { - if (TextUtils.isEmpty(mSubHeaderText.getText())) { - mSubHeaderText.setVisibility(View.GONE); - } else { - mSubHeaderText.setVisibility(View.VISIBLE); - } - } - } - - @Override - public void setLastUpdatedLabel(CharSequence label) { - setSubHeaderText(label); - } - - public final void setLoadingDrawable(Drawable imageDrawable) { - // Set Drawable - mHeaderImage.setImageDrawable(imageDrawable); - mUseIntrinsicAnimation = (imageDrawable instanceof AnimationDrawable); - - // Now call the callback - onLoadingDrawableSet(imageDrawable); - } - - public void setPullLabel(CharSequence pullLabel) { - mPullLabel = pullLabel; - } - - public void setRefreshingLabel(CharSequence refreshingLabel) { - mRefreshingLabel = refreshingLabel; - } - - public void setReleaseLabel(CharSequence releaseLabel) { - mReleaseLabel = releaseLabel; - } - - @Override - 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 - */ - - 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 setSubHeaderText(CharSequence label) { - if (null != mSubHeaderText) { - if (TextUtils.isEmpty(label)) { - mSubHeaderText.setVisibility(View.GONE); - } else { - mSubHeaderText.setText(label); - - // Only set it to Visible if we're GONE, otherwise VISIBLE will - // be set soon - if (View.GONE == mSubHeaderText.getVisibility()) { - mSubHeaderText.setVisibility(View.VISIBLE); - } - } - } - } - - private void setSubTextAppearance(int value) { - if (null != mSubHeaderText) { - mSubHeaderText.setTextAppearance(getContext(), value); - } - } - - private void setSubTextColor(ColorStateList color) { - if (null != mSubHeaderText) { - mSubHeaderText.setTextColor(color); - } - } - - private void setTextAppearance(int value) { - if (null != mHeaderText) { - mHeaderText.setTextAppearance(getContext(), value); - } - if (null != mSubHeaderText) { - mSubHeaderText.setTextAppearance(getContext(), value); - } - } - - private void setTextColor(ColorStateList color) { - if (null != mHeaderText) { - mHeaderText.setTextColor(color); - } - if (null != mSubHeaderText) { - mSubHeaderText.setTextColor(color); - } - } - -} diff --git a/core/pulltorefresh/src/main/java/com/handmark/pulltorefresh/library/internal/RotateLoadingLayout.java b/core/pulltorefresh/src/main/java/com/handmark/pulltorefresh/library/internal/RotateLoadingLayout.java deleted file mode 100644 index bda7b2fc..00000000 --- a/core/pulltorefresh/src/main/java/com/handmark/pulltorefresh/library/internal/RotateLoadingLayout.java +++ /dev/null @@ -1,110 +0,0 @@ -/******************************************************************************* - * 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.internal; - -import android.content.Context; -import android.content.res.TypedArray; -import android.graphics.Matrix; -import android.graphics.drawable.Drawable; -import android.view.animation.Animation; -import android.view.animation.RotateAnimation; -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 { - - static final int ROTATION_ANIMATION_DURATION = 1200; - - private final Animation mRotateAnimation; - private final Matrix mHeaderImageMatrix; - - 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); - - mRotateAnimation = new RotateAnimation(0, 720, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, - 0.5f); - mRotateAnimation.setInterpolator(ANIMATION_INTERPOLATOR); - mRotateAnimation.setDuration(ROTATION_ANIMATION_DURATION); - mRotateAnimation.setRepeatCount(Animation.INFINITE); - mRotateAnimation.setRepeatMode(Animation.RESTART); - } - - public void onLoadingDrawableSet(Drawable imageDrawable) { - if (null != imageDrawable) { - mRotationPivotX = Math.round(imageDrawable.getIntrinsicWidth() / 2f); - mRotationPivotY = Math.round(imageDrawable.getIntrinsicHeight() / 2f); - } - } - - protected void onPullImpl(float scaleOfLayout) { - 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); - } - - @Override - protected void refreshingImpl() { - mHeaderImage.startAnimation(mRotateAnimation); - } - - @Override - protected void resetImpl() { - mHeaderImage.clearAnimation(); - resetImageRotation(); - } - - private void resetImageRotation() { - if (null != mHeaderImageMatrix) { - mHeaderImageMatrix.reset(); - mHeaderImage.setImageMatrix(mHeaderImageMatrix); - } - } - - @Override - protected void pullToRefreshImpl() { - // NO-OP - } - - @Override - protected void releaseToRefreshImpl() { - // NO-OP - } - - @Override - protected int getDefaultDrawableResId() { - return R.drawable.default_ptr_rotate; - } - -} diff --git a/core/pulltorefresh/src/main/java/com/handmark/pulltorefresh/library/internal/Utils.java b/core/pulltorefresh/src/main/java/com/handmark/pulltorefresh/library/internal/Utils.java deleted file mode 100644 index 73432189..00000000 --- a/core/pulltorefresh/src/main/java/com/handmark/pulltorefresh/library/internal/Utils.java +++ /dev/null @@ -1,13 +0,0 @@ -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); - } - -} diff --git a/core/pulltorefresh/src/main/java/com/handmark/pulltorefresh/library/internal/ViewCompat.java b/core/pulltorefresh/src/main/java/com/handmark/pulltorefresh/library/internal/ViewCompat.java deleted file mode 100644 index 618bace0..00000000 --- a/core/pulltorefresh/src/main/java/com/handmark/pulltorefresh/library/internal/ViewCompat.java +++ /dev/null @@ -1,70 +0,0 @@ -/******************************************************************************* - * 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.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; - -@SuppressWarnings("deprecation") -public class ViewCompat { - - public static void postOnAnimation(View view, Runnable 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); - } - } - - 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 { - - public static void postOnAnimation(View view, Runnable runnable) { - view.postOnAnimation(runnable); - } - - public static void setBackground(View view, Drawable background) { - view.setBackground(background); - } - - } - -} diff --git a/core/pulltorefresh/src/main/res/anim/slide_in_from_bottom.xml b/core/pulltorefresh/src/main/res/anim/slide_in_from_bottom.xml deleted file mode 100644 index bb430ce9..00000000 --- a/core/pulltorefresh/src/main/res/anim/slide_in_from_bottom.xml +++ /dev/null @@ -1,21 +0,0 @@ - - - - diff --git a/core/pulltorefresh/src/main/res/anim/slide_in_from_top.xml b/core/pulltorefresh/src/main/res/anim/slide_in_from_top.xml deleted file mode 100644 index 52d91afc..00000000 --- a/core/pulltorefresh/src/main/res/anim/slide_in_from_top.xml +++ /dev/null @@ -1,21 +0,0 @@ - - - - diff --git a/core/pulltorefresh/src/main/res/anim/slide_out_to_bottom.xml b/core/pulltorefresh/src/main/res/anim/slide_out_to_bottom.xml deleted file mode 100644 index 83eca5ad..00000000 --- a/core/pulltorefresh/src/main/res/anim/slide_out_to_bottom.xml +++ /dev/null @@ -1,21 +0,0 @@ - - - - diff --git a/core/pulltorefresh/src/main/res/anim/slide_out_to_top.xml b/core/pulltorefresh/src/main/res/anim/slide_out_to_top.xml deleted file mode 100644 index 5105ae1f..00000000 --- a/core/pulltorefresh/src/main/res/anim/slide_out_to_top.xml +++ /dev/null @@ -1,21 +0,0 @@ - - - - diff --git a/core/pulltorefresh/src/main/res/drawable-hdpi/default_ptr_flip.png b/core/pulltorefresh/src/main/res/drawable-hdpi/default_ptr_flip.png deleted file mode 100644 index 0a2c0bd9..00000000 Binary files a/core/pulltorefresh/src/main/res/drawable-hdpi/default_ptr_flip.png and /dev/null differ diff --git a/core/pulltorefresh/src/main/res/drawable-hdpi/default_ptr_rotate.png b/core/pulltorefresh/src/main/res/drawable-hdpi/default_ptr_rotate.png deleted file mode 100644 index dc641b72..00000000 Binary files a/core/pulltorefresh/src/main/res/drawable-hdpi/default_ptr_rotate.png and /dev/null differ diff --git a/core/pulltorefresh/src/main/res/drawable-hdpi/indicator_arrow.png b/core/pulltorefresh/src/main/res/drawable-hdpi/indicator_arrow.png deleted file mode 100644 index 8ae79770..00000000 Binary files a/core/pulltorefresh/src/main/res/drawable-hdpi/indicator_arrow.png and /dev/null differ diff --git a/core/pulltorefresh/src/main/res/drawable-mdpi/default_ptr_flip.png b/core/pulltorefresh/src/main/res/drawable-mdpi/default_ptr_flip.png deleted file mode 100644 index be696c1c..00000000 Binary files a/core/pulltorefresh/src/main/res/drawable-mdpi/default_ptr_flip.png and /dev/null differ diff --git a/core/pulltorefresh/src/main/res/drawable-mdpi/default_ptr_rotate.png b/core/pulltorefresh/src/main/res/drawable-mdpi/default_ptr_rotate.png deleted file mode 100644 index 95b22bd7..00000000 Binary files a/core/pulltorefresh/src/main/res/drawable-mdpi/default_ptr_rotate.png and /dev/null differ diff --git a/core/pulltorefresh/src/main/res/drawable-mdpi/indicator_arrow.png b/core/pulltorefresh/src/main/res/drawable-mdpi/indicator_arrow.png deleted file mode 100644 index 20fe2c12..00000000 Binary files a/core/pulltorefresh/src/main/res/drawable-mdpi/indicator_arrow.png and /dev/null differ diff --git a/core/pulltorefresh/src/main/res/drawable-xhdpi/default_ptr_flip.png b/core/pulltorefresh/src/main/res/drawable-xhdpi/default_ptr_flip.png deleted file mode 100644 index 3e6ddba5..00000000 Binary files a/core/pulltorefresh/src/main/res/drawable-xhdpi/default_ptr_flip.png and /dev/null differ diff --git a/core/pulltorefresh/src/main/res/drawable-xhdpi/default_ptr_rotate.png b/core/pulltorefresh/src/main/res/drawable-xhdpi/default_ptr_rotate.png deleted file mode 100644 index 00225c9a..00000000 Binary files a/core/pulltorefresh/src/main/res/drawable-xhdpi/default_ptr_rotate.png and /dev/null differ diff --git a/core/pulltorefresh/src/main/res/drawable-xhdpi/indicator_arrow.png b/core/pulltorefresh/src/main/res/drawable-xhdpi/indicator_arrow.png deleted file mode 100644 index 810ff595..00000000 Binary files a/core/pulltorefresh/src/main/res/drawable-xhdpi/indicator_arrow.png and /dev/null differ diff --git a/core/pulltorefresh/src/main/res/drawable/indicator_bg_bottom.xml b/core/pulltorefresh/src/main/res/drawable/indicator_bg_bottom.xml deleted file mode 100644 index 81a91aa6..00000000 --- a/core/pulltorefresh/src/main/res/drawable/indicator_bg_bottom.xml +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - - - - \ No newline at end of file diff --git a/core/pulltorefresh/src/main/res/drawable/indicator_bg_top.xml b/core/pulltorefresh/src/main/res/drawable/indicator_bg_top.xml deleted file mode 100644 index 59fa9cfe..00000000 --- a/core/pulltorefresh/src/main/res/drawable/indicator_bg_top.xml +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - - - - \ No newline at end of file diff --git a/core/pulltorefresh/src/main/res/layout/pull_to_refresh_header_horizontal.xml b/core/pulltorefresh/src/main/res/layout/pull_to_refresh_header_horizontal.xml deleted file mode 100644 index f05bb033..00000000 --- a/core/pulltorefresh/src/main/res/layout/pull_to_refresh_header_horizontal.xml +++ /dev/null @@ -1,29 +0,0 @@ - - - - - - - - - - - \ No newline at end of file diff --git a/core/pulltorefresh/src/main/res/layout/pull_to_refresh_header_vertical.xml b/core/pulltorefresh/src/main/res/layout/pull_to_refresh_header_vertical.xml deleted file mode 100644 index 2185e2d6..00000000 --- a/core/pulltorefresh/src/main/res/layout/pull_to_refresh_header_vertical.xml +++ /dev/null @@ -1,59 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/core/pulltorefresh/src/main/res/values-ar/pull_refresh_strings.xml b/core/pulltorefresh/src/main/res/values-ar/pull_refresh_strings.xml deleted file mode 100644 index 25d5392d..00000000 --- a/core/pulltorefresh/src/main/res/values-ar/pull_refresh_strings.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - اسحب للتحديث… - اترك للتحديث… - تحميل… - diff --git a/core/pulltorefresh/src/main/res/values-cs/pull_refresh_strings.xml b/core/pulltorefresh/src/main/res/values-cs/pull_refresh_strings.xml deleted file mode 100755 index c878da0c..00000000 --- a/core/pulltorefresh/src/main/res/values-cs/pull_refresh_strings.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - Tažením aktualizujete… - Uvolněním aktualizujete… - Načítání… - diff --git a/core/pulltorefresh/src/main/res/values-de/pull_refresh_strings.xml b/core/pulltorefresh/src/main/res/values-de/pull_refresh_strings.xml deleted file mode 100755 index 901291bf..00000000 --- a/core/pulltorefresh/src/main/res/values-de/pull_refresh_strings.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - Ziehen zum Aktualisieren… - Loslassen zum Aktualisieren… - Laden… - diff --git a/core/pulltorefresh/src/main/res/values-es/pull_refresh_strings.xml b/core/pulltorefresh/src/main/res/values-es/pull_refresh_strings.xml deleted file mode 100755 index 5e9d2803..00000000 --- a/core/pulltorefresh/src/main/res/values-es/pull_refresh_strings.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - Tirar para actualizar… - Soltar para actualizar… - Cargando… - diff --git a/core/pulltorefresh/src/main/res/values-fi/pull_refresh_strings.xml b/core/pulltorefresh/src/main/res/values-fi/pull_refresh_strings.xml deleted file mode 100755 index 0381287b..00000000 --- a/core/pulltorefresh/src/main/res/values-fi/pull_refresh_strings.xml +++ /dev/null @@ -1,13 +0,0 @@ - - - - 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 diff --git a/core/pulltorefresh/src/main/res/values-fr/pull_refresh_strings.xml b/core/pulltorefresh/src/main/res/values-fr/pull_refresh_strings.xml deleted file mode 100755 index fb53ef8c..00000000 --- a/core/pulltorefresh/src/main/res/values-fr/pull_refresh_strings.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - Tirez pour rafraîchir… - Relâcher pour rafraîchir… - Chargement… - diff --git a/core/pulltorefresh/src/main/res/values-he/pull_refresh_strings.xml b/core/pulltorefresh/src/main/res/values-he/pull_refresh_strings.xml deleted file mode 100644 index beedc1f6..00000000 --- a/core/pulltorefresh/src/main/res/values-he/pull_refresh_strings.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - משוך לרענון… - שחרר לרענון… - טוען… - diff --git a/core/pulltorefresh/src/main/res/values-it/pull_refresh_strings.xml b/core/pulltorefresh/src/main/res/values-it/pull_refresh_strings.xml deleted file mode 100755 index 415fb9ed..00000000 --- a/core/pulltorefresh/src/main/res/values-it/pull_refresh_strings.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - Tira per aggiornare… - Rilascia per aggionare… - Caricamento… - diff --git a/core/pulltorefresh/src/main/res/values-iw/pull_refresh_strings.xml b/core/pulltorefresh/src/main/res/values-iw/pull_refresh_strings.xml deleted file mode 100644 index beedc1f6..00000000 --- a/core/pulltorefresh/src/main/res/values-iw/pull_refresh_strings.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - משוך לרענון… - שחרר לרענון… - טוען… - diff --git a/core/pulltorefresh/src/main/res/values-ja/pull_refresh_strings.xml b/core/pulltorefresh/src/main/res/values-ja/pull_refresh_strings.xml deleted file mode 100644 index d24842c9..00000000 --- a/core/pulltorefresh/src/main/res/values-ja/pull_refresh_strings.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - 画面を引っ張って… - 指を離して更新… - 読み込み中… - diff --git a/core/pulltorefresh/src/main/res/values-ko/pull_refresh_strings.xml b/core/pulltorefresh/src/main/res/values-ko/pull_refresh_strings.xml deleted file mode 100755 index 53edd592..00000000 --- a/core/pulltorefresh/src/main/res/values-ko/pull_refresh_strings.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - 당겨서 새로 고침… - 놓아서 새로 고침… - 로드 중… - diff --git a/core/pulltorefresh/src/main/res/values-nl/pull_refresh_strings.xml b/core/pulltorefresh/src/main/res/values-nl/pull_refresh_strings.xml deleted file mode 100755 index 4c063ed9..00000000 --- a/core/pulltorefresh/src/main/res/values-nl/pull_refresh_strings.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - Sleep om te vernieuwen… - Loslaten om te vernieuwen… - Laden… - diff --git a/core/pulltorefresh/src/main/res/values-pl/pull_refresh_strings.xml b/core/pulltorefresh/src/main/res/values-pl/pull_refresh_strings.xml deleted file mode 100755 index 007255a2..00000000 --- a/core/pulltorefresh/src/main/res/values-pl/pull_refresh_strings.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - Pociągnij, aby odświeżyć… - Puść, aby odświeżyć… - Wczytywanie… - diff --git a/core/pulltorefresh/src/main/res/values-pt-rBR/pull_refresh_strings.xml b/core/pulltorefresh/src/main/res/values-pt-rBR/pull_refresh_strings.xml deleted file mode 100755 index 0ec1ef7f..00000000 --- a/core/pulltorefresh/src/main/res/values-pt-rBR/pull_refresh_strings.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - Puxe para atualizar… - Libere para atualizar… - Carregando… - diff --git a/core/pulltorefresh/src/main/res/values-pt/pull_refresh_strings.xml b/core/pulltorefresh/src/main/res/values-pt/pull_refresh_strings.xml deleted file mode 100755 index d08bc63b..00000000 --- a/core/pulltorefresh/src/main/res/values-pt/pull_refresh_strings.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - Puxe para atualizar… - Liberação para atualizar… - A carregar… - diff --git a/core/pulltorefresh/src/main/res/values-ro/pull_refresh_strings.xml b/core/pulltorefresh/src/main/res/values-ro/pull_refresh_strings.xml deleted file mode 100644 index 87ddc941..00000000 --- a/core/pulltorefresh/src/main/res/values-ro/pull_refresh_strings.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - Trage pentru a reîmprospăta… - Eliberează pentru a reîmprospăta… - Încărcare… - diff --git a/core/pulltorefresh/src/main/res/values-ru/pull_refresh_strings.xml b/core/pulltorefresh/src/main/res/values-ru/pull_refresh_strings.xml deleted file mode 100755 index 71ddcda7..00000000 --- a/core/pulltorefresh/src/main/res/values-ru/pull_refresh_strings.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - Потяните для обновления… - Отпустите для обновления… - Загрузка… - diff --git a/core/pulltorefresh/src/main/res/values-zh/pull_refresh_strings.xml b/core/pulltorefresh/src/main/res/values-zh/pull_refresh_strings.xml deleted file mode 100755 index 08766e0b..00000000 --- a/core/pulltorefresh/src/main/res/values-zh/pull_refresh_strings.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - 下拉刷新… - 放开以刷新… - 正在载入… - diff --git a/core/pulltorefresh/src/main/res/values/attrs.xml b/core/pulltorefresh/src/main/res/values/attrs.xml deleted file mode 100644 index a3408ae7..00000000 --- a/core/pulltorefresh/src/main/res/values/attrs.xml +++ /dev/null @@ -1,80 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/core/pulltorefresh/src/main/res/values/dimens.xml b/core/pulltorefresh/src/main/res/values/dimens.xml deleted file mode 100644 index 24339b5b..00000000 --- a/core/pulltorefresh/src/main/res/values/dimens.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - - 10dp - 12dp - 4dp - 24dp - 12dp - - \ No newline at end of file diff --git a/core/pulltorefresh/src/main/res/values/ids.xml b/core/pulltorefresh/src/main/res/values/ids.xml deleted file mode 100644 index 26c9ae76..00000000 --- a/core/pulltorefresh/src/main/res/values/ids.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - \ No newline at end of file diff --git a/core/pulltorefresh/src/main/res/values/pull_refresh_strings.xml b/core/pulltorefresh/src/main/res/values/pull_refresh_strings.xml deleted file mode 100755 index 20cd2fa4..00000000 --- a/core/pulltorefresh/src/main/res/values/pull_refresh_strings.xml +++ /dev/null @@ -1,13 +0,0 @@ - - - - Pull to refresh… - Release to refresh… - Loading… - - - @string/pull_to_refresh_pull_label - @string/pull_to_refresh_release_label - @string/pull_to_refresh_refreshing_label - - \ No newline at end of file diff --git a/settings.gradle b/settings.gradle index b5554310..df54c39f 100644 --- a/settings.gradle +++ b/settings.gradle @@ -4,5 +4,4 @@ include ':core:subsonic-api' include ':core:subsonic-api-image-loader' include ':core:cache' include ':core:menudrawer' -include ':core:pulltorefresh' include ':ultrasonic' diff --git a/ultrasonic/build.gradle b/ultrasonic/build.gradle index f70422f9..b0e8b248 100644 --- a/ultrasonic/build.gradle +++ b/ultrasonic/build.gradle @@ -56,7 +56,6 @@ tasks.withType(Test) { dependencies { implementation project(':core:menudrawer') - implementation project(':core:pulltorefresh') implementation project(':core:library') implementation project(':core:domain') implementation project(':core:subsonic-api') diff --git a/ultrasonic/src/main/assets/html/fr/index.html b/ultrasonic/src/main/assets/html/fr/index.html index 0fc3ee9c..81334bf9 100644 --- a/ultrasonic/src/main/assets/html/fr/index.html +++ b/ultrasonic/src/main/assets/html/fr/index.html @@ -33,7 +33,7 @@

  • Écoute et téléchargement illimités vers autant de iPhones et d'appareils Android que souhaité.
  • Lecture de vidéos.
  • Une adresse web personnalisée pour votre serveur Subsonic (votrenom.subsonic.org).
  • -
  • Aucunes publicitées; dans l'interface web de Subsonic.
  • +
  • Aucunes publicités dans l'interface web de Subsonic.
  • Accès gratuit aux nouvelles fonctionnalités avancées.
  • diff --git a/ultrasonic/src/main/java/org/moire/ultrasonic/activity/BookmarkActivity.java b/ultrasonic/src/main/java/org/moire/ultrasonic/activity/BookmarkActivity.java index cae4632d..d9a69532 100644 --- a/ultrasonic/src/main/java/org/moire/ultrasonic/activity/BookmarkActivity.java +++ b/ultrasonic/src/main/java/org/moire/ultrasonic/activity/BookmarkActivity.java @@ -27,9 +27,8 @@ import android.widget.AdapterView; import android.widget.ImageView; import android.widget.ListView; -import com.handmark.pulltorefresh.library.PullToRefreshBase; -import com.handmark.pulltorefresh.library.PullToRefreshBase.OnRefreshListener; -import com.handmark.pulltorefresh.library.PullToRefreshListView; +import androidx.swiperefreshlayout.widget.SwipeRefreshLayout; + import org.moire.ultrasonic.R; import org.moire.ultrasonic.domain.MusicDirectory; import org.moire.ultrasonic.domain.MusicDirectory.Entry; @@ -49,7 +48,7 @@ import java.util.List; public class BookmarkActivity extends SubsonicTabActivity { - private PullToRefreshListView refreshAlbumListView; + private SwipeRefreshLayout refreshAlbumListView; private ListView albumListView; private View albumButtons; private View emptyView; @@ -70,13 +69,13 @@ public class BookmarkActivity extends SubsonicTabActivity albumButtons = findViewById(R.id.menu_album); - refreshAlbumListView = (PullToRefreshListView) findViewById(R.id.select_album_entries); - albumListView = refreshAlbumListView.getRefreshableView(); + refreshAlbumListView = findViewById(R.id.select_album_entries_refresh); + albumListView = findViewById(R.id.select_album_entries_list); - refreshAlbumListView.setOnRefreshListener(new OnRefreshListener() + refreshAlbumListView.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() { @Override - public void onRefresh(PullToRefreshBase refreshView) + public void onRefresh() { new GetDataTask().executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); } @@ -472,7 +471,6 @@ public class BookmarkActivity extends SubsonicTabActivity @Override protected void onPostExecute(String[] result) { - refreshAlbumListView.onRefreshComplete(); super.onPostExecute(result); } diff --git a/ultrasonic/src/main/java/org/moire/ultrasonic/activity/ChatActivity.java b/ultrasonic/src/main/java/org/moire/ultrasonic/activity/ChatActivity.java index 2e4bf1c8..e91fc007 100644 --- a/ultrasonic/src/main/java/org/moire/ultrasonic/activity/ChatActivity.java +++ b/ultrasonic/src/main/java/org/moire/ultrasonic/activity/ChatActivity.java @@ -5,6 +5,9 @@ import android.os.Bundle; import android.text.Editable; import android.text.TextWatcher; import android.view.KeyEvent; +import android.view.Menu; +import android.view.MenuInflater; +import android.view.MenuItem; import android.view.View; import android.view.inputmethod.EditorInfo; import android.widget.EditText; @@ -13,10 +16,8 @@ import android.widget.ListAdapter; import android.widget.ListView; import android.widget.TextView; -import com.handmark.pulltorefresh.library.PullToRefreshBase; -import com.handmark.pulltorefresh.library.PullToRefreshBase.Mode; -import com.handmark.pulltorefresh.library.PullToRefreshBase.OnRefreshListener; -import com.handmark.pulltorefresh.library.PullToRefreshListView; +import androidx.swiperefreshlayout.widget.SwipeRefreshLayout; + import org.moire.ultrasonic.R; import org.moire.ultrasonic.domain.ChatMessage; import org.moire.ultrasonic.service.MusicService; @@ -37,7 +38,6 @@ import java.util.TimerTask; */ public final class ChatActivity extends SubsonicTabActivity { - private PullToRefreshListView refreshChatListView; private ListView chatListView; private EditText messageEditText; private ImageButton sendButton; @@ -51,9 +51,6 @@ public final class ChatActivity extends SubsonicTabActivity super.onCreate(bundle); setContentView(R.layout.chat); - refreshChatListView = (PullToRefreshListView) findViewById(R.id.chat_entries); - refreshChatListView.setMode(Mode.PULL_FROM_END); - messageEditText = (EditText) findViewById(R.id.chat_edittext); sendButton = (ImageButton) findViewById(R.id.chat_send); @@ -67,7 +64,7 @@ public final class ChatActivity extends SubsonicTabActivity } }); - chatListView = refreshChatListView.getRefreshableView(); + chatListView = findViewById(R.id.chat_entries_list); chatListView.setTranscriptMode(ListView.TRANSCRIPT_MODE_ALWAYS_SCROLL); chatListView.setStackFromBottom(true); @@ -114,15 +111,6 @@ public final class ChatActivity extends SubsonicTabActivity } }); - refreshChatListView.setOnRefreshListener(new OnRefreshListener() - { - @Override - public void onRefresh(PullToRefreshBase refreshView) - { - new GetDataTask().executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); - } - }); - View chatMenuItem = findViewById(R.id.menu_chat); menuDrawer.setActiveView(chatMenuItem); @@ -137,6 +125,33 @@ public final class ChatActivity extends SubsonicTabActivity timerMethod(); } + @Override + public boolean onCreateOptionsMenu(Menu menu) + { + MenuInflater inflater = getMenuInflater(); + inflater.inflate(R.menu.chat, menu); + super.onCreateOptionsMenu(menu); + + return true; + } + + /* + * Listen for option item selections so that we receive a notification + * when the user requests a refresh by selecting the refresh action bar item. + */ + @Override + public boolean onOptionsItemSelected(MenuItem item) { + switch (item.getItemId()) { + // Check if user triggered a refresh: + case R.id.menu_refresh: + // Start the refresh background task. + new GetDataTask().executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); + return true; + } + // User didn't trigger a refresh, let the superclass handle this action + return super.onOptionsItemSelected(item); + } + @Override protected void onResume() { @@ -276,7 +291,6 @@ public final class ChatActivity extends SubsonicTabActivity protected void onPostExecute(String[] result) { load(); - refreshChatListView.onRefreshComplete(); super.onPostExecute(result); } @@ -286,4 +300,4 @@ public final class ChatActivity extends SubsonicTabActivity return null; } } -} \ No newline at end of file +} diff --git a/ultrasonic/src/main/java/org/moire/ultrasonic/activity/SelectAlbumActivity.java b/ultrasonic/src/main/java/org/moire/ultrasonic/activity/SelectAlbumActivity.java index a96159a2..769e7e0c 100644 --- a/ultrasonic/src/main/java/org/moire/ultrasonic/activity/SelectAlbumActivity.java +++ b/ultrasonic/src/main/java/org/moire/ultrasonic/activity/SelectAlbumActivity.java @@ -27,14 +27,12 @@ import android.view.Menu; import android.view.MenuInflater; import android.view.MenuItem; import android.view.View; -import android.widget.AbsListView; import android.widget.AdapterView; import android.widget.ImageView; import android.widget.ListView; import android.widget.TextView; -import com.handmark.pulltorefresh.library.PullToRefreshBase; -import com.handmark.pulltorefresh.library.PullToRefreshListView; +import androidx.swiperefreshlayout.widget.SwipeRefreshLayout; import org.moire.ultrasonic.R; import org.moire.ultrasonic.domain.MusicDirectory; @@ -60,13 +58,11 @@ import java.util.LinkedList; import java.util.List; import java.util.Random; -import static com.handmark.pulltorefresh.library.PullToRefreshBase.OnRefreshListener; - public class SelectAlbumActivity extends SubsonicTabActivity { public static final String allSongsId = "-1"; - private PullToRefreshListView refreshAlbumListView; + private SwipeRefreshLayout refreshAlbumListView; private ListView albumListView; private View header; private View albumButtons; @@ -91,50 +87,23 @@ public class SelectAlbumActivity extends SubsonicTabActivity * Called when the activity is first created. */ @Override - public void onCreate(Bundle savedInstanceState) - { + public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.select_album); albumButtons = findViewById(R.id.menu_album); - refreshAlbumListView = (PullToRefreshListView) findViewById(R.id.select_album_entries); - albumListView = refreshAlbumListView.getRefreshableView(); + refreshAlbumListView = findViewById(R.id.select_album_entries_refresh); + albumListView = findViewById(R.id.select_album_entries_list); - refreshAlbumListView.setOnRefreshListener(new OnRefreshListener() + refreshAlbumListView.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() { @Override - public void onRefresh(PullToRefreshBase refreshView) - { + public void onRefresh() { new GetDataTask().executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); } }); - refreshAlbumListView.setOnScrollListener(new AbsListView.OnScrollListener() { - @Override - public void onScrollStateChanged(AbsListView view, int scrollState) { - for (int i=0;i() + refreshArtistListView.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() { @Override - public void onRefresh(PullToRefreshBase refreshView) + public void onRefresh() { new GetDataTask().executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); } @@ -347,7 +346,6 @@ public class SelectArtistActivity extends SubsonicTabActivity implements Adapter @Override protected void onPostExecute(String[] result) { - refreshArtistListView.onRefreshComplete(); super.onPostExecute(result); } @@ -358,4 +356,4 @@ public class SelectArtistActivity extends SubsonicTabActivity implements Adapter return null; } } -} \ No newline at end of file +} diff --git a/ultrasonic/src/main/java/org/moire/ultrasonic/activity/SelectGenreActivity.java b/ultrasonic/src/main/java/org/moire/ultrasonic/activity/SelectGenreActivity.java index aa038463..996edd6d 100644 --- a/ultrasonic/src/main/java/org/moire/ultrasonic/activity/SelectGenreActivity.java +++ b/ultrasonic/src/main/java/org/moire/ultrasonic/activity/SelectGenreActivity.java @@ -29,9 +29,8 @@ import android.view.View; import android.widget.AdapterView; import android.widget.ListView; -import com.handmark.pulltorefresh.library.PullToRefreshBase; -import com.handmark.pulltorefresh.library.PullToRefreshBase.OnRefreshListener; -import com.handmark.pulltorefresh.library.PullToRefreshListView; +import androidx.swiperefreshlayout.widget.SwipeRefreshLayout; + import org.moire.ultrasonic.R; import org.moire.ultrasonic.domain.Genre; import org.moire.ultrasonic.service.MusicService; @@ -50,7 +49,7 @@ public class SelectGenreActivity extends SubsonicTabActivity implements AdapterV private static final String TAG = SelectGenreActivity.class.getSimpleName(); - private PullToRefreshListView refreshGenreListView; + private SwipeRefreshLayout refreshGenreListView; private ListView genreListView; private View emptyView; @@ -63,13 +62,13 @@ public class SelectGenreActivity extends SubsonicTabActivity implements AdapterV super.onCreate(savedInstanceState); setContentView(R.layout.select_genre); - refreshGenreListView = (PullToRefreshListView) findViewById(R.id.select_genre_list); - genreListView = refreshGenreListView.getRefreshableView(); + refreshGenreListView = findViewById(R.id.select_genre_refresh); + genreListView = findViewById(R.id.select_genre_list); - refreshGenreListView.setOnRefreshListener(new OnRefreshListener() + refreshGenreListView.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() { @Override - public void onRefresh(PullToRefreshBase refreshView) + public void onRefresh() { new GetDataTask().executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); } @@ -181,7 +180,6 @@ public class SelectGenreActivity extends SubsonicTabActivity implements AdapterV @Override protected void onPostExecute(String[] result) { - refreshGenreListView.onRefreshComplete(); super.onPostExecute(result); } @@ -192,4 +190,4 @@ public class SelectGenreActivity extends SubsonicTabActivity implements AdapterV return null; } } -} \ No newline at end of file +} diff --git a/ultrasonic/src/main/java/org/moire/ultrasonic/activity/SelectPlaylistActivity.java b/ultrasonic/src/main/java/org/moire/ultrasonic/activity/SelectPlaylistActivity.java index 0ba31f04..eeeccd2d 100644 --- a/ultrasonic/src/main/java/org/moire/ultrasonic/activity/SelectPlaylistActivity.java +++ b/ultrasonic/src/main/java/org/moire/ultrasonic/activity/SelectPlaylistActivity.java @@ -40,9 +40,7 @@ import android.widget.EditText; import android.widget.ListView; import android.widget.TextView; -import com.handmark.pulltorefresh.library.PullToRefreshBase; -import com.handmark.pulltorefresh.library.PullToRefreshBase.OnRefreshListener; -import com.handmark.pulltorefresh.library.PullToRefreshListView; +import androidx.swiperefreshlayout.widget.SwipeRefreshLayout; import org.moire.ultrasonic.R; import org.moire.ultrasonic.api.subsonic.ApiNotSupportedException; @@ -63,7 +61,7 @@ import java.util.List; public class SelectPlaylistActivity extends SubsonicTabActivity implements AdapterView.OnItemClickListener { - private PullToRefreshListView refreshPlaylistsListView; + private SwipeRefreshLayout refreshPlaylistsListView; private ListView playlistsListView; private View emptyTextView; private PlaylistAdapter playlistAdapter; @@ -74,13 +72,13 @@ public class SelectPlaylistActivity extends SubsonicTabActivity implements Adapt super.onCreate(savedInstanceState); setContentView(R.layout.select_playlist); - refreshPlaylistsListView = (PullToRefreshListView) findViewById(R.id.select_playlist_list); - playlistsListView = refreshPlaylistsListView.getRefreshableView(); + refreshPlaylistsListView = findViewById(R.id.select_playlist_refresh); + playlistsListView = findViewById(R.id.select_playlist_list); - refreshPlaylistsListView.setOnRefreshListener(new OnRefreshListener() + refreshPlaylistsListView.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() { @Override - public void onRefresh(PullToRefreshBase refreshView) + public void onRefresh() { new GetDataTask().executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); } @@ -379,7 +377,6 @@ public class SelectPlaylistActivity extends SubsonicTabActivity implements Adapt @Override protected void onPostExecute(String[] result) { - refreshPlaylistsListView.onRefreshComplete(); super.onPostExecute(result); } diff --git a/ultrasonic/src/main/java/org/moire/ultrasonic/activity/ShareActivity.java b/ultrasonic/src/main/java/org/moire/ultrasonic/activity/ShareActivity.java index d7a2d237..9e012dd6 100644 --- a/ultrasonic/src/main/java/org/moire/ultrasonic/activity/ShareActivity.java +++ b/ultrasonic/src/main/java/org/moire/ultrasonic/activity/ShareActivity.java @@ -41,9 +41,7 @@ import android.widget.EditText; import android.widget.ListView; import android.widget.TextView; -import com.handmark.pulltorefresh.library.PullToRefreshBase; -import com.handmark.pulltorefresh.library.PullToRefreshBase.OnRefreshListener; -import com.handmark.pulltorefresh.library.PullToRefreshListView; +import androidx.swiperefreshlayout.widget.SwipeRefreshLayout; import org.moire.ultrasonic.R; import org.moire.ultrasonic.api.subsonic.ApiNotSupportedException; @@ -65,7 +63,7 @@ import java.util.List; public class ShareActivity extends SubsonicTabActivity implements AdapterView.OnItemClickListener { - private PullToRefreshListView refreshSharesListView; + private SwipeRefreshLayout refreshSharesListView; private ListView sharesListView; private View emptyTextView; private ShareAdapter shareAdapter; @@ -76,13 +74,13 @@ public class ShareActivity extends SubsonicTabActivity implements AdapterView.On super.onCreate(savedInstanceState); setContentView(R.layout.select_share); - refreshSharesListView = (PullToRefreshListView) findViewById(R.id.select_share_list); - sharesListView = refreshSharesListView.getRefreshableView(); + refreshSharesListView = findViewById(R.id.select_share_refresh); + sharesListView = findViewById(R.id.select_share_list); - refreshSharesListView.setOnRefreshListener(new OnRefreshListener() + refreshSharesListView.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() { @Override - public void onRefresh(PullToRefreshBase refreshView) + public void onRefresh() { new GetDataTask().executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); } @@ -374,7 +372,6 @@ public class ShareActivity extends SubsonicTabActivity implements AdapterView.On @Override protected void onPostExecute(String[] result) { - refreshSharesListView.onRefreshComplete(); super.onPostExecute(result); } @@ -385,4 +382,4 @@ public class ShareActivity extends SubsonicTabActivity implements AdapterView.On return null; } } -} \ No newline at end of file +} diff --git a/ultrasonic/src/main/res/drawable-hdpi/ic_menu_refresh_dark.png b/ultrasonic/src/main/res/drawable-hdpi/ic_menu_refresh_dark.png new file mode 100644 index 00000000..6cae3eca Binary files /dev/null and b/ultrasonic/src/main/res/drawable-hdpi/ic_menu_refresh_dark.png differ diff --git a/ultrasonic/src/main/res/drawable-hdpi/ic_menu_refresh_light.png b/ultrasonic/src/main/res/drawable-hdpi/ic_menu_refresh_light.png new file mode 100644 index 00000000..3a8c89e8 Binary files /dev/null and b/ultrasonic/src/main/res/drawable-hdpi/ic_menu_refresh_light.png differ diff --git a/ultrasonic/src/main/res/drawable-mdpi/ic_menu_refresh_dark.png b/ultrasonic/src/main/res/drawable-mdpi/ic_menu_refresh_dark.png new file mode 100644 index 00000000..50c5f22f Binary files /dev/null and b/ultrasonic/src/main/res/drawable-mdpi/ic_menu_refresh_dark.png differ diff --git a/ultrasonic/src/main/res/drawable-mdpi/ic_menu_refresh_light.png b/ultrasonic/src/main/res/drawable-mdpi/ic_menu_refresh_light.png new file mode 100644 index 00000000..060433d3 Binary files /dev/null and b/ultrasonic/src/main/res/drawable-mdpi/ic_menu_refresh_light.png differ diff --git a/ultrasonic/src/main/res/drawable-xhdpi/ic_menu_refresh_dark.png b/ultrasonic/src/main/res/drawable-xhdpi/ic_menu_refresh_dark.png new file mode 100644 index 00000000..415da26a Binary files /dev/null and b/ultrasonic/src/main/res/drawable-xhdpi/ic_menu_refresh_dark.png differ diff --git a/ultrasonic/src/main/res/drawable-xhdpi/ic_menu_refresh_light.png b/ultrasonic/src/main/res/drawable-xhdpi/ic_menu_refresh_light.png new file mode 100644 index 00000000..1e933514 Binary files /dev/null and b/ultrasonic/src/main/res/drawable-xhdpi/ic_menu_refresh_light.png differ diff --git a/ultrasonic/src/main/res/drawable-xxhdpi/ic_menu_refresh_dark.png b/ultrasonic/src/main/res/drawable-xxhdpi/ic_menu_refresh_dark.png new file mode 100644 index 00000000..c00e8404 Binary files /dev/null and b/ultrasonic/src/main/res/drawable-xxhdpi/ic_menu_refresh_dark.png differ diff --git a/ultrasonic/src/main/res/drawable-xxhdpi/ic_menu_refresh_light.png b/ultrasonic/src/main/res/drawable-xxhdpi/ic_menu_refresh_light.png new file mode 100644 index 00000000..0c7fa340 Binary files /dev/null and b/ultrasonic/src/main/res/drawable-xxhdpi/ic_menu_refresh_light.png differ diff --git a/ultrasonic/src/main/res/drawable-xxxhdpi/ic_menu_refresh_dark.png b/ultrasonic/src/main/res/drawable-xxxhdpi/ic_menu_refresh_dark.png new file mode 100644 index 00000000..3461b2a7 Binary files /dev/null and b/ultrasonic/src/main/res/drawable-xxxhdpi/ic_menu_refresh_dark.png differ diff --git a/ultrasonic/src/main/res/drawable-xxxhdpi/ic_menu_refresh_light.png b/ultrasonic/src/main/res/drawable-xxxhdpi/ic_menu_refresh_light.png new file mode 100644 index 00000000..a5c09db5 Binary files /dev/null and b/ultrasonic/src/main/res/drawable-xxxhdpi/ic_menu_refresh_light.png differ diff --git a/ultrasonic/src/main/res/layout/chat.xml b/ultrasonic/src/main/res/layout/chat.xml index 8b8ea719..55304ad2 100644 --- a/ultrasonic/src/main/res/layout/chat.xml +++ b/ultrasonic/src/main/res/layout/chat.xml @@ -6,16 +6,16 @@ - - - + + + @@ -32,20 +32,20 @@ a:layout_weight="1" a:autoLink="all" a:hint="@string/chat.send_a_message" - a:inputType="textEmailAddress|textMultiLine" + a:inputType="textEmailAddress|textMultiLine" a:linksClickable="true" a:paddingBottom="10dip" a:paddingTop="10dip" /> - + - + - \ No newline at end of file + diff --git a/ultrasonic/src/main/res/layout/select_album.xml b/ultrasonic/src/main/res/layout/select_album.xml index 1a527ee9..5a037202 100644 --- a/ultrasonic/src/main/res/layout/select_album.xml +++ b/ultrasonic/src/main/res/layout/select_album.xml @@ -19,16 +19,22 @@ a:text="@string/select_album.empty" a:visibility="gone" /> - + + + + + - \ No newline at end of file + diff --git a/ultrasonic/src/main/res/layout/select_artist.xml b/ultrasonic/src/main/res/layout/select_artist.xml index 50fb304f..43a1a8ae 100644 --- a/ultrasonic/src/main/res/layout/select_artist.xml +++ b/ultrasonic/src/main/res/layout/select_artist.xml @@ -6,14 +6,20 @@ - + + + + + - \ No newline at end of file + diff --git a/ultrasonic/src/main/res/layout/select_genre.xml b/ultrasonic/src/main/res/layout/select_genre.xml index 57ff820d..ccfb8797 100644 --- a/ultrasonic/src/main/res/layout/select_genre.xml +++ b/ultrasonic/src/main/res/layout/select_genre.xml @@ -14,14 +14,20 @@ a:text="@string/select_genre.empty" a:visibility="gone" /> - + + + + + - \ No newline at end of file + diff --git a/ultrasonic/src/main/res/layout/select_playlist.xml b/ultrasonic/src/main/res/layout/select_playlist.xml index aefcc934..e7176513 100644 --- a/ultrasonic/src/main/res/layout/select_playlist.xml +++ b/ultrasonic/src/main/res/layout/select_playlist.xml @@ -14,14 +14,20 @@ a:text="@string/select_playlist.empty" a:visibility="gone" /> - + + + + + - \ No newline at end of file + diff --git a/ultrasonic/src/main/res/layout/select_share.xml b/ultrasonic/src/main/res/layout/select_share.xml index 7b0641c9..66a07823 100644 --- a/ultrasonic/src/main/res/layout/select_share.xml +++ b/ultrasonic/src/main/res/layout/select_share.xml @@ -1,8 +1,8 @@ + a:layout_width="fill_parent" + a:layout_height="fill_parent" + a:orientation="vertical"> @@ -14,14 +14,21 @@ a:text="@string/select_share.empty" a:visibility="gone" /> - + + + + + + - \ No newline at end of file + diff --git a/ultrasonic/src/main/res/menu/chat.xml b/ultrasonic/src/main/res/menu/chat.xml new file mode 100644 index 00000000..288df21f --- /dev/null +++ b/ultrasonic/src/main/res/menu/chat.xml @@ -0,0 +1,9 @@ + + + + \ No newline at end of file diff --git a/ultrasonic/src/main/res/values-de/strings.xml b/ultrasonic/src/main/res/values-de/strings.xml index 246fbae3..75c7ad43 100644 --- a/ultrasonic/src/main/res/values-de/strings.xml +++ b/ultrasonic/src/main/res/values-de/strings.xml @@ -467,5 +467,6 @@          anstatt einfach Elemente zu markieren / zu entfernen. Funktionseinstellungem + Aktualisierung diff --git a/ultrasonic/src/main/res/values-es/strings.xml b/ultrasonic/src/main/res/values-es/strings.xml index 469b8ef2..7d6b8ba8 100644 --- a/ultrasonic/src/main/res/values-es/strings.xml +++ b/ultrasonic/src/main/res/values-es/strings.xml @@ -470,5 +470,6 @@ en lugar de simplemente destacar / desestimar elementos. Banderas de características + Actualizar diff --git a/ultrasonic/src/main/res/values-fr/strings.xml b/ultrasonic/src/main/res/values-fr/strings.xml index b96db050..6754c260 100644 --- a/ultrasonic/src/main/res/values-fr/strings.xml +++ b/ultrasonic/src/main/res/values-fr/strings.xml @@ -471,5 +471,6 @@ au lieu de simplement mettre en vedette / désactiver les éléments. Drapeaux des fonctionnalités + Rafraichir diff --git a/ultrasonic/src/main/res/values-hu/strings.xml b/ultrasonic/src/main/res/values-hu/strings.xml index 2059fdab..e5ab13a9 100644 --- a/ultrasonic/src/main/res/values-hu/strings.xml +++ b/ultrasonic/src/main/res/values-hu/strings.xml @@ -470,5 +470,6 @@ csillaggal jelölés helyett. Jellemzők Zászlók + Refresh diff --git a/ultrasonic/src/main/res/values-nl/strings.xml b/ultrasonic/src/main/res/values-nl/strings.xml index bc3f5a1d..70fbbe5f 100644 --- a/ultrasonic/src/main/res/values-nl/strings.xml +++ b/ultrasonic/src/main/res/values-nl/strings.xml @@ -470,5 +470,6 @@ in plaats van items simpelweg in de hoofdrol te zetten / niet te verwijderen. Experimentele functies + Refresh diff --git a/ultrasonic/src/main/res/values-pl/strings.xml b/ultrasonic/src/main/res/values-pl/strings.xml index 66f46d2d..06595852 100644 --- a/ultrasonic/src/main/res/values-pl/strings.xml +++ b/ultrasonic/src/main/res/values-pl/strings.xml @@ -483,5 +483,6 @@ Obecnie nie zapisuje obrazów w pamięci urządzenia, tylko wykorzystuje tylko p zamiast po prostu grać gwiazdkami / bez gwiazd. Flagi funkcji + Refresh diff --git a/ultrasonic/src/main/res/values-pt-rBR/strings.xml b/ultrasonic/src/main/res/values-pt-rBR/strings.xml index 2ab07c9f..1f331143 100644 --- a/ultrasonic/src/main/res/values-pt-rBR/strings.xml +++ b/ultrasonic/src/main/res/values-pt-rBR/strings.xml @@ -470,5 +470,6 @@ em vez de simplesmente estrelar / não estrelar itens. Bandeiras de recursos + Refresh diff --git a/ultrasonic/src/main/res/values-pt/strings.xml b/ultrasonic/src/main/res/values-pt/strings.xml index 8e53355d..68199729 100644 --- a/ultrasonic/src/main/res/values-pt/strings.xml +++ b/ultrasonic/src/main/res/values-pt/strings.xml @@ -470,5 +470,6 @@ em vez de simplesmente estrelar / não estrelar itens. Bandeiras de recursos + Refresh diff --git a/ultrasonic/src/main/res/values/strings.xml b/ultrasonic/src/main/res/values/strings.xml index 71c884b6..b5bfb427 100644 --- a/ultrasonic/src/main/res/values/strings.xml +++ b/ultrasonic/src/main/res/values/strings.xml @@ -474,5 +474,6 @@ instead of simply starring/unstarring items. Feature Flags + Refresh diff --git a/ultrasonic/src/main/res/values/styles.xml b/ultrasonic/src/main/res/values/styles.xml index aeae6325..ed9fae4c 100644 --- a/ultrasonic/src/main/res/values/styles.xml +++ b/ultrasonic/src/main/res/values/styles.xml @@ -81,6 +81,7 @@ + diff --git a/ultrasonic/src/main/res/values/themes.xml b/ultrasonic/src/main/res/values/themes.xml index e78d0318..0280d683 100644 --- a/ultrasonic/src/main/res/values/themes.xml +++ b/ultrasonic/src/main/res/values/themes.xml @@ -35,6 +35,7 @@ @drawable/media_shuffle_normal_dark @drawable/media_start_normal_dark @drawable/ic_menu_podcasts_dark + @drawable/ic_menu_refresh_dark @drawable/media_play_next @drawable/ic_stat_play_dark @drawable/media_stop_normal_dark @@ -84,6 +85,7 @@ @drawable/media_shuffle_normal_light @drawable/media_start_normal_light @drawable/ic_menu_podcasts_light + @drawable/ic_menu_refresh_light @drawable/media_play_next @drawable/ic_stat_play_light @drawable/media_stop_normal_light