package com.boardgamegeek.util; import android.content.Context; import android.content.Intent; import android.net.Uri; import android.os.Bundle; import android.os.SystemClock; import android.text.Html; import android.text.Spanned; import android.text.TextUtils; import android.text.method.LinkMovementMethod; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.view.inputmethod.InputMethodManager; import android.webkit.WebView; import android.widget.Chronometer; import android.widget.EditText; import android.widget.TextView; /** * Various static methods for use on views and fragments. */ public class UIUtils { private static final String KEY_DATA = "_uri"; private static final String KEY_ACTION = "_action"; private UIUtils() { } /** * Converts an intent into a {@link Bundle} suitable for use as fragment arguments. */ public static Bundle intentToFragmentArguments(Intent intent) { Bundle arguments = new Bundle(); if (intent == null) { return arguments; } final Uri data = intent.getData(); if (data != null) { arguments.putParcelable(KEY_DATA, data); } final String action = intent.getAction(); if (action != null) { arguments.putString(KEY_ACTION, action); } final Bundle extras = intent.getExtras(); if (extras != null) { arguments.putAll(intent.getExtras()); } return arguments; } /** * Converts a fragment arguments bundle into an intent. */ public static Intent fragmentArgumentsToIntent(Bundle arguments) { Intent intent = new Intent(); if (arguments == null) { return intent; } final Uri data = arguments.getParcelable(KEY_DATA); if (data != null) { intent.setData(data); } final String action = arguments.getString(KEY_ACTION); if (action != null) { intent.setAction(action); } intent.putExtras(arguments); intent.removeExtra(KEY_DATA); intent.removeExtra(KEY_ACTION); return intent; } public static void setActivatedCompat(View view, boolean activated) { view.setActivated(activated); } /** * Populate the given {@link TextView} with the requested text, formatting through {@link Html#fromHtml(String)} * when applicable. Also sets {@link TextView#setMovementMethod} so inline links are handled. */ public static void setTextMaybeHtml(TextView view, String text) { if (TextUtils.isEmpty(text)) { view.setText(""); return; } if ((text.contains("<") && text.contains(">")) || (text.contains("&") && text.contains(";"))) { // Fix up problematic HTML // replace DIVs with BR text = text.replaceAll("[<]div[^>]*[>]", ""); text = text.replaceAll("[<]/div[>]", "<br/>"); // remove all P tags text = text.replaceAll("[<](/)?p[>]", ""); // remove trailing BRs text = text.replaceAll("(<br\\s?/>)+$", ""); // replace 3+ BRs with a double text = text.replaceAll("(<br\\s?/>){3,}", "<br/><br/>"); // use BRs instead of new line character text = text.replaceAll("\n", "<br/>"); text = fixInternalLinks(text); Spanned spanned = Html.fromHtml(text); view.setText(spanned); view.setMovementMethod(LinkMovementMethod.getInstance()); } else { view.setText(text); } } public static void setWebViewText(WebView view, String text) { view.loadDataWithBaseURL(null, fixInternalLinks(text), "text/html", "UTF-8", null); } private static String fixInternalLinks(String text) { // ensure internal, path-only links are complete with the hostname if (TextUtils.isEmpty(text)) return ""; String fixedText = text.replaceAll("<a\\s+href=\"/", "<a href=\"https://www.boardgamegeek.com/"); fixedText = fixedText.replaceAll("<img\\s+src=\"//", "<img src=\"https://"); return fixedText; } public static void startTimerWithSystemTime(Chronometer timer, long time) { timer.setBase(time - System.currentTimeMillis() + SystemClock.elapsedRealtime()); timer.start(); } public static void finishingEditing(EditText editText) { editText.setSelection(0, editText.getText().length()); editText.requestFocus(); ((InputMethodManager) editText.getContext().getSystemService(Context.INPUT_METHOD_SERVICE)) .showSoftInput(editText, InputMethodManager.SHOW_IMPLICIT); } public static void showMenuItem(Menu menu, int itemId, boolean visible) { MenuItem menuItem = menu.findItem(itemId); if (menuItem == null) return; menuItem.setVisible(visible); } public static void enableMenuItem(Menu menu, int itemId, boolean enabled) { MenuItem menuItem = menu.findItem(itemId); if (menuItem == null) return; menuItem.setEnabled(enabled); } public static void checkMenuItem(Menu menu, int itemId) { MenuItem menuItem = menu.findItem(itemId); if (menuItem == null) return; menuItem.setChecked(true); } }