package org.wikipedia.util;
import android.app.Activity;
import android.content.Context;
import android.net.Uri;
import android.support.annotation.NonNull;
import android.support.annotation.StringRes;
import android.support.design.widget.Snackbar;
import android.support.v4.app.Fragment;
import android.support.v4.content.ContextCompat;
import android.view.Gravity;
import android.view.View;
import android.widget.TextView;
import android.widget.Toast;
import org.wikipedia.R;
import org.wikipedia.main.MainActivity;
import org.wikipedia.page.PageActivity;
import java.util.concurrent.TimeUnit;
import static org.wikipedia.util.UriUtil.visitInExternalBrowser;
public final class FeedbackUtil {
public static final int LENGTH_DEFAULT = (int) TimeUnit.SECONDS.toMillis(5);
private static final int SNACKBAR_MAX_LINES = 5;
private static View.OnLongClickListener TOOLBAR_LONG_CLICK_LISTENER = new View.OnLongClickListener() {
@Override
public boolean onLongClick(View v) {
showToolbarButtonToast(v);
return true;
}
};
public static Snackbar makeSnackbar(Activity activity, CharSequence text, int duration) {
return makeSnackbar(findBestView(activity), text, duration);
}
public static void showError(View containerView, Throwable e) {
ThrowableUtil.AppError error = ThrowableUtil.getAppError(containerView.getContext(), e);
makeSnackbar(containerView, error.getError(), LENGTH_DEFAULT).show();
}
public static void showMessageAsPlainText(Activity activity, CharSequence possibleHtml) {
CharSequence richText = StringUtil.fromHtml(possibleHtml.toString());
showMessage(activity, richText.toString());
}
public static void showMessage(Fragment fragment, @StringRes int text) {
makeSnackbar(fragment.getActivity(), fragment.getString(text), Snackbar.LENGTH_LONG).show();
}
public static void showMessage(Fragment fragment, @NonNull String text) {
makeSnackbar(fragment.getActivity(), text, Snackbar.LENGTH_LONG).show();
}
private static void showMessage(View containerView, CharSequence text, int duration) {
makeSnackbar(containerView, text, duration).show();
}
public static void showMessage(Activity activity, @StringRes int resId) {
showMessage(activity, activity.getString(resId), Snackbar.LENGTH_LONG);
}
public static void showMessage(Activity activity, CharSequence text) {
showMessage(findBestView(activity), text, Snackbar.LENGTH_LONG);
}
public static void showMessage(Activity activity, @StringRes int resId, int duration) {
showMessage(activity, activity.getString(resId), duration);
}
public static void showMessage(Activity activity, CharSequence text, int duration) {
showMessage(findBestView(activity), text, duration);
}
public static void showError(Activity activity, Throwable e) {
showError(findBestView(activity), e);
}
public static void showPrivacyPolicy(Context context) {
visitInExternalBrowser(context, Uri.parse(context.getString(R.string.privacy_policy_url)));
}
/**
* Set message for error popup on a TextView.
* @param textView the TextView or EditText to pop the error message from
* @param error the error message. Use null message to clear.
* @see TextView#setError
* @see <a href='http://stackoverflow.com/questions/14413575/how-to-write-style-to-error-text-of-edittext-in-android'>StackOverflow: How to write style to error text of EditText in Android?</a>
*/
public static void setErrorPopup(TextView textView, String error) {
textView.setError(error);
}
public static void setToolbarButtonLongPressToast(View... views) {
for (View v : views) {
v.setOnLongClickListener(TOOLBAR_LONG_CLICK_LISTENER);
}
}
private static Snackbar makeSnackbar(View view, CharSequence text, int duration) {
Snackbar snackbar = Snackbar.make(view, text, duration);
TextView textView = (TextView) snackbar.getView().findViewById(R.id.snackbar_text);
textView.setMaxLines(SNACKBAR_MAX_LINES);
TextView actionView = (TextView) snackbar.getView().findViewById(R.id.snackbar_action);
actionView.setTextColor(ContextCompat.getColor(view.getContext(), R.color.green50));
return snackbar;
}
private static void showToolbarButtonToast(View view) {
Toast toast = Toast.makeText(view.getContext(), view.getContentDescription(), Toast.LENGTH_SHORT);
int[] location = new int[2];
view.getLocationOnScreen(location);
toast.setGravity(Gravity.TOP | Gravity.START, location[0], location[1]);
toast.show();
}
private static View findBestView(Activity activity) {
if (activity instanceof MainActivity) {
return activity.findViewById(R.id.fragment_main_coordinator);
} else if (activity instanceof PageActivity) {
return activity.findViewById(R.id.page_contents_container);
} else {
return activity.findViewById(android.R.id.content);
}
}
private FeedbackUtil() {
}
}