Skip to content

Commit 3e93210

Browse files
committed
Move pull to refresh to Utils
1 parent b302b44 commit 3e93210

File tree

4 files changed

+249
-0
lines changed

4 files changed

+249
-0
lines changed

WordPressUtils/build.gradle

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,11 +13,15 @@ apply plugin: 'maven'
1313

1414
repositories {
1515
mavenCentral()
16+
maven { url 'http://wordpress-mobile.github.io/WordPress-Android' }
1617
}
1718

1819
dependencies {
1920
compile 'commons-lang:commons-lang:2.6'
2021
compile 'com.mcxiaoke.volley:library:1.0.+'
22+
compile 'com.github.castorflex.smoothprogressbar:library:0.4.0'
23+
compile 'org.wordpress:pulltorefresh-main:+@aar' // org.wordpress version includes some fixes
24+
compile 'com.android.support:support-v13:19.0.+'
2125
}
2226

2327
android {
Lines changed: 99 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,99 @@
1+
package org.wordpress.android.util.ptr;
2+
3+
import android.animation.AnimatorSet;
4+
import android.animation.ObjectAnimator;
5+
import android.app.Activity;
6+
import android.view.View;
7+
import android.view.ViewGroup;
8+
import android.view.animation.Animation;
9+
10+
import org.wordpress.android.util.R;
11+
12+
import uk.co.senab.actionbarpulltorefresh.library.DefaultHeaderTransformer;
13+
import uk.co.senab.actionbarpulltorefresh.library.sdk.Compat;
14+
15+
public class PullToRefreshHeaderTransformer extends DefaultHeaderTransformer {
16+
private View mHeaderView;
17+
private ViewGroup mContentLayout;
18+
private long mAnimationDuration;
19+
private boolean mShowProgressBarOnly;
20+
private Animation mHeaderOutAnimation;
21+
private OnTopScrollChangedListener mOnTopScrollChangedListener;
22+
23+
public interface OnTopScrollChangedListener {
24+
public void onTopScrollChanged(boolean scrolledOnTop);
25+
}
26+
27+
public void setShowProgressBarOnly(boolean progressBarOnly) {
28+
mShowProgressBarOnly = progressBarOnly;
29+
}
30+
31+
@Override
32+
public void onViewCreated(Activity activity, View headerView) {
33+
super.onViewCreated(activity, headerView);
34+
mHeaderView = headerView;
35+
mContentLayout = (ViewGroup) headerView.findViewById(R.id.ptr_content);
36+
mAnimationDuration = activity.getResources().getInteger(android.R.integer.config_shortAnimTime);
37+
}
38+
39+
@Override
40+
public boolean hideHeaderView() {
41+
mShowProgressBarOnly = false;
42+
return super.hideHeaderView();
43+
}
44+
45+
@Override
46+
public boolean showHeaderView() {
47+
// Workaround to avoid this bug https://github.com/chrisbanes/ActionBar-PullToRefresh/issues/265
48+
// Note, that also remove the alpha animation
49+
resetContentLayoutAlpha();
50+
51+
boolean changeVis = mHeaderView.getVisibility() != View.VISIBLE;
52+
mContentLayout.setVisibility(View.VISIBLE);
53+
if (changeVis) {
54+
mHeaderView.setVisibility(View.VISIBLE);
55+
AnimatorSet animSet = new AnimatorSet();
56+
ObjectAnimator alphaAnim = ObjectAnimator.ofFloat(mHeaderView, "alpha", 0f, 1f);
57+
ObjectAnimator transAnim = ObjectAnimator.ofFloat(mContentLayout, "translationY",
58+
-mContentLayout.getHeight(), 10f);
59+
animSet.playTogether(transAnim, alphaAnim);
60+
animSet.play(alphaAnim);
61+
animSet.setDuration(mAnimationDuration);
62+
animSet.start();
63+
if (mShowProgressBarOnly) {
64+
mContentLayout.setVisibility(View.INVISIBLE);
65+
}
66+
}
67+
return changeVis;
68+
}
69+
70+
@Override
71+
public void onPulled(float percentagePulled) {
72+
super.onPulled(percentagePulled);
73+
}
74+
75+
private void resetContentLayoutAlpha() {
76+
Compat.setAlpha(mContentLayout, 1f);
77+
}
78+
79+
@Override
80+
public void onReset() {
81+
super.onReset();
82+
// Reset the Content Layout
83+
if (mContentLayout != null) {
84+
Compat.setAlpha(mContentLayout, 1f);
85+
mContentLayout.setVisibility(View.VISIBLE);
86+
}
87+
}
88+
89+
@Override
90+
public void onTopScrollChanged(boolean scrolledOnTop) {
91+
if (mOnTopScrollChangedListener != null) {
92+
mOnTopScrollChangedListener.onTopScrollChanged(scrolledOnTop);
93+
}
94+
}
95+
96+
public void setOnTopScrollChangedListener(OnTopScrollChangedListener listener) {
97+
mOnTopScrollChangedListener = listener;
98+
}
99+
}
Lines changed: 142 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,142 @@
1+
package org.wordpress.android.util.ptr;
2+
3+
import android.app.Activity;
4+
import android.content.BroadcastReceiver;
5+
import android.content.Context;
6+
import android.content.Intent;
7+
import android.content.IntentFilter;
8+
import android.content.SharedPreferences;
9+
import android.content.SharedPreferences.Editor;
10+
import android.preference.PreferenceManager;
11+
import android.support.v4.content.LocalBroadcastManager;
12+
import android.view.View;
13+
14+
import org.wordpress.android.util.R;
15+
import org.wordpress.android.util.ToastUtils;
16+
import org.wordpress.android.util.ToastUtils.Duration;
17+
18+
import java.lang.ref.WeakReference;
19+
import java.util.Arrays;
20+
import java.util.HashSet;
21+
import java.util.Set;
22+
23+
import uk.co.senab.actionbarpulltorefresh.library.ActionBarPullToRefresh;
24+
import uk.co.senab.actionbarpulltorefresh.library.ActionBarPullToRefresh.SetupWizard;
25+
import uk.co.senab.actionbarpulltorefresh.library.Options;
26+
import uk.co.senab.actionbarpulltorefresh.library.PullToRefreshLayout;
27+
import uk.co.senab.actionbarpulltorefresh.library.listeners.OnRefreshListener;
28+
import uk.co.senab.actionbarpulltorefresh.library.viewdelegates.ViewDelegate;
29+
30+
public class PullToRefreshHelper implements OnRefreshListener {
31+
public static final String BROADCAST_ACTION_REFRESH_MENU_PRESSED = "REFRESH_MENU_PRESSED";
32+
private static final String REFRESH_BUTTON_HIT_COUNT = "REFRESH_BUTTON_HIT_COUNT";
33+
private static final Set<Integer> TOAST_FREQUENCY = new HashSet<Integer>(Arrays.asList(1, 5, 10, 20, 40, 80, 160,
34+
320, 640));
35+
private PullToRefreshHeaderTransformer mHeaderTransformer;
36+
private PullToRefreshLayout mPullToRefreshLayout;
37+
private RefreshListener mRefreshListener;
38+
private WeakReference<Activity> mActivityRef;
39+
40+
public PullToRefreshHelper(Activity activity, PullToRefreshLayout pullToRefreshLayout, RefreshListener listener) {
41+
init(activity, pullToRefreshLayout, listener, null);
42+
}
43+
44+
public PullToRefreshHelper(Activity activity, PullToRefreshLayout pullToRefreshLayout, RefreshListener listener,
45+
java.lang.Class<?> viewClass) {
46+
init(activity, pullToRefreshLayout, listener, viewClass);
47+
}
48+
49+
public void init(Activity activity, PullToRefreshLayout pullToRefreshLayout, RefreshListener listener,
50+
java.lang.Class<?> viewClass) {
51+
mActivityRef = new WeakReference<Activity>(activity);
52+
mRefreshListener = listener;
53+
mPullToRefreshLayout = pullToRefreshLayout;
54+
mHeaderTransformer = new PullToRefreshHeaderTransformer();
55+
SetupWizard setupWizard = ActionBarPullToRefresh.from(activity).options(Options.create().headerTransformer(
56+
mHeaderTransformer).build()).allChildrenArePullable().listener(this);
57+
if (viewClass != null) {
58+
setupWizard.useViewDelegate(viewClass, new ViewDelegate() {
59+
@Override
60+
public boolean isReadyForPull(View view, float v, float v2) {
61+
return true;
62+
}
63+
}
64+
);
65+
}
66+
setupWizard.setup(mPullToRefreshLayout);
67+
}
68+
69+
public void setRefreshing(boolean refreshing) {
70+
mHeaderTransformer.setShowProgressBarOnly(refreshing);
71+
mPullToRefreshLayout.setRefreshing(refreshing);
72+
}
73+
74+
public boolean isRefreshing() {
75+
return mPullToRefreshLayout.isRefreshing();
76+
}
77+
78+
@Override
79+
public void onRefreshStarted(View view) {
80+
mRefreshListener.onRefreshStarted(view);
81+
}
82+
83+
public interface RefreshListener {
84+
public void onRefreshStarted(View view);
85+
}
86+
87+
public void setEnabled(boolean enabled) {
88+
mPullToRefreshLayout.setEnabled(enabled);
89+
}
90+
91+
public void refreshAction() {
92+
Activity activity = mActivityRef.get();
93+
if (activity == null) {
94+
return;
95+
}
96+
setRefreshing(true);
97+
mRefreshListener.onRefreshStarted(mPullToRefreshLayout);
98+
SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(activity);
99+
int refreshHits = preferences.getInt(REFRESH_BUTTON_HIT_COUNT, 0);
100+
refreshHits += 1;
101+
if (TOAST_FREQUENCY.contains(refreshHits)) {
102+
ToastUtils.showToast(activity, R.string.ptr_tip_message, Duration.LONG);
103+
}
104+
Editor editor = preferences.edit();
105+
editor.putInt(REFRESH_BUTTON_HIT_COUNT, refreshHits);
106+
editor.commit();
107+
}
108+
109+
public void registerReceiver(Context context) {
110+
if (context == null) {
111+
return;
112+
}
113+
IntentFilter filter = new IntentFilter();
114+
filter.addAction(BROADCAST_ACTION_REFRESH_MENU_PRESSED);
115+
LocalBroadcastManager lbm = LocalBroadcastManager.getInstance(context);
116+
lbm.registerReceiver(mReceiver, filter);
117+
}
118+
119+
public void unregisterReceiver(Context context) {
120+
if (context == null) {
121+
return;
122+
}
123+
try {
124+
LocalBroadcastManager lbm = LocalBroadcastManager.getInstance(context);
125+
lbm.unregisterReceiver(mReceiver);
126+
} catch (IllegalArgumentException e) {
127+
// exception occurs if receiver already unregistered (safe to ignore)
128+
}
129+
}
130+
131+
private final BroadcastReceiver mReceiver = new BroadcastReceiver() {
132+
@Override
133+
public void onReceive(Context context, Intent intent) {
134+
if (intent == null || intent.getAction() == null) {
135+
return;
136+
}
137+
if (intent.getAction().equals(BROADCAST_ACTION_REFRESH_MENU_PRESSED)) {
138+
refreshAction();
139+
}
140+
}
141+
};
142+
}
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
<?xml version="1.0" encoding="utf-8"?>
2+
<resources>
3+
<string name="ptr_tip_message">Tip: Pull down to refresh</string>
4+
</resources>

0 commit comments

Comments
 (0)