Skip to content

Commit

Permalink
Ensure textview fields can be copy/pasted (#3707)
Browse files Browse the repository at this point in the history
The Android libraries have a bug where a TextView can forget that it contains selectable text, can be pasted in to, etc.

See https://issuetracker.google.com/issues/37095917

Fix this with an extension method that toggles the selectable state to re-enable it, and use this on the profile fields when editing an account.

Fixes #3706
  • Loading branch information
Nik Clayton authored Jun 11, 2023
1 parent 5fd532d commit 84486c7
Show file tree
Hide file tree
Showing 2 changed files with 17 additions and 0 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ import androidx.recyclerview.widget.RecyclerView
import com.keylesspalace.tusky.databinding.ItemEditFieldBinding
import com.keylesspalace.tusky.entity.StringField
import com.keylesspalace.tusky.util.BindingHolder
import com.keylesspalace.tusky.util.fixTextSelection

class AccountFieldEditAdapter : RecyclerView.Adapter<BindingHolder<ItemEditFieldBinding>>() {

Expand Down Expand Up @@ -87,6 +88,10 @@ class AccountFieldEditAdapter : RecyclerView.Adapter<BindingHolder<ItemEditField
holder.binding.accountFieldValueText.doAfterTextChanged { newText ->
fieldData[holder.bindingAdapterPosition].second = newText.toString()
}

// Ensure the textview contents are selectable
holder.binding.accountFieldNameText.fixTextSelection()
holder.binding.accountFieldValueText.fixTextSelection()
}

class MutableStringPair(var first: String, var second: String)
Expand Down
12 changes: 12 additions & 0 deletions app/src/main/java/com/keylesspalace/tusky/util/ViewExtensions.kt
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ package com.keylesspalace.tusky.util

import android.util.Log
import android.view.View
import android.widget.TextView
import androidx.recyclerview.widget.RecyclerView
import androidx.viewpager2.widget.ViewPager2

Expand Down Expand Up @@ -66,3 +67,14 @@ fun ViewPager2.reduceSwipeSensitivity() {
Log.w("reduceSwipeSensitivity", e)
}
}

/**
* TextViews with an ancestor RecyclerView can forget that they are selectable. Toggling
* calls to [TextView.setTextIsSelectable] fixes this.
*
* @see https://issuetracker.google.com/issues/37095917
*/
fun TextView.fixTextSelection() {
setTextIsSelectable(false)
post { setTextIsSelectable(true) }
}

0 comments on commit 84486c7

Please sign in to comment.