Skip to content
This repository has been archived by the owner on Jun 7, 2020. It is now read-only.

[NEW] Extract urls from room description and make them clickable #2249

Open
wants to merge 3 commits into
base: develop
Choose a base branch
from
Open
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -1,7 +1,13 @@
package chat.rocket.android.chatdetails.ui

import DrawableHelper
import android.content.Intent
import android.net.Uri
import android.os.Bundle
import android.text.Spannable
import android.text.SpannableStringBuilder
import android.text.style.ClickableSpan
import android.util.Patterns
import android.view.LayoutInflater
import android.view.Menu
import android.view.MenuItem
Expand Down Expand Up @@ -132,7 +138,8 @@ class ChatDetailsFragment : Fragment(), ChatDetailsView {
content_announcement.text =
if (room.announcement.isNullOrEmpty()) getString(R.string.msg_no_announcement) else room.announcement
content_description.text =
if (room.description.isNullOrEmpty()) getString(R.string.msg_no_description) else room.description
if (room.description.isNullOrEmpty()) getString(R.string.msg_no_description)
else getClickableSpan(room.description)
}
}

Expand Down Expand Up @@ -242,4 +249,31 @@ class ChatDetailsFragment : Fragment(), ChatDetailsView {
setupToolbarTitle(getString(R.string.title_channel_details))
}
}

private fun getClickableSpan(description: String): CharSequence {
val spannableContent = SpannableStringBuilder(description)
val clickablePartList = getUrlList(description)
if (clickablePartList != null) {
for (clickablePart in clickablePartList) {
val clickableSpan = object : ClickableSpan() {
override fun onClick(widget: View) {
val intent = Intent(Intent.ACTION_VIEW, Uri.parse(clickablePart))
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

val intent is not being used here.

}
}
val clickablePartStart = description.indexOf(clickablePart)
spannableContent.setSpan(
clickableSpan,
clickablePartStart,
clickablePartStart + clickablePart.length,
Spannable.SPAN_EXCLUSIVE_EXCLUSIVE)
}
}
return spannableContent
}

private fun getUrlList(description: String): List<String>? {
// Extract all urls from the room description and put them in a list.
val urlRegex = Patterns.WEB_URL.toRegex()
return urlRegex.findAll(description).map { it.value }.toList()
}
}