improved text count

This commit is contained in:
Mariotaku Lee 2017-12-12 21:35:43 +08:00
parent b34abfaf5c
commit 7953b88234
No known key found for this signature in database
GPG Key ID: 15C10F89D7C33535
4 changed files with 29 additions and 24 deletions

View File

@ -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()

View File

@ -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())
}

View File

@ -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

View File

@ -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)