diff --git a/Habitica/build.gradle b/Habitica/build.gradle index cb9531b87..9dc344c90 100644 --- a/Habitica/build.gradle +++ b/Habitica/build.gradle @@ -62,6 +62,8 @@ dependencies { implementation "io.noties.markwon:ext-strikethrough:4.6.2" implementation "io.noties.markwon:image:4.6.2" implementation "io.noties.markwon:recycler:4.6.2" + implementation "io.noties.markwon:linkify:4.6.2" + // IAP Handling / Verification implementation "com.android.billingclient:billing-ktx:4.0.0" diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/FullProfileActivity.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/FullProfileActivity.kt index 6bed0ac96..316608f86 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/FullProfileActivity.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/FullProfileActivity.kt @@ -3,6 +3,7 @@ package com.habitrpg.android.habitica.ui.activities import android.content.Context import android.graphics.Typeface import android.os.Bundle +import android.text.method.LinkMovementMethod import android.view.* import android.widget.* import androidx.core.content.ContextCompat @@ -213,6 +214,7 @@ class FullProfileActivity : BaseActivity() { val blurbText = profile.blurb if (blurbText != null && blurbText.isNotEmpty()) { binding.blurbTextView.setMarkdown(blurbText) + binding.blurbTextView.movementMethod = LinkMovementMethod.getInstance() } user.authentication?.timestamps?.createdAt?.let { binding.joinedView.text = dateFormatter.format(it) } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/adapter/social/ChallengesListViewAdapter.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/adapter/social/ChallengesListViewAdapter.kt index 9f99ed247..6b19ff829 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/adapter/social/ChallengesListViewAdapter.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/adapter/social/ChallengesListViewAdapter.kt @@ -1,5 +1,6 @@ package com.habitrpg.android.habitica.ui.adapter.social +import android.text.method.LinkMovementMethod import android.view.View import android.view.ViewGroup import androidx.recyclerview.widget.RecyclerView @@ -91,6 +92,7 @@ class ChallengesListViewAdapter(private val viewUserChallengesOnly: Boolean, pri binding.challengeName.text = EmojiParser.parseEmojis(challenge.name?.trim { it <= ' ' }) binding.challengeShorttext.text = challenge.summary + binding.challengeShorttext.movementMethod = LinkMovementMethod.getInstance() binding.officialChallengeView.visibility = if (challenge.official) View.VISIBLE else View.GONE diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/guilds/GuildDetailFragment.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/guilds/GuildDetailFragment.kt index 5659932e6..d3d52d89d 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/guilds/GuildDetailFragment.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/guilds/GuildDetailFragment.kt @@ -69,6 +69,7 @@ class GuildDetailFragment : BaseFragment() { viewModel?.getIsMemberData()?.observe(viewLifecycleOwner, { updateMembership(it) }) binding?.guildDescription?.movementMethod = LinkMovementMethod.getInstance() + binding?.guildSummary?.movementMethod = LinkMovementMethod.getInstance() binding?.guildBankIcon?.setImageBitmap(HabiticaIconsHelper.imageOfGem()) binding?.leaveButton?.setOnClickListener { leaveGuild() diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/helpers/MarkdownParser.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/helpers/MarkdownParser.kt index d6d12a31d..a8e5195d9 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/helpers/MarkdownParser.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/helpers/MarkdownParser.kt @@ -7,6 +7,7 @@ import android.net.Uri import android.text.SpannableString import android.text.Spanned import android.text.method.LinkMovementMethod +import android.text.util.Linkify import android.widget.TextView import com.habitrpg.android.habitica.R import com.habitrpg.android.habitica.extensions.handleUrlClicks @@ -21,6 +22,7 @@ import io.noties.markwon.image.ImageSizeResolverDef import io.noties.markwon.image.ImagesPlugin import io.noties.markwon.image.file.FileSchemeHandler import io.noties.markwon.image.network.OkHttpNetworkSchemeHandler +import io.noties.markwon.linkify.LinkifyPlugin import io.noties.markwon.movement.MovementMethodPlugin import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers import io.reactivex.rxjava3.core.Single @@ -42,6 +44,7 @@ object MarkdownParser { ) .usePlugin(this.createImageSizeResolverScaleDpiPlugin(context)) .usePlugin(MovementMethodPlugin.create(LinkMovementMethod.getInstance())) + .usePlugin(LinkifyPlugin.create(Linkify.WEB_URLS)) .build() } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/viewHolders/ChatRecyclerViewHolder.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/viewHolders/ChatRecyclerViewHolder.kt index a8a815a19..001b5e195 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/viewHolders/ChatRecyclerViewHolder.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/viewHolders/ChatRecyclerViewHolder.kt @@ -177,6 +177,7 @@ class ChatRecyclerMessageViewHolder(itemView: View, private var userId: String, itemView.setPadding(16.dpToPx(context), itemView.paddingTop, itemView.paddingRight, itemView.paddingBottom) } + binding.messageText.setParsedMarkdown(chatMessage?.parsedText) if (msg.parsedText == null) { binding.messageText.text = chatMessage?.text diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/viewHolders/tasks/BaseTaskViewHolder.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/viewHolders/tasks/BaseTaskViewHolder.kt index faa4c432e..5ccfa61bf 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/viewHolders/tasks/BaseTaskViewHolder.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/viewHolders/tasks/BaseTaskViewHolder.kt @@ -2,6 +2,7 @@ package com.habitrpg.android.habitica.ui.viewHolders.tasks import android.content.Context import android.text.TextUtils +import android.text.method.LinkMovementMethod import android.view.MotionEvent import android.view.View import android.view.ViewGroup @@ -88,9 +89,8 @@ abstract class BaseTaskViewHolder constructor(itemView: View, var scoreTaskFunc: notesTextView?.setOnClickListener { onTouch(it, null) } errorIconView?.setOnClickListener { errorButtonClicked?.run() } - // Re enable when we find a way to only react when a link is tapped. - // notesTextView.movementMethod = LinkMovementMethod.getInstance() - // titleTextView.movementMethod = LinkMovementMethod.getInstance() + notesTextView?.movementMethod = LinkMovementMethod.getInstance() + titleTextView.movementMethod = LinkMovementMethod.getInstance() expandNotesButton?.setOnClickListener { expandTask() } iconViewChallenge?.setOnClickListener {