improved text count
This commit is contained in:
parent
b34abfaf5c
commit
7953b88234
|
@ -1228,7 +1228,6 @@ class ComposeActivity : BaseActivity(), OnMenuItemClickListener, OnClickListener
|
|||
displaySelectedAccountsIcon()
|
||||
val accounts = accountsAdapter.selectedAccounts
|
||||
editText.account = accounts.firstOrNull()
|
||||
statusTextCount.maxLength = accounts.textLimit
|
||||
val singleAccount = accounts.singleOrNull()
|
||||
val allMastodon = accounts.isNotEmpty() && accounts.all { it.type == AccountType.MASTODON }
|
||||
val anyMastodon = accounts.any { it.type == AccountType.MASTODON }
|
||||
|
@ -1533,7 +1532,7 @@ class ComposeActivity : BaseActivity(), OnMenuItemClickListener, OnClickListener
|
|||
val media = this.media
|
||||
val summary = editSummary.textIfVisible?.normalized(Normalizer.Form.NFC)
|
||||
val text = editText.text?.normalized(Normalizer.Form.NFC).orEmpty()
|
||||
val maxLength = statusTextCount.maxLength
|
||||
val maxLength = accounts.textLimit
|
||||
val inReplyTo = inReplyToStatus
|
||||
val replyTextAndMentions = getTwitterReplyTextAndMentions(text, accounts)
|
||||
if (inReplyTo != null && replyTextAndMentions != null) {
|
||||
|
@ -1602,7 +1601,7 @@ class ComposeActivity : BaseActivity(), OnMenuItemClickListener, OnClickListener
|
|||
if (textAndMentions == null) {
|
||||
hintLabel.visibility = View.GONE
|
||||
editable.clearSpans(MentionColorSpan::class.java)
|
||||
statusTextCount.textCount = StatusTextValidator.calculateLength(accounts, summary, text,
|
||||
statusTextCount.remaining = StatusTextValidator.calculateRemaining(accounts, summary, text,
|
||||
false, null)
|
||||
} else if (textAndMentions.replyToOriginalUser || replyToSelf) {
|
||||
hintLabel.visibility = View.GONE
|
||||
|
@ -1610,12 +1609,12 @@ class ComposeActivity : BaseActivity(), OnMenuItemClickListener, OnClickListener
|
|||
editable.clearSpans(MentionColorSpan::class.java)
|
||||
editable.setSpan(MentionColorSpan(mentionColor), 0, textAndMentions.replyStartIndex,
|
||||
Spannable.SPAN_EXCLUSIVE_EXCLUSIVE)
|
||||
statusTextCount.textCount = StatusTextValidator.calculateLength(accounts, summary,
|
||||
statusTextCount.remaining = StatusTextValidator.calculateRemaining(accounts, summary,
|
||||
textAndMentions.replyText, false, null)
|
||||
} else {
|
||||
hintLabel.visibility = View.VISIBLE
|
||||
editable.clearSpans(MentionColorSpan::class.java)
|
||||
statusTextCount.textCount = StatusTextValidator.calculateLength(accounts, summary,
|
||||
statusTextCount.remaining = StatusTextValidator.calculateRemaining(accounts, summary,
|
||||
textAndMentions.replyText, false, null)
|
||||
}
|
||||
}
|
||||
|
@ -2099,6 +2098,7 @@ class ComposeActivity : BaseActivity(), OnMenuItemClickListener, OnClickListener
|
|||
val account = accounts!![position]
|
||||
selection.put(account.key, true != selection[account.key])
|
||||
activity.updateAccountSelectionState()
|
||||
activity.updateTextCount()
|
||||
activity.updateVisibilityState()
|
||||
activity.updateSummaryTextState()
|
||||
activity.setMenu()
|
||||
|
@ -2111,6 +2111,7 @@ class ComposeActivity : BaseActivity(), OnMenuItemClickListener, OnClickListener
|
|||
selection.clear()
|
||||
selection.put(account.key, true != selection[account.key])
|
||||
activity.updateAccountSelectionState()
|
||||
activity.updateTextCount()
|
||||
activity.updateVisibilityState()
|
||||
activity.updateSummaryTextState()
|
||||
activity.setMenu()
|
||||
|
|
|
@ -41,7 +41,6 @@ import org.mariotaku.twidere.constant.quickSendKey
|
|||
import org.mariotaku.twidere.extension.*
|
||||
import org.mariotaku.twidere.extension.model.can_retweet
|
||||
import org.mariotaku.twidere.extension.model.is_my_retweet
|
||||
import org.mariotaku.twidere.extension.model.textLimit
|
||||
import org.mariotaku.twidere.fragment.BaseDialogFragment
|
||||
import org.mariotaku.twidere.model.*
|
||||
import org.mariotaku.twidere.model.draft.QuoteStatusActionExtras
|
||||
|
@ -84,8 +83,6 @@ class RetweetQuoteDialogFragment : AbsStatusDialogFragment() {
|
|||
|
||||
override fun AlertDialog.onStatusLoaded(account: AccountDetails, status: ParcelableStatus,
|
||||
savedInstanceState: Bundle?) {
|
||||
textCountView.maxLength = account.textLimit
|
||||
|
||||
val canQuoteRetweet = canQuoteRetweet(account)
|
||||
|
||||
commentContainer.visibility = if (canQuoteRetweet) View.VISIBLE else View.GONE
|
||||
|
@ -183,7 +180,7 @@ class RetweetQuoteDialogFragment : AbsStatusDialogFragment() {
|
|||
positiveButton.setText(R.string.action_retweet)
|
||||
positiveButton.isEnabled = status.can_retweet
|
||||
}
|
||||
textCountView.textCount = StatusTextValidator.calculateLength(account.type, account.key,
|
||||
textCountView.remaining = StatusTextValidator.calculateRemaining(arrayOf(account),
|
||||
null, text.toString())
|
||||
}
|
||||
|
||||
|
|
|
@ -21,6 +21,7 @@ package org.mariotaku.twidere.util.text
|
|||
|
||||
import org.mariotaku.ktextension.mapToIntArray
|
||||
import org.mariotaku.twidere.annotation.AccountType
|
||||
import org.mariotaku.twidere.extension.model.textLimit
|
||||
import org.mariotaku.twidere.extension.text.twitter.getTweetLength
|
||||
import org.mariotaku.twidere.model.AccountDetails
|
||||
import org.mariotaku.twidere.model.ParcelableStatus
|
||||
|
@ -54,6 +55,16 @@ object StatusTextValidator {
|
|||
}
|
||||
}
|
||||
|
||||
fun calculateRemaining(accounts: Array<AccountDetails>, summary: String?, text: String,
|
||||
ignoreMentions: Boolean = false, inReplyTo: ParcelableStatus? = null): Int? {
|
||||
return accounts.mapNotNull {
|
||||
val textLimit = it.textLimit
|
||||
if (textLimit == 0) return@mapNotNull null
|
||||
return@mapNotNull textLimit - calculateLength(it.type, it.key, summary, text,
|
||||
ignoreMentions, inReplyTo)
|
||||
}.min()
|
||||
}
|
||||
|
||||
fun calculateLength(accounts: Array<AccountDetails>, summary: String?, text: String,
|
||||
ignoreMentions: Boolean = false, inReplyTo: ParcelableStatus? = null): Int {
|
||||
return calculateLengths(accounts, summary, text, ignoreMentions, inReplyTo).max() ?: 0
|
||||
|
|
|
@ -33,35 +33,31 @@ class StatusTextCountView(context: Context, attrs: AttributeSet? = null) : AppCo
|
|||
@ColorInt
|
||||
private val defaultTextColor = currentTextColor
|
||||
|
||||
var textCount: Int = 0
|
||||
private val warnLimit = 10
|
||||
|
||||
var remaining: Int? = null
|
||||
set(count) {
|
||||
field = count
|
||||
updateTextCount()
|
||||
}
|
||||
var maxLength: Int = 0
|
||||
set(maxLength) {
|
||||
field = maxLength
|
||||
updateTextCount()
|
||||
}
|
||||
|
||||
fun updateTextCount() {
|
||||
if (this.maxLength <= 0) {
|
||||
private fun updateTextCount() {
|
||||
val remaining = this.remaining
|
||||
if (remaining == null) {
|
||||
text = null
|
||||
return
|
||||
}
|
||||
val count = this.textCount
|
||||
val maxLength = this.maxLength
|
||||
text = getLocalizedNumber(Locale.getDefault(), maxLength - count)
|
||||
val exceededLimit = count < maxLength
|
||||
val nearLimit = count >= maxLength - 10
|
||||
val hue = (if (exceededLimit) if (nearLimit) 5 * (maxLength - count) else 50 else 0).toFloat()
|
||||
text = getLocalizedNumber(Locale.getDefault(), remaining)
|
||||
val exceededLimit = remaining < 0
|
||||
val nearLimit = remaining <= warnLimit
|
||||
val hue = (if (exceededLimit) if (nearLimit) 5 * remaining else 50 else 0).toFloat()
|
||||
val textColorHsv = FloatArray(3)
|
||||
Color.colorToHSV(defaultTextColor, textColorHsv)
|
||||
val errorColorHsv = FloatArray(3)
|
||||
errorColorHsv[0] = hue
|
||||
errorColorHsv[1] = 1f
|
||||
errorColorHsv[2] = 0.75f + textColorHsv[2] / 4
|
||||
if (count >= maxLength - 10) {
|
||||
if (remaining <= warnLimit) {
|
||||
setTextColor(Color.HSVToColor(errorColorHsv))
|
||||
} else {
|
||||
setTextColor(defaultTextColor)
|
||||
|
|
Loading…
Reference in New Issue