From b07221a97e238744ce67f617c1a5ab2f15ac4d40 Mon Sep 17 00:00:00 2001 From: tateisu Date: Fri, 16 Nov 2018 23:44:23 +0900 Subject: [PATCH] =?UTF-8?q?Mastodon=E3=81=A7=E3=82=82=E3=80=8C=EF=BD=9E?= =?UTF-8?q?=E3=81=B8=E3=81=AE=E8=BF=94=E4=BF=A1=E3=80=8D=E3=82=92=E8=A1=A8?= =?UTF-8?q?=E7=A4=BA=E3=81=99=E3=82=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../jp/juggler/subwaytooter/ItemViewHolder.kt | 106 +++++++++++++----- .../subwaytooter/api/entity/TootStatus.kt | 2 +- .../juggler/subwaytooter/table/AcctColor.kt | 26 +++++ 3 files changed, 104 insertions(+), 30 deletions(-) diff --git a/app/src/main/java/jp/juggler/subwaytooter/ItemViewHolder.kt b/app/src/main/java/jp/juggler/subwaytooter/ItemViewHolder.kt index 55592a56..0f1e45ea 100644 --- a/app/src/main/java/jp/juggler/subwaytooter/ItemViewHolder.kt +++ b/app/src/main/java/jp/juggler/subwaytooter/ItemViewHolder.kt @@ -7,10 +7,7 @@ import android.support.v4.content.ContextCompat import android.support.v4.view.ViewCompat import android.support.v7.app.AlertDialog import android.support.v7.widget.RecyclerView -import android.text.Spannable -import android.text.SpannableStringBuilder -import android.text.Spanned -import android.text.TextUtils +import android.text.* import android.view.Gravity import android.view.View import android.view.ViewGroup @@ -441,9 +438,9 @@ internal class ItemViewHolder( item.hasAnyContent() -> { // 引用Renote showReply( - reblog, R.attr.btn_boost, - R.string.renote_to + R.string.renote_to, + reblog ) showStatus(item) } @@ -478,7 +475,7 @@ internal class ItemViewHolder( is TootFilter -> showFilter(item) is TootConversationSummary -> { - showStatus(item.last_status) + showStatusOrReply(item.last_status) showConversationIcons(item) } @@ -573,17 +570,24 @@ internal class ItemViewHolder( private fun showStatusOrReply(item : TootStatus) { val reply = item.reply - if(reply != null) { - // 返信 - showReply( - reply, - R.attr.btn_reply, - R.string.reply_to - ) - showStatus(item) - } else { - showStatus(item) + val in_reply_to_id = item.in_reply_to_id + val in_reply_to_account_id = item.in_reply_to_account_id + when { + reply != null -> + showReply( + R.attr.btn_reply, + R.string.reply_to, + reply + ) + in_reply_to_id != null && in_reply_to_account_id != null -> { + showReply( + R.attr.btn_reply, + in_reply_to_account_id, + item + ) + } } + showStatus(item) } private fun showTrendTag(item : TootTrendTag) { @@ -614,9 +618,9 @@ internal class ItemViewHolder( else -> { // 引用Renote showReply( - reblog, R.attr.btn_boost, - R.string.renote_to + R.string.renote_to, + reblog ) showStatus(item) } @@ -821,23 +825,55 @@ internal class ItemViewHolder( } private fun showReply( - reply : TootStatus, iconAttrId : Int, - stringId : Int + text : Spannable + ) { + llReply.visibility = View.VISIBLE + ivReply.setImageResource(Styler.getAttributeResourceId(activity, iconAttrId)) + tvReply.text = text + reply_invalidator.register(text) + } + + private fun showReply( + iconAttrId : Int, + stringId : Int, + reply : TootStatus ) { status_reply = reply - llReply.visibility = View.VISIBLE - // val who = reply.account // showStatusTime(activity, tvReplyTime, who, time = reply.time_created_at) // setAcct(tvReplyAcct, access_info.getFullAcct(who), who.acct) - ivReply.setImageResource(Styler.getAttributeResourceId(activity, iconAttrId)) - val text = reply.accountRef.decoded_display_name.intoStringResource(activity, stringId) - tvReply.text = text - reply_invalidator.register(text) + showReply(iconAttrId,text) + } + + private fun showReply( + iconAttrId : Int, + accountId : EntityId, + replyStatus: TootStatus + ) { + llReply.visibility = View.VISIBLE + + val name = if( accountId == replyStatus.account.id){ + AcctColor.getNicknameWithColor(activity,access_info.getFullAcct(replyStatus.account)) + }else { + val m = replyStatus.mentions?.find { it.id == accountId } + if( m != null){ + AcctColor.getNicknameWithColor(activity,access_info.getFullAcct(m.acct)) + }else{ + SpannableString("ID(${accountId})") + } + } + + val text = name.intoStringResource(activity, R.string.reply_to) + + // val who = reply.account + // showStatusTime(activity, tvReplyTime, who, time = reply.time_created_at) + // setAcct(tvReplyAcct, access_info.getFullAcct(who), who.acct) + + showReply(iconAttrId,text) } private fun showBoost( @@ -1421,8 +1457,14 @@ internal class ItemViewHolder( llBoosted -> boostedAction() llReply -> { - status_reply?.let { s -> + val s = status_reply + if( s != null){ Action_Toot.conversation(activity, pos, access_info, s) + }else{ + val id = status_showing?.in_reply_to_id + if( id != null) { + Action_Toot.conversationLocal(activity, pos, access_info, id) + } } } @@ -1586,7 +1628,8 @@ internal class ItemViewHolder( } llReply -> { - status_reply?.let { s -> + val s = status_reply + if( s != null){ DlgContextMenu( activity, column, @@ -1594,6 +1637,11 @@ internal class ItemViewHolder( s, notification ).show() + }else{ + val id = status_showing?.in_reply_to_id + if( id != null) { + Action_Toot.conversationLocal(activity, activity.nextPosition(column), access_info, id) + } } } diff --git a/app/src/main/java/jp/juggler/subwaytooter/api/entity/TootStatus.kt b/app/src/main/java/jp/juggler/subwaytooter/api/entity/TootStatus.kt index 817d4711..13689182 100644 --- a/app/src/main/java/jp/juggler/subwaytooter/api/entity/TootStatus.kt +++ b/app/src/main/java/jp/juggler/subwaytooter/api/entity/TootStatus.kt @@ -106,7 +106,7 @@ class TootStatus(parser : TootParser, src : JSONObject) : TimelineItem() { val in_reply_to_id : EntityId? // null or the ID of the account it replies to - private val in_reply_to_account_id : EntityId? + val in_reply_to_account_id : EntityId? // null or the reblogged Status val reblog : TootStatus? diff --git a/app/src/main/java/jp/juggler/subwaytooter/table/AcctColor.kt b/app/src/main/java/jp/juggler/subwaytooter/table/AcctColor.kt index fa6c0a5a..a7d8a0d6 100644 --- a/app/src/main/java/jp/juggler/subwaytooter/table/AcctColor.kt +++ b/app/src/main/java/jp/juggler/subwaytooter/table/AcctColor.kt @@ -174,6 +174,32 @@ class AcctColor { val nickname = ac.nickname return if(nickname != null && nickname.isNotEmpty()) nickname.sanitizeBDI() else acct } + fun getNicknameWithColor( + context : Context, + acct : String + ) : CharSequence { + val ac = load(acct) + val nickname = ac.nickname + val name = if(nickname == null || nickname.isEmpty()) acct else nickname.sanitizeBDI() + val sb = SpannableStringBuilder( name ) + val start = 0 + val end = sb.length + if(ac.color_fg != 0) { + sb.setSpan( + ForegroundColorSpan(ac.color_fg), + start,end, + Spannable.SPAN_EXCLUSIVE_EXCLUSIVE + ) + } + if(ac.color_bg != 0) { + sb.setSpan( + BackgroundColorSpan(ac.color_bg), + start,end, + Spannable.SPAN_EXCLUSIVE_EXCLUSIVE + ) + } + return sb + } fun getNotificationSound(acct : String) : String? { val ac = load(acct)