package org.wordpress.android.ui.stats; import android.app.Activity; import android.text.TextUtils; 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.JSONObject; import org.wordpress.android.R; import org.wordpress.android.WordPress; import org.wordpress.android.networking.RestClientUtils; import org.wordpress.android.ui.stats.datasets.StatsTable; import org.wordpress.android.ui.stats.models.ReferrerGroupModel; import org.wordpress.android.ui.stats.service.StatsService; import org.wordpress.android.util.AppLog; import org.wordpress.android.util.ToastUtils; import org.wordpress.android.util.UrlUtils; import java.lang.ref.WeakReference; import java.util.Locale; class ReferrerSpamHelper { private final WeakReference<Activity> mActivityRef; public ReferrerSpamHelper(Activity activity) { mActivityRef = new WeakReference<>(activity); } // return the domain of the passed ReferrerGroupModel or null. private static String getDomain(ReferrerGroupModel group) { // Use the URL value given in the JSON response, or use the groupID that doesn't contain the schema. final String spamDomain = group.getUrl() != null ? group.getUrl() : "http://" + group.getGroupId(); return UrlUtils.isValidUrlAndHostNotNull(spamDomain) ? UrlUtils.getHost(spamDomain) : null; } public static boolean isSpamActionAvailable(ReferrerGroupModel group) { String domain = getDomain(group); return !TextUtils.isEmpty(domain) && !domain.equals("wordpress.com"); } public void showPopup(View anchor, final ReferrerGroupModel referrerGroup) { if (mActivityRef.get() == null || mActivityRef.get().isFinishing()) { return; } final PopupMenu popup = new PopupMenu(mActivityRef.get(), anchor); final MenuItem menuItem; if (referrerGroup.isRestCallInProgress) { menuItem = popup.getMenu().add( referrerGroup.isMarkedAsSpam ? mActivityRef.get().getString(R.string.stats_referrers_marking_not_spam) : mActivityRef.get().getString(R.string.stats_referrers_marking_spam) ); } else { menuItem = popup.getMenu().add( referrerGroup.isMarkedAsSpam ? mActivityRef.get().getString(R.string.stats_referrers_unspam) : mActivityRef.get().getString(R.string.stats_referrers_spam) ); } menuItem.setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() { @Override public boolean onMenuItemClick(MenuItem item) { item.setTitle( referrerGroup.isMarkedAsSpam ? mActivityRef.get().getString(R.string.stats_referrers_marking_not_spam) : mActivityRef.get().getString(R.string.stats_referrers_marking_spam) ); item.setOnMenuItemClickListener(null); final RestClientUtils restClientUtils = WordPress.getRestClientUtilsV1_1(); final String restPath; final boolean isMarkingAsSpamInProgress; if (referrerGroup.isMarkedAsSpam) { restPath = String.format(Locale.US, "/sites/%s/stats/referrers/spam/delete/?domain=%s", referrerGroup.getBlogId(), getDomain(referrerGroup)); isMarkingAsSpamInProgress = false; } else { restPath = String.format(Locale.US, "/sites/%s/stats/referrers/spam/new/?domain=%s", referrerGroup.getBlogId(), getDomain(referrerGroup)); isMarkingAsSpamInProgress = true; } referrerGroup.isRestCallInProgress = true; ReferrerSpamRestListener vListener = new ReferrerSpamRestListener(mActivityRef.get(), referrerGroup, isMarkingAsSpamInProgress); restClientUtils.post(restPath, vListener, vListener); AppLog.d(AppLog.T.STATS, "Enqueuing the following REST request " + restPath); return true; } }); popup.show(); } private class ReferrerSpamRestListener implements RestRequest.Listener, RestRequest.ErrorListener { private final WeakReference<Activity> mActivityRef; private final ReferrerGroupModel mReferrerGroup; private final boolean isMarkingAsSpamInProgress; public ReferrerSpamRestListener(Activity activity, final ReferrerGroupModel referrerGroup, final boolean isMarkingAsSpamInProgress) { this.mActivityRef = new WeakReference<>(activity); this.mReferrerGroup = referrerGroup; this.isMarkingAsSpamInProgress = isMarkingAsSpamInProgress; } @Override public void onResponse(final JSONObject response) { if (mActivityRef.get() == null || mActivityRef.get().isFinishing()) { return; } mReferrerGroup.isRestCallInProgress = false; if (response!= null) { boolean success = response.optBoolean("success"); if (success) { mReferrerGroup.isMarkedAsSpam = isMarkingAsSpamInProgress; StatsTable.deleteStatsForBlog(mActivityRef.get(), mReferrerGroup.getBlogId(), StatsService.StatsEndpointsEnum.REFERRERS); } else { // It's not a success. Something went wrong on the server String errorMessage = null; if (response.has("error")) { errorMessage = response.optString("message"); } if (TextUtils.isEmpty(errorMessage)) { errorMessage = mActivityRef.get().getString(R.string.stats_referrers_spam_generic_error); } ToastUtils.showToast(mActivityRef.get(), errorMessage, ToastUtils.Duration.LONG); } } } @Override public void onErrorResponse(final VolleyError volleyError) { if (volleyError != null) { AppLog.e(AppLog.T.STATS, "Error while marking the referrer " + getDomain(mReferrerGroup) + " as " + (isMarkingAsSpamInProgress ? " spam " : " unspam ") + volleyError.getMessage(), volleyError); } if (mActivityRef.get() == null || mActivityRef.get().isFinishing()) { return; } mReferrerGroup.isRestCallInProgress = false; ToastUtils.showToast(mActivityRef.get(), mActivityRef.get().getString(R.string.stats_referrers_spam_generic_error), ToastUtils.Duration.LONG); } } }