improved user profile screen link highlighting

This commit is contained in:
Mariotaku Lee 2017-03-27 22:10:42 +08:00
parent 8883fbbcc4
commit d58337ab79
No known key found for this signature in database
GPG Key ID: 15C10F89D7C33535
3 changed files with 28 additions and 19 deletions

View File

@ -56,6 +56,7 @@ import android.support.v7.app.AlertDialog
import android.support.v7.app.AppCompatActivity import android.support.v7.app.AppCompatActivity
import android.support.v7.widget.Toolbar import android.support.v7.widget.Toolbar
import android.text.SpannableStringBuilder import android.text.SpannableStringBuilder
import android.text.Spanned
import android.text.TextUtils import android.text.TextUtils
import android.text.util.Linkify import android.text.util.Linkify
import android.util.SparseBooleanArray import android.util.SparseBooleanArray
@ -122,6 +123,7 @@ import org.mariotaku.twidere.model.event.TaskStateChangedEvent
import org.mariotaku.twidere.model.util.* import org.mariotaku.twidere.model.util.*
import org.mariotaku.twidere.provider.TwidereDataStore.CachedRelationships import org.mariotaku.twidere.provider.TwidereDataStore.CachedRelationships
import org.mariotaku.twidere.provider.TwidereDataStore.CachedUsers import org.mariotaku.twidere.provider.TwidereDataStore.CachedUsers
import org.mariotaku.twidere.text.TwidereURLSpan
import org.mariotaku.twidere.util.* import org.mariotaku.twidere.util.*
import org.mariotaku.twidere.util.InternalTwitterContentUtils.getBestBannerUrl import org.mariotaku.twidere.util.InternalTwitterContentUtils.getBestBannerUrl
import org.mariotaku.twidere.util.KeyboardShortcutsHandler.KeyboardShortcutCallback import org.mariotaku.twidere.util.KeyboardShortcutsHandler.KeyboardShortcutCallback
@ -461,7 +463,11 @@ class UserFragment : BaseFragment(), OnClickListener, OnLinkClickListener,
this.user = user this.user = user
profileImage.setBorderColor(if (user.color != 0) user.color else Color.WHITE) profileImage.setBorderColor(if (user.color != 0) user.color else Color.WHITE)
profileNameContainer.drawEnd(user.account_color) profileNameContainer.drawEnd(user.account_color)
profileNameContainer.name.text = bidiFormatter.unicodeWrap(if (TextUtils.isEmpty(user.nickname)) user.name else getString(R.string.name_with_nickname, user.name, user.nickname)) profileNameContainer.name.text = bidiFormatter.unicodeWrap(if (user.nickname.isNullOrEmpty()) {
user.name
} else {
getString(R.string.name_with_nickname, user.name, user.nickname)
})
val typeIconRes = Utils.getUserTypeIconRes(user.is_verified, user.is_protected) val typeIconRes = Utils.getUserTypeIconRes(user.is_verified, user.is_protected)
if (typeIconRes != 0) { if (typeIconRes != 0) {
profileType.setImageResource(typeIconRes) profileType.setImageResource(typeIconRes)
@ -471,7 +477,8 @@ class UserFragment : BaseFragment(), OnClickListener, OnLinkClickListener,
profileType.visibility = View.GONE profileType.visibility = View.GONE
} }
profileNameContainer.screenName.text = "@${user.screen_name}" profileNameContainer.screenName.text = "@${user.screen_name}"
val linkify = TwidereLinkify(this) val linkHighlightOption = preferences[linkHighlightOptionKey]
val linkify = TwidereLinkify(this, linkHighlightOption)
if (user.description_unescaped != null) { if (user.description_unescaped != null) {
val text = SpannableStringBuilder.valueOf(user.description_unescaped).apply { val text = SpannableStringBuilder.valueOf(user.description_unescaped).apply {
user.description_spans?.applyTo(this) user.description_spans?.applyTo(this)
@ -484,10 +491,15 @@ class UserFragment : BaseFragment(), OnClickListener, OnLinkClickListener,
} }
descriptionContainer.visibility = if (descriptionContainer.description.empty) View.GONE else View.VISIBLE descriptionContainer.visibility = if (descriptionContainer.description.empty) View.GONE else View.VISIBLE
locationContainer.visibility = if (TextUtils.isEmpty(user.location)) View.GONE else View.VISIBLE
locationContainer.location.text = user.location locationContainer.location.text = user.location
urlContainer.visibility = if (TextUtils.isEmpty(user.url) && TextUtils.isEmpty(user.url_expanded)) View.GONE else View.VISIBLE locationContainer.visibility = if (locationContainer.location.empty) View.GONE else View.VISIBLE
urlContainer.url.text = if (TextUtils.isEmpty(user.url_expanded)) user.url else user.url_expanded urlContainer.url.text = (user.url_expanded?.takeIf(String::isNotEmpty) ?: user.url)?.let {
val ssb = SpannableStringBuilder(it)
ssb.setSpan(TwidereURLSpan(it, highlightStyle = linkHighlightOption), 0, ssb.length,
Spanned.SPAN_EXCLUSIVE_EXCLUSIVE)
return@let ssb
}
urlContainer.visibility = if (urlContainer.url.empty) View.GONE else View.VISIBLE
if (user.created_at >= 0) { if (user.created_at >= 0) {
val createdAt = Utils.formatToLongTimeString(activity, user.created_at) val createdAt = Utils.formatToLongTimeString(activity, user.created_at)
val daysSinceCreation = (System.currentTimeMillis() - user.created_at) / 1000 / 60 / 60 / 24.toFloat() val daysSinceCreation = (System.currentTimeMillis() - user.created_at) / 1000 / 60 / 60 / 24.toFloat()

View File

@ -23,24 +23,22 @@ import android.text.TextPaint
import android.text.style.URLSpan import android.text.style.URLSpan
import android.view.View import android.view.View
import org.mariotaku.ktextension.contains import org.mariotaku.ktextension.contains
import org.mariotaku.twidere.Constants import org.mariotaku.twidere.constant.SharedPreferenceConstants.*
import org.mariotaku.twidere.constant.SharedPreferenceConstants.VALUE_LINK_HIGHLIGHT_OPTION_CODE_HIGHLIGHT
import org.mariotaku.twidere.constant.SharedPreferenceConstants.VALUE_LINK_HIGHLIGHT_OPTION_CODE_UNDERLINE
import org.mariotaku.twidere.model.UserKey import org.mariotaku.twidere.model.UserKey
import org.mariotaku.twidere.util.TwidereLinkify.OnLinkClickListener import org.mariotaku.twidere.util.TwidereLinkify.OnLinkClickListener
class TwidereURLSpan( class TwidereURLSpan(
url: String, url: String,
private val orig: String?, private val orig: String? = null,
private val accountKey: UserKey?, private val accountKey: UserKey? = null,
private val extraId: Long, private val extraId: Long = -1,
private val type: Int, private val type: Int = 0,
private val sensitive: Boolean, private val sensitive: Boolean = false,
private val highlightStyle: Int, private val highlightStyle: Int = VALUE_LINK_HIGHLIGHT_OPTION_CODE_NONE,
private val start: Int, private val start: Int = 0,
private val end: Int, private val end: Int = 0,
private val listener: OnLinkClickListener? private val listener: OnLinkClickListener? = null
) : URLSpan(url), Constants { ) : URLSpan(url) {
override fun onClick(widget: View) { override fun onClick(widget: View) {
listener?.onLinkClick(url, orig, accountKey, extraId, type, sensitive, start, end) listener?.onLinkClick(url, orig, accountKey, extraId, type, sensitive, start, end)

View File

@ -224,7 +224,6 @@
android:id="@+id/url" android:id="@+id/url"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:autoLink="web"
android:ellipsize="end" android:ellipsize="end"
android:maxLines="1" android:maxLines="1"
android:paddingLeft="@dimen/element_spacing_small" android:paddingLeft="@dimen/element_spacing_small"