diff options
Diffstat (limited to 'WordPress/src/main/java/org/wordpress/android/ui/stats/FollowHelper.java')
-rw-r--r-- | WordPress/src/main/java/org/wordpress/android/ui/stats/FollowHelper.java | 118 |
1 files changed, 118 insertions, 0 deletions
diff --git a/WordPress/src/main/java/org/wordpress/android/ui/stats/FollowHelper.java b/WordPress/src/main/java/org/wordpress/android/ui/stats/FollowHelper.java new file mode 100644 index 000000000..cb6c20cd5 --- /dev/null +++ b/WordPress/src/main/java/org/wordpress/android/ui/stats/FollowHelper.java @@ -0,0 +1,118 @@ +package org.wordpress.android.ui.stats; + +import android.app.Activity; +import android.view.MenuItem; +import android.view.View; +import android.widget.PopupMenu; + +import com.android.volley.VolleyError; +import com.wordpress.rest.RestRequest; + +import org.json.JSONException; +import org.json.JSONObject; +import org.wordpress.android.R; +import org.wordpress.android.WordPress; +import org.wordpress.android.networking.RestClientUtils; +import org.wordpress.android.ui.stats.models.FollowDataModel; +import org.wordpress.android.util.AppLog; +import org.wordpress.android.util.ToastUtils; + +import java.lang.ref.WeakReference; + +class FollowHelper { + + private final WeakReference<Activity> mActivityRef; + + public FollowHelper(Activity activity) { + mActivityRef = new WeakReference<>(activity); + } + + + public void showPopup(View anchor, final FollowDataModel followData) { + if (mActivityRef.get() == null || mActivityRef.get().isFinishing()) { + return; + } + + final String workingText = followData.getFollowingText(); + final String followText = followData.getFollowText(); + final String unfollowText = followData.getFollowingHoverText(); + + final PopupMenu popup = new PopupMenu(mActivityRef.get(), anchor); + final MenuItem menuItem; + + if (followData.isRestCallInProgress) { + menuItem = popup.getMenu().add(workingText); + } else { + menuItem = popup.getMenu().add(followData.isFollowing() ? unfollowText : followText); + } + + menuItem.setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() { + @Override + public boolean onMenuItemClick(MenuItem item) { + item.setTitle(workingText); + item.setOnMenuItemClickListener(null); + + final RestClientUtils restClientUtils = WordPress.getRestClientUtils(); + final String restPath; + if (!followData.isFollowing()) { + restPath = String.format("/sites/%s/follows/new", followData.getSiteID()); + } else { + restPath = String.format("/sites/%s/follows/mine/delete", followData.getSiteID()); + } + + followData.isRestCallInProgress = true; + FollowRestListener vListener = new FollowRestListener(mActivityRef.get(), followData); + restClientUtils.post(restPath, vListener, vListener); + AppLog.d(AppLog.T.STATS, "Enqueuing the following REST request " + restPath); + return true; + } + }); + + popup.show(); + + } + + + private class FollowRestListener implements RestRequest.Listener, RestRequest.ErrorListener { + private final WeakReference<Activity> mActivityRef; + private final FollowDataModel mFollowData; + + public FollowRestListener(Activity activity, final FollowDataModel followData) { + this.mActivityRef = new WeakReference<>(activity); + this.mFollowData = followData; + } + + @Override + public void onResponse(final JSONObject response) { + if (mActivityRef.get() == null || mActivityRef.get().isFinishing()) { + return; + } + + mFollowData.isRestCallInProgress = false; + if (response!= null) { + try { + boolean isFollowing = response.getBoolean("is_following"); + mFollowData.setIsFollowing(isFollowing); + } catch (JSONException e) { + e.printStackTrace(); + } + } + } + + @Override + public void onErrorResponse(final VolleyError volleyError) { + if (volleyError != null) { + AppLog.e(AppLog.T.STATS, "Error while following a blog " + + volleyError.getMessage(), volleyError); + } + if (mActivityRef.get() == null || mActivityRef.get().isFinishing()) { + return; + } + + mFollowData.isRestCallInProgress = false; + ToastUtils.showToast(mActivityRef.get(), + mActivityRef.get().getString(R.string.reader_toast_err_follow_blog), + ToastUtils.Duration.LONG); + } + } +} |