Followed hashtags view improvements (#4475)
Add click and longpress handler to the followed hashtags view #4459
This commit is contained in:
parent
b2d4092124
commit
f14a82325d
10 changed files with 58 additions and 42 deletions
|
|
@ -1,8 +1,5 @@
|
|||
package com.keylesspalace.tusky
|
||||
|
||||
import android.content.ClipData
|
||||
import android.content.ClipboardManager
|
||||
import android.content.Context
|
||||
import android.content.Intent
|
||||
import android.os.Build
|
||||
import android.os.Bundle
|
||||
|
|
@ -12,12 +9,12 @@ import android.text.method.LinkMovementMethod
|
|||
import android.text.style.URLSpan
|
||||
import android.text.util.Linkify
|
||||
import android.widget.TextView
|
||||
import android.widget.Toast
|
||||
import androidx.annotation.StringRes
|
||||
import androidx.lifecycle.lifecycleScope
|
||||
import com.keylesspalace.tusky.components.instanceinfo.InstanceInfoRepository
|
||||
import com.keylesspalace.tusky.databinding.ActivityAboutBinding
|
||||
import com.keylesspalace.tusky.util.NoUnderlineURLSpan
|
||||
import com.keylesspalace.tusky.util.copyToClipboard
|
||||
import com.keylesspalace.tusky.util.hide
|
||||
import com.keylesspalace.tusky.util.show
|
||||
import com.keylesspalace.tusky.util.startActivityWithSlideInAnimation
|
||||
|
|
@ -91,13 +88,11 @@ class AboutActivity : BottomSheetActivity() {
|
|||
}
|
||||
|
||||
binding.copyDeviceInfo.setOnClickListener {
|
||||
val text = "${binding.versionTextView.text}\n\nDevice:\n\n${binding.deviceInfo.text}\n\nAccount:\n\n${binding.accountInfo.text}"
|
||||
val clipboard = getSystemService(Context.CLIPBOARD_SERVICE) as ClipboardManager
|
||||
val clip = ClipData.newPlainText("Tusky version information", text)
|
||||
clipboard.setPrimaryClip(clip)
|
||||
if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.S_V2) {
|
||||
Toast.makeText(this, getString(R.string.about_copied), Toast.LENGTH_SHORT).show()
|
||||
}
|
||||
copyToClipboard(
|
||||
"${binding.versionTextView.text}\n\nDevice:\n\n${binding.deviceInfo.text}\n\nAccount:\n\n${binding.accountInfo.text}",
|
||||
getString(R.string.about_copied),
|
||||
"Tusky version information",
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -19,8 +19,6 @@ import android.Manifest
|
|||
import android.animation.Animator
|
||||
import android.animation.AnimatorListenerAdapter
|
||||
import android.app.DownloadManager
|
||||
import android.content.ClipData
|
||||
import android.content.ClipboardManager
|
||||
import android.content.Context
|
||||
import android.content.Intent
|
||||
import android.graphics.Bitmap
|
||||
|
|
@ -53,6 +51,7 @@ import com.keylesspalace.tusky.fragment.ViewImageFragment
|
|||
import com.keylesspalace.tusky.fragment.ViewVideoFragment
|
||||
import com.keylesspalace.tusky.pager.ImagePagerAdapter
|
||||
import com.keylesspalace.tusky.pager.SingleImagePagerAdapter
|
||||
import com.keylesspalace.tusky.util.copyToClipboard
|
||||
import com.keylesspalace.tusky.util.getParcelableArrayListExtraCompat
|
||||
import com.keylesspalace.tusky.util.getTemporaryMediaFilename
|
||||
import com.keylesspalace.tusky.util.startActivityWithSlideInAnimation
|
||||
|
|
@ -253,9 +252,10 @@ class ViewMediaActivity :
|
|||
}
|
||||
|
||||
private fun copyLink() {
|
||||
val url = imageUrl ?: attachments!![binding.viewPager.currentItem].attachment.url
|
||||
val clipboard = getSystemService(Context.CLIPBOARD_SERVICE) as ClipboardManager
|
||||
clipboard.setPrimaryClip(ClipData.newPlainText(null, url))
|
||||
copyToClipboard(
|
||||
imageUrl ?: attachments!![binding.viewPager.currentItem].attachment.url,
|
||||
getString(R.string.url_copied),
|
||||
)
|
||||
}
|
||||
|
||||
private fun shareMedia() {
|
||||
|
|
|
|||
|
|
@ -16,8 +16,6 @@
|
|||
package com.keylesspalace.tusky.components.account
|
||||
|
||||
import android.animation.ArgbEvaluator
|
||||
import android.content.ClipData
|
||||
import android.content.ClipboardManager
|
||||
import android.content.Context
|
||||
import android.content.Intent
|
||||
import android.content.res.ColorStateList
|
||||
|
|
@ -82,6 +80,7 @@ import com.keylesspalace.tusky.settings.PrefKeys
|
|||
import com.keylesspalace.tusky.util.Error
|
||||
import com.keylesspalace.tusky.util.Loading
|
||||
import com.keylesspalace.tusky.util.Success
|
||||
import com.keylesspalace.tusky.util.copyToClipboard
|
||||
import com.keylesspalace.tusky.util.emojify
|
||||
import com.keylesspalace.tusky.util.getDomain
|
||||
import com.keylesspalace.tusky.util.hide
|
||||
|
|
@ -484,15 +483,10 @@ class AccountActivity : BottomSheetActivity(), ActionButtonActivity, MenuProvide
|
|||
for (view in listOf(binding.accountUsernameTextView, binding.accountDisplayNameTextView)) {
|
||||
view.setOnLongClickListener {
|
||||
loadedAccount?.let { loadedAccount ->
|
||||
val fullUsername = getFullUsername(loadedAccount)
|
||||
val clipboard = getSystemService(Context.CLIPBOARD_SERVICE) as ClipboardManager
|
||||
clipboard.setPrimaryClip(ClipData.newPlainText(null, fullUsername))
|
||||
Snackbar.make(
|
||||
binding.root,
|
||||
copyToClipboard(
|
||||
getFullUsername(loadedAccount),
|
||||
getString(R.string.account_username_copied),
|
||||
Snackbar.LENGTH_SHORT
|
||||
)
|
||||
.show()
|
||||
}
|
||||
true
|
||||
}
|
||||
|
|
|
|||
|
|
@ -19,11 +19,13 @@ import at.connyduck.calladapter.networkresult.fold
|
|||
import com.google.android.material.snackbar.Snackbar
|
||||
import com.keylesspalace.tusky.BaseActivity
|
||||
import com.keylesspalace.tusky.R
|
||||
import com.keylesspalace.tusky.StatusListActivity
|
||||
import com.keylesspalace.tusky.components.compose.ComposeAutoCompleteAdapter
|
||||
import com.keylesspalace.tusky.databinding.ActivityFollowedTagsBinding
|
||||
import com.keylesspalace.tusky.interfaces.HashtagActionListener
|
||||
import com.keylesspalace.tusky.network.MastodonApi
|
||||
import com.keylesspalace.tusky.settings.PrefKeys
|
||||
import com.keylesspalace.tusky.util.copyToClipboard
|
||||
import com.keylesspalace.tusky.util.hide
|
||||
import com.keylesspalace.tusky.util.show
|
||||
import com.keylesspalace.tusky.util.viewBinding
|
||||
|
|
@ -180,6 +182,17 @@ class FollowedTagsActivity :
|
|||
return viewModel.searchAutocompleteSuggestions(token)
|
||||
}
|
||||
|
||||
override fun viewTag(tagName: String) {
|
||||
startActivity(StatusListActivity.newHashtagIntent(this, tagName))
|
||||
}
|
||||
|
||||
override fun copyTagName(tagName: String) {
|
||||
copyToClipboard(
|
||||
"#$tagName",
|
||||
getString(R.string.confirmation_hashtag_copied, tagName),
|
||||
)
|
||||
}
|
||||
|
||||
companion object {
|
||||
const val TAG = "FollowedTagsActivity"
|
||||
}
|
||||
|
|
|
|||
|
|
@ -27,7 +27,17 @@ class FollowedTagsAdapter(
|
|||
position: Int
|
||||
) {
|
||||
viewModel.tags[position].let { tag ->
|
||||
holder.itemView.findViewById<TextView>(R.id.followed_tag).text = tag.name
|
||||
holder.itemView.findViewById<TextView>(R.id.followed_tag).apply {
|
||||
text = tag.name
|
||||
setOnClickListener {
|
||||
actionListener.viewTag(tag.name)
|
||||
}
|
||||
setOnLongClickListener {
|
||||
actionListener.copyTagName(tag.name)
|
||||
true
|
||||
}
|
||||
}
|
||||
|
||||
holder.itemView.findViewById<ImageButton>(
|
||||
R.id.followed_tag_unfollow
|
||||
).setOnClickListener {
|
||||
|
|
|
|||
|
|
@ -17,9 +17,6 @@ package com.keylesspalace.tusky.components.search.fragments
|
|||
|
||||
import android.Manifest
|
||||
import android.app.DownloadManager
|
||||
import android.content.ClipData
|
||||
import android.content.ClipboardManager
|
||||
import android.content.Context
|
||||
import android.content.Intent
|
||||
import android.content.SharedPreferences
|
||||
import android.net.Uri
|
||||
|
|
@ -60,6 +57,7 @@ import com.keylesspalace.tusky.settings.PrefKeys
|
|||
import com.keylesspalace.tusky.util.CardViewMode
|
||||
import com.keylesspalace.tusky.util.ListStatusAccessibilityDelegate
|
||||
import com.keylesspalace.tusky.util.StatusDisplayOptions
|
||||
import com.keylesspalace.tusky.util.copyToClipboard
|
||||
import com.keylesspalace.tusky.util.openLink
|
||||
import com.keylesspalace.tusky.util.startActivityWithSlideInAnimation
|
||||
import com.keylesspalace.tusky.view.showMuteAccountDialog
|
||||
|
|
@ -398,10 +396,7 @@ class SearchStatusesFragment : SearchFragment<StatusViewData.Concrete>(), Status
|
|||
}
|
||||
|
||||
R.id.status_copy_link -> {
|
||||
val clipboard = requireActivity().getSystemService(
|
||||
Context.CLIPBOARD_SERVICE
|
||||
) as ClipboardManager
|
||||
clipboard.setPrimaryClip(ClipData.newPlainText(null, statusUrl))
|
||||
statusUrl?.let { requireActivity().copyToClipboard(it, getString(R.string.url_copied)) }
|
||||
return@setOnMenuItemClickListener true
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -16,8 +16,6 @@ package com.keylesspalace.tusky.fragment
|
|||
|
||||
import android.Manifest
|
||||
import android.app.DownloadManager
|
||||
import android.content.ClipData
|
||||
import android.content.ClipboardManager
|
||||
import android.content.Context
|
||||
import android.content.DialogInterface
|
||||
import android.content.Intent
|
||||
|
|
@ -59,6 +57,7 @@ import com.keylesspalace.tusky.entity.Translation
|
|||
import com.keylesspalace.tusky.interfaces.AccountSelectionListener
|
||||
import com.keylesspalace.tusky.network.MastodonApi
|
||||
import com.keylesspalace.tusky.usecase.TimelineCases
|
||||
import com.keylesspalace.tusky.util.copyToClipboard
|
||||
import com.keylesspalace.tusky.util.openLink
|
||||
import com.keylesspalace.tusky.util.parseAsMastodonHtml
|
||||
import com.keylesspalace.tusky.util.startActivityWithSlideInAnimation
|
||||
|
|
@ -290,13 +289,7 @@ abstract class SFragment(@LayoutRes contentLayoutId: Int) : Fragment(contentLayo
|
|||
}
|
||||
|
||||
R.id.status_copy_link -> {
|
||||
(
|
||||
requireActivity().getSystemService(
|
||||
Context.CLIPBOARD_SERVICE
|
||||
) as ClipboardManager
|
||||
).apply {
|
||||
setPrimaryClip(ClipData.newPlainText(null, statusUrl))
|
||||
}
|
||||
statusUrl?.let { requireActivity().copyToClipboard(it, getString(R.string.url_copied)) }
|
||||
return@setOnMenuItemClickListener true
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -2,4 +2,6 @@ package com.keylesspalace.tusky.interfaces
|
|||
|
||||
interface HashtagActionListener {
|
||||
fun unfollow(tagName: String, position: Int)
|
||||
fun viewTag(tagName: String)
|
||||
fun copyTagName(tagName: String)
|
||||
}
|
||||
|
|
|
|||
|
|
@ -3,8 +3,12 @@
|
|||
package com.keylesspalace.tusky.util
|
||||
|
||||
import android.app.Activity
|
||||
import android.content.ClipData
|
||||
import android.content.ClipboardManager
|
||||
import android.content.Context
|
||||
import android.content.Intent
|
||||
import android.os.Build
|
||||
import android.widget.Toast
|
||||
import androidx.activity.ComponentActivity
|
||||
import androidx.annotation.AnimRes
|
||||
import androidx.lifecycle.Lifecycle
|
||||
|
|
@ -47,6 +51,14 @@ fun ComponentActivity.overrideActivityTransitionCompat(
|
|||
}
|
||||
}
|
||||
|
||||
fun Activity.copyToClipboard(text: CharSequence, popupText: CharSequence, clipboardLabel: CharSequence = "") {
|
||||
val clipboard = getSystemService(Context.CLIPBOARD_SERVICE) as ClipboardManager
|
||||
clipboard.setPrimaryClip(ClipData.newPlainText(clipboardLabel, text))
|
||||
if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.S_V2) {
|
||||
Toast.makeText(this, popupText, Toast.LENGTH_SHORT).show()
|
||||
}
|
||||
}
|
||||
|
||||
object ActivityConstants {
|
||||
const val OVERRIDE_TRANSITION_OPEN = 0
|
||||
const val OVERRIDE_TRANSITION_CLOSE = 1
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue