- 告知リアクションのカスタム絵文字がアニメーションしない問題の修正。
- 告知リアクションをピッカーで選んだ際のカスタム絵文字の取り扱いを修正。 - 告知ヘッダ部分のタップで開閉する。 - 告知の表示のカスタマイズ反映。色、フォント、文字サイズ、行間。 - 告知中のハッシュタグやメンションをタップした時の挙動をトゥートと同様にする。 - 告知を隠した時間を保存。
This commit is contained in:
parent
99e2efb9bb
commit
130058c406
|
@ -242,6 +242,10 @@ class ActMain : AppCompatActivity()
|
||||||
column = tag.ivh.column
|
column = tag.ivh.column
|
||||||
whoRef = tag.ivh.getAccount()
|
whoRef = tag.ivh.getAccount()
|
||||||
break
|
break
|
||||||
|
} else if(tag is ColumnViewHolder) {
|
||||||
|
column = tag.column
|
||||||
|
whoRef = null
|
||||||
|
break
|
||||||
} else if(tag is ViewHolderHeaderBase) {
|
} else if(tag is ViewHolderHeaderBase) {
|
||||||
column = tag.column
|
column = tag.column
|
||||||
whoRef = tag.getAccount()
|
whoRef = tag.getAccount()
|
||||||
|
@ -603,6 +607,7 @@ class ActMain : AppCompatActivity()
|
||||||
|
|
||||||
// 背景画像を表示しない設定が変更された時にカラムの背景を設定しなおす
|
// 背景画像を表示しない設定が変更された時にカラムの背景を設定しなおす
|
||||||
for(column in app_state.column_list) {
|
for(column in app_state.column_list) {
|
||||||
|
column.viewHolder?.lastAnnouncementShown = 0L
|
||||||
column.fireColumnColor()
|
column.fireColumnColor()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -189,6 +189,8 @@ class Column(
|
||||||
internal const val KEY_COLUMN_NAME = "column_name"
|
internal const val KEY_COLUMN_NAME = "column_name"
|
||||||
internal const val KEY_OLD_INDEX = "old_index"
|
internal const val KEY_OLD_INDEX = "old_index"
|
||||||
|
|
||||||
|
internal const val KEY_ANNOUNCEMEMT_HIDE_TIME = "announcementHideTime"
|
||||||
|
|
||||||
val typeMap : SparseArray<ColumnType> = SparseArray()
|
val typeMap : SparseArray<ColumnType> = SparseArray()
|
||||||
|
|
||||||
internal var useInstanceTicker = false
|
internal var useInstanceTicker = false
|
||||||
|
@ -713,6 +715,8 @@ class Column(
|
||||||
instance_local = src.optBoolean(KEY_INSTANCE_LOCAL)
|
instance_local = src.optBoolean(KEY_INSTANCE_LOCAL)
|
||||||
quick_filter = src.optInt(KEY_QUICK_FILTER, 0)
|
quick_filter = src.optInt(KEY_QUICK_FILTER, 0)
|
||||||
|
|
||||||
|
announcementHideTime = src.optLong(KEY_ANNOUNCEMEMT_HIDE_TIME,0L)
|
||||||
|
|
||||||
enable_speech = src.optBoolean(KEY_ENABLE_SPEECH)
|
enable_speech = src.optBoolean(KEY_ENABLE_SPEECH)
|
||||||
use_old_api = src.optBoolean(KEY_USE_OLD_API)
|
use_old_api = src.optBoolean(KEY_USE_OLD_API)
|
||||||
last_viewing_item_id = EntityId.from(src, KEY_LAST_VIEWING_ITEM)
|
last_viewing_item_id = EntityId.from(src, KEY_LAST_VIEWING_ITEM)
|
||||||
|
@ -798,6 +802,8 @@ class Column(
|
||||||
dst[KEY_TYPE] = type.id
|
dst[KEY_TYPE] = type.id
|
||||||
dst[KEY_COLUMN_ID] = column_id
|
dst[KEY_COLUMN_ID] = column_id
|
||||||
|
|
||||||
|
dst[KEY_ANNOUNCEMEMT_HIDE_TIME] = announcementHideTime
|
||||||
|
|
||||||
dst.putIfTrue(KEY_DONT_CLOSE, dont_close)
|
dst.putIfTrue(KEY_DONT_CLOSE, dont_close)
|
||||||
dst.putIfTrue(KEY_WITH_ATTACHMENT, with_attachment)
|
dst.putIfTrue(KEY_WITH_ATTACHMENT, with_attachment)
|
||||||
dst.putIfTrue(KEY_WITH_HIGHLIGHT, with_highlight)
|
dst.putIfTrue(KEY_WITH_HIGHLIGHT, with_highlight)
|
||||||
|
|
|
@ -153,6 +153,9 @@ class ColumnViewHolder(
|
||||||
private lateinit var etHashtagExtraNone : EditText
|
private lateinit var etHashtagExtraNone : EditText
|
||||||
|
|
||||||
private lateinit var llAnnouncementsBox : View
|
private lateinit var llAnnouncementsBox : View
|
||||||
|
private lateinit var llAnnouncementsHeader : View
|
||||||
|
|
||||||
|
private lateinit var tvAnnouncementsCaption : TextView
|
||||||
private lateinit var tvAnnouncementsIndex : TextView
|
private lateinit var tvAnnouncementsIndex : TextView
|
||||||
private lateinit var btnAnnouncementsPrev : ImageButton
|
private lateinit var btnAnnouncementsPrev : ImageButton
|
||||||
private lateinit var btnAnnouncementsNext : ImageButton
|
private lateinit var btnAnnouncementsNext : ImageButton
|
||||||
|
@ -164,7 +167,7 @@ class ColumnViewHolder(
|
||||||
|
|
||||||
private val announcementContentInvalidator : NetworkEmojiInvalidator
|
private val announcementContentInvalidator : NetworkEmojiInvalidator
|
||||||
|
|
||||||
private var lastAnnouncementShown = 0L
|
var lastAnnouncementShown = 0L
|
||||||
|
|
||||||
private val extra_invalidator_list = ArrayList<NetworkEmojiInvalidator>()
|
private val extra_invalidator_list = ArrayList<NetworkEmojiInvalidator>()
|
||||||
|
|
||||||
|
@ -348,6 +351,7 @@ class ColumnViewHolder(
|
||||||
btnAnnouncementsShowHide.setOnClickListener(this)
|
btnAnnouncementsShowHide.setOnClickListener(this)
|
||||||
btnAnnouncementsPrev.setOnClickListener(this)
|
btnAnnouncementsPrev.setOnClickListener(this)
|
||||||
btnAnnouncementsNext.setOnClickListener(this)
|
btnAnnouncementsNext.setOnClickListener(this)
|
||||||
|
llAnnouncementsHeader.setOnClickListener(this)
|
||||||
|
|
||||||
|
|
||||||
cbDontCloseColumn.setOnCheckedChangeListener(this)
|
cbDontCloseColumn.setOnCheckedChangeListener(this)
|
||||||
|
@ -788,6 +792,8 @@ class ColumnViewHolder(
|
||||||
|
|
||||||
// カラム色を変更したらクイックフィルタの色も変わる場合がある
|
// カラム色を変更したらクイックフィルタの色も変わる場合がある
|
||||||
showQuickFilter()
|
showQuickFilter()
|
||||||
|
|
||||||
|
showAnnouncements(force = false)
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun closeBitmaps() {
|
private fun closeBitmaps() {
|
||||||
|
@ -1098,7 +1104,7 @@ class ColumnViewHolder(
|
||||||
btnQuickFilterReaction -> clickQuickFilter(Column.QUICK_FILTER_REACTION)
|
btnQuickFilterReaction -> clickQuickFilter(Column.QUICK_FILTER_REACTION)
|
||||||
btnQuickFilterVote -> clickQuickFilter(Column.QUICK_FILTER_VOTE)
|
btnQuickFilterVote -> clickQuickFilter(Column.QUICK_FILTER_VOTE)
|
||||||
|
|
||||||
btnAnnouncementsShowHide -> {
|
llAnnouncementsHeader, btnAnnouncementsShowHide -> {
|
||||||
if(llAnnouncements.visibility == View.VISIBLE) {
|
if(llAnnouncements.visibility == View.VISIBLE) {
|
||||||
column.announcementHideTime = System.currentTimeMillis()
|
column.announcementHideTime = System.currentTimeMillis()
|
||||||
} else {
|
} else {
|
||||||
|
@ -1959,23 +1965,29 @@ class ColumnViewHolder(
|
||||||
}
|
}
|
||||||
background = createRoundDrawable(
|
background = createRoundDrawable(
|
||||||
dip(6).toFloat(),
|
dip(6).toFloat(),
|
||||||
getAttributeColor(context, R.attr.colorThumbnailBackground)
|
getAttributeColor(context, R.attr.colorSearchFormBackground)
|
||||||
)
|
)
|
||||||
var pad_tb = dip(2)
|
var pad_tb = dip(2)
|
||||||
setPadding(0, pad_tb, 0, pad_tb)
|
setPadding(0, pad_tb, 0, pad_tb)
|
||||||
|
|
||||||
linearLayout {
|
val buttonHeight = ActMain.boostButtonSize
|
||||||
lparams(matchParent, wrapContent) {
|
val paddingH = (buttonHeight.toFloat() * 0.1f + 0.5f).toInt()
|
||||||
startMargin = dip(6)
|
val paddingV = (buttonHeight.toFloat() * 0.1f + 0.5f).toInt()
|
||||||
endMargin = dip(6)
|
|
||||||
}
|
llAnnouncementsHeader = linearLayout {
|
||||||
|
lparams(matchParent, wrapContent)
|
||||||
|
val pad_lr = dip(6)
|
||||||
|
setPadding(pad_lr, 0, pad_lr, 0)
|
||||||
|
|
||||||
gravity = Gravity.CENTER_VERTICAL
|
background = ContextCompat.getDrawable(
|
||||||
|
context,
|
||||||
|
R.drawable.btn_bg_transparent_round6dp
|
||||||
|
)
|
||||||
|
|
||||||
|
gravity = Gravity.CENTER_VERTICAL or Gravity.END
|
||||||
|
|
||||||
|
tvAnnouncementsCaption = textView {
|
||||||
textView {
|
gravity = Gravity.END or Gravity.CENTER_VERTICAL
|
||||||
gravity = Gravity.END
|
|
||||||
text = context.getString(R.string.announcements)
|
text = context.getString(R.string.announcements)
|
||||||
}.lparams(0, wrapContent) {
|
}.lparams(0, wrapContent) {
|
||||||
weight = 1f
|
weight = 1f
|
||||||
|
@ -1985,12 +1997,14 @@ class ColumnViewHolder(
|
||||||
|
|
||||||
background = ContextCompat.getDrawable(
|
background = ContextCompat.getDrawable(
|
||||||
context,
|
context,
|
||||||
R.drawable.btn_bg_transparent
|
R.drawable.btn_bg_transparent_round6dp
|
||||||
)
|
)
|
||||||
contentDescription = context.getString(R.string.previous)
|
contentDescription = context.getString(R.string.previous)
|
||||||
imageResource = R.drawable.ic_arrow_start
|
imageResource = R.drawable.ic_arrow_start
|
||||||
}.lparams(dip(32), dip(32)) {
|
setPadding(paddingH, paddingV, paddingH, paddingV)
|
||||||
gravity = Gravity.END
|
scaleType = ImageView.ScaleType.FIT_CENTER
|
||||||
|
|
||||||
|
}.lparams(buttonHeight, buttonHeight) {
|
||||||
marginStart = dip(4)
|
marginStart = dip(4)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2003,27 +2017,29 @@ class ColumnViewHolder(
|
||||||
|
|
||||||
background = ContextCompat.getDrawable(
|
background = ContextCompat.getDrawable(
|
||||||
context,
|
context,
|
||||||
R.drawable.btn_bg_transparent
|
R.drawable.btn_bg_transparent_round6dp
|
||||||
)
|
)
|
||||||
contentDescription = context.getString(R.string.next)
|
contentDescription = context.getString(R.string.next)
|
||||||
imageResource = R.drawable.ic_arrow_end
|
imageResource = R.drawable.ic_arrow_end
|
||||||
}.lparams(dip(32), dip(32)) {
|
setPadding(paddingH, paddingV, paddingH, paddingV)
|
||||||
gravity = Gravity.END
|
scaleType = ImageView.ScaleType.FIT_CENTER
|
||||||
|
|
||||||
|
}.lparams(buttonHeight, buttonHeight) {
|
||||||
marginStart = dip(4)
|
marginStart = dip(4)
|
||||||
}
|
}
|
||||||
|
|
||||||
btnAnnouncementsShowHide = imageButton {
|
btnAnnouncementsShowHide = imageButton {
|
||||||
background = ContextCompat.getDrawable(
|
background = ContextCompat.getDrawable(
|
||||||
context,
|
context,
|
||||||
R.drawable.btn_bg_transparent
|
R.drawable.btn_bg_transparent_round6dp
|
||||||
)
|
)
|
||||||
contentDescription = context.getString(R.string.hide)
|
contentDescription = context.getString(R.string.hide)
|
||||||
imageResource = R.drawable.ic_close
|
imageResource = R.drawable.ic_arrow_drop_down
|
||||||
}.lparams(dip(32), dip(32)) {
|
setPadding(paddingH, paddingV, paddingH, paddingV)
|
||||||
gravity = Gravity.END
|
scaleType = ImageView.ScaleType.FIT_CENTER
|
||||||
|
}.lparams(buttonHeight, buttonHeight) {
|
||||||
marginStart = dip(4)
|
marginStart = dip(4)
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
llAnnouncements = maxHeightScrollView {
|
llAnnouncements = maxHeightScrollView {
|
||||||
|
@ -2320,16 +2336,56 @@ class ColumnViewHolder(
|
||||||
val itemIndex = listShown.indexOf(item)
|
val itemIndex = listShown.indexOf(item)
|
||||||
|
|
||||||
val enablePaging = listShown.size > 1
|
val enablePaging = listShown.size > 1
|
||||||
|
|
||||||
|
val alphaPrevNext = if(enablePaging) 1f else 0.3f
|
||||||
|
|
||||||
|
setIconDrawableId(
|
||||||
|
activity,
|
||||||
|
btnAnnouncementsPrev,
|
||||||
|
R.drawable.ic_arrow_start,
|
||||||
|
color = content_color,
|
||||||
|
alphaMultiplier = alphaPrevNext
|
||||||
|
)
|
||||||
|
|
||||||
|
setIconDrawableId(
|
||||||
|
activity,
|
||||||
|
btnAnnouncementsNext,
|
||||||
|
R.drawable.ic_arrow_end,
|
||||||
|
color = content_color,
|
||||||
|
alphaMultiplier = alphaPrevNext
|
||||||
|
)
|
||||||
|
|
||||||
val expand = column.announcementHideTime <= 0L
|
val expand = column.announcementHideTime <= 0L
|
||||||
|
|
||||||
btnAnnouncementsPrev.vg(expand)?.run {
|
btnAnnouncementsPrev.vg(expand)?.run {
|
||||||
isEnabled = enablePaging
|
isEnabled = enablePaging
|
||||||
alpha = if(enablePaging) 1f else 0.3f
|
|
||||||
}
|
}
|
||||||
btnAnnouncementsNext.vg(expand)?.run {
|
btnAnnouncementsNext.vg(expand)?.run {
|
||||||
isEnabled = enablePaging
|
isEnabled = enablePaging
|
||||||
alpha = if(enablePaging) 1f else 0.3f
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
tvAnnouncementsCaption.textColor = content_color
|
||||||
|
tvAnnouncementsIndex.textColor = content_color
|
||||||
|
tvAnnouncementPeriod.textColor = content_color
|
||||||
|
|
||||||
|
val f = activity.timeline_font_size_sp
|
||||||
|
if(! f.isNaN()) {
|
||||||
|
tvAnnouncementsCaption.textSize = f
|
||||||
|
tvAnnouncementsIndex.textSize = f
|
||||||
|
tvAnnouncementPeriod.textSize = f
|
||||||
|
tvAnnouncementContent.textSize = f
|
||||||
|
}
|
||||||
|
val spacing = activity.timeline_spacing
|
||||||
|
if(spacing != null) {
|
||||||
|
tvAnnouncementPeriod.setLineSpacing(0f, spacing)
|
||||||
|
tvAnnouncementContent.setLineSpacing(0f, spacing)
|
||||||
|
}
|
||||||
|
tvAnnouncementsCaption.typeface = ActMain.timeline_font_bold
|
||||||
|
val font_normal = ActMain.timeline_font
|
||||||
|
tvAnnouncementsIndex.typeface = font_normal
|
||||||
|
tvAnnouncementPeriod.typeface = font_normal
|
||||||
|
tvAnnouncementContent.typeface = font_normal
|
||||||
|
|
||||||
tvAnnouncementsIndex.vg(expand)?.text =
|
tvAnnouncementsIndex.vg(expand)?.text =
|
||||||
activity.getString(R.string.announcements_index, itemIndex + 1, listShown.size)
|
activity.getString(R.string.announcements_index, itemIndex + 1, listShown.size)
|
||||||
llAnnouncements.vg(expand)
|
llAnnouncements.vg(expand)
|
||||||
|
@ -2343,7 +2399,7 @@ class ColumnViewHolder(
|
||||||
btnAnnouncementsShowHide,
|
btnAnnouncementsShowHide,
|
||||||
R.drawable.ic_error,
|
R.drawable.ic_error,
|
||||||
color = getAttributeColor(activity, R.attr.colorRegexFilterError),
|
color = getAttributeColor(activity, R.attr.colorRegexFilterError),
|
||||||
alphaMultiplier = Styler.boost_alpha
|
alphaMultiplier = 1f
|
||||||
)
|
)
|
||||||
} else {
|
} else {
|
||||||
setIconDrawableId(
|
setIconDrawableId(
|
||||||
|
@ -2351,7 +2407,7 @@ class ColumnViewHolder(
|
||||||
btnAnnouncementsShowHide,
|
btnAnnouncementsShowHide,
|
||||||
R.drawable.ic_arrow_drop_down,
|
R.drawable.ic_arrow_drop_down,
|
||||||
color = content_color,
|
color = content_color,
|
||||||
alphaMultiplier = Styler.boost_alpha
|
alphaMultiplier = 1f
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
return
|
return
|
||||||
|
@ -2362,7 +2418,7 @@ class ColumnViewHolder(
|
||||||
btnAnnouncementsShowHide,
|
btnAnnouncementsShowHide,
|
||||||
R.drawable.ic_arrow_drop_up,
|
R.drawable.ic_arrow_drop_up,
|
||||||
color = content_color,
|
color = content_color,
|
||||||
alphaMultiplier = Styler.boost_alpha
|
alphaMultiplier = 1f
|
||||||
)
|
)
|
||||||
|
|
||||||
var periods : StringBuilder? = null
|
var periods : StringBuilder? = null
|
||||||
|
@ -2382,7 +2438,6 @@ class ColumnViewHolder(
|
||||||
item.all_day
|
item.all_day
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
when {
|
when {
|
||||||
|
|
||||||
// no periods.
|
// no periods.
|
||||||
|
@ -2409,7 +2464,9 @@ class ColumnViewHolder(
|
||||||
val sb = periods
|
val sb = periods
|
||||||
tvAnnouncementPeriod.vg(sb != null)?.text = sb
|
tvAnnouncementPeriod.vg(sb != null)?.text = sb
|
||||||
|
|
||||||
|
tvAnnouncementContent.textColor = content_color
|
||||||
tvAnnouncementContent.text = item.decoded_content
|
tvAnnouncementContent.text = item.decoded_content
|
||||||
|
tvAnnouncementContent.tag = this@ColumnViewHolder
|
||||||
announcementContentInvalidator.register(item.decoded_content)
|
announcementContentInvalidator.register(item.decoded_content)
|
||||||
|
|
||||||
// リアクションの表示
|
// リアクションの表示
|
||||||
|
@ -2418,6 +2475,7 @@ class ColumnViewHolder(
|
||||||
|
|
||||||
val buttonHeight = ActMain.boostButtonSize
|
val buttonHeight = ActMain.boostButtonSize
|
||||||
val marginBetween = (buttonHeight.toFloat() * 0.2f + 0.5f).toInt()
|
val marginBetween = (buttonHeight.toFloat() * 0.2f + 0.5f).toInt()
|
||||||
|
val marginBottom = (buttonHeight.toFloat() * 0.2f + 0.5f).toInt()
|
||||||
|
|
||||||
val paddingH = (buttonHeight.toFloat() * 0.1f + 0.5f).toInt()
|
val paddingH = (buttonHeight.toFloat() * 0.1f + 0.5f).toInt()
|
||||||
val paddingV = (buttonHeight.toFloat() * 0.1f + 0.5f).toInt()
|
val paddingV = (buttonHeight.toFloat() * 0.1f + 0.5f).toInt()
|
||||||
|
@ -2439,8 +2497,10 @@ class ColumnViewHolder(
|
||||||
val blp = FlexboxLayout.LayoutParams(
|
val blp = FlexboxLayout.LayoutParams(
|
||||||
buttonHeight,
|
buttonHeight,
|
||||||
buttonHeight
|
buttonHeight
|
||||||
)
|
).apply {
|
||||||
blp.endMargin = marginBetween
|
bottomMargin = marginBottom
|
||||||
|
endMargin = marginBetween
|
||||||
|
}
|
||||||
b.layoutParams = blp
|
b.layoutParams = blp
|
||||||
b.background = ContextCompat.getDrawable(
|
b.background = ContextCompat.getDrawable(
|
||||||
activity,
|
activity,
|
||||||
|
@ -2459,7 +2519,7 @@ class ColumnViewHolder(
|
||||||
b,
|
b,
|
||||||
R.drawable.ic_add,
|
R.drawable.ic_add,
|
||||||
color = content_color,
|
color = content_color,
|
||||||
alphaMultiplier = Styler.boost_alpha
|
alphaMultiplier = 1f
|
||||||
)
|
)
|
||||||
|
|
||||||
box.addView(b)
|
box.addView(b)
|
||||||
|
@ -2477,29 +2537,30 @@ class ColumnViewHolder(
|
||||||
)
|
)
|
||||||
|
|
||||||
val actMain = activity
|
val actMain = activity
|
||||||
val emojiAnimation = Pref.bpDisableEmojiAnimation(actMain.pref)
|
val disableEmojiAnimation = Pref.bpDisableEmojiAnimation(actMain.pref)
|
||||||
|
|
||||||
for(reaction in reactions) {
|
for(reaction in reactions) {
|
||||||
|
|
||||||
val url = if(emojiAnimation) {
|
val url = if(disableEmojiAnimation) {
|
||||||
reaction.url.notEmpty() ?: reaction.static_url.notEmpty()
|
|
||||||
} else {
|
|
||||||
reaction.static_url.notEmpty() ?: reaction.url.notEmpty()
|
reaction.static_url.notEmpty() ?: reaction.url.notEmpty()
|
||||||
|
} else {
|
||||||
|
reaction.url.notEmpty() ?: reaction.static_url.notEmpty()
|
||||||
}
|
}
|
||||||
|
|
||||||
val b = Button(activity).apply {
|
val b = Button(activity).also { btn ->
|
||||||
layoutParams = FlexboxLayout.LayoutParams(
|
btn.layoutParams = FlexboxLayout.LayoutParams(
|
||||||
FlexboxLayout.LayoutParams.WRAP_CONTENT,
|
FlexboxLayout.LayoutParams.WRAP_CONTENT,
|
||||||
buttonHeight
|
buttonHeight
|
||||||
).apply {
|
).apply {
|
||||||
endMargin = marginBetween
|
endMargin = marginBetween
|
||||||
|
bottomMargin = marginBottom
|
||||||
}
|
}
|
||||||
minWidthCompat = buttonHeight
|
btn.minWidthCompat = buttonHeight
|
||||||
|
|
||||||
allCaps = false
|
btn.allCaps = false
|
||||||
tag = reaction
|
btn.tag = reaction
|
||||||
|
|
||||||
background = ContextCompat.getDrawable(
|
btn.background = ContextCompat.getDrawable(
|
||||||
actMain,
|
actMain,
|
||||||
if(reaction.me == true) {
|
if(reaction.me == true) {
|
||||||
R.drawable.bg_button_cw
|
R.drawable.bg_button_cw
|
||||||
|
@ -2508,12 +2569,12 @@ class ColumnViewHolder(
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|
||||||
setTextColor(content_color)
|
btn.setTextColor(content_color)
|
||||||
|
|
||||||
setPadding(paddingH, paddingV, paddingH, paddingV)
|
btn.setPadding(paddingH, paddingV, paddingH, paddingV)
|
||||||
|
|
||||||
|
|
||||||
text = if(url == null) {
|
btn.text = if(url == null) {
|
||||||
EmojiDecoder.decodeEmoji(options, "${reaction.name} ${reaction.count}")
|
EmojiDecoder.decodeEmoji(options, "${reaction.name} ${reaction.count}")
|
||||||
} else {
|
} else {
|
||||||
SpannableStringBuilder("${reaction.name} ${reaction.count}").also { sb ->
|
SpannableStringBuilder("${reaction.name} ${reaction.count}").also { sb ->
|
||||||
|
@ -2524,13 +2585,13 @@ class ColumnViewHolder(
|
||||||
Spannable.SPAN_EXCLUSIVE_EXCLUSIVE
|
Spannable.SPAN_EXCLUSIVE_EXCLUSIVE
|
||||||
)
|
)
|
||||||
val invalidator =
|
val invalidator =
|
||||||
NetworkEmojiInvalidator(actMain.handler, this)
|
NetworkEmojiInvalidator(actMain.handler, btn)
|
||||||
invalidator.register(sb)
|
invalidator.register(sb)
|
||||||
extra_invalidator_list.add(invalidator)
|
extra_invalidator_list.add(invalidator)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
setOnClickListener {
|
btn.setOnClickListener {
|
||||||
if(reaction.me == true) {
|
if(reaction.me == true) {
|
||||||
removeReaction(item, reaction.name)
|
removeReaction(item, reaction.name)
|
||||||
} else {
|
} else {
|
||||||
|
@ -2563,27 +2624,16 @@ class ColumnViewHolder(
|
||||||
val host = column.access_info.host
|
val host = column.access_info.host
|
||||||
val isMisskey = column.isMisskey
|
val isMisskey = column.isMisskey
|
||||||
if(sample == null) {
|
if(sample == null) {
|
||||||
EmojiPicker(activity, host, isMisskey) { name, _, _ ,unicode->
|
EmojiPicker(activity, host, isMisskey) { name, _, _, unicode, customEmoji ->
|
||||||
log.d("addReaction: $name")
|
log.d("addReaction: $name")
|
||||||
addReaction(item, TootAnnouncement.Reaction(jsonObject {
|
addReaction(item, TootAnnouncement.Reaction(jsonObject {
|
||||||
put("name", unicode ?: name )
|
put("name", unicode ?: name)
|
||||||
put("count", 1)
|
put("count", 1)
|
||||||
put("me", true)
|
put("me", true)
|
||||||
|
|
||||||
// 以下はカスタム絵文字のみ
|
// 以下はカスタム絵文字のみ
|
||||||
if(unicode == null){
|
if(customEmoji != null) {
|
||||||
val map = App1.custom_emoji_lister.getMap(host, isMisskey)
|
putNotNull("url", customEmoji.url)
|
||||||
if(map == null) {
|
putNotNull("static_url", customEmoji.static_url)
|
||||||
showToast(activity, false, "emoji map is null")
|
|
||||||
return@EmojiPicker
|
|
||||||
}
|
|
||||||
val ce = map[name]
|
|
||||||
if(ce == null) {
|
|
||||||
showToast(activity, false, "emoji '$name' not found.")
|
|
||||||
return@EmojiPicker
|
|
||||||
}
|
|
||||||
putNotNull("url", ce.url)
|
|
||||||
putNotNull("static_url", ce.static_url)
|
|
||||||
}
|
}
|
||||||
}))
|
}))
|
||||||
}.show()
|
}.show()
|
||||||
|
@ -2603,6 +2653,7 @@ class ColumnViewHolder(
|
||||||
if(result.jsonObject == null) {
|
if(result.jsonObject == null) {
|
||||||
showToast(activity, true, result.error)
|
showToast(activity, true, result.error)
|
||||||
} else {
|
} else {
|
||||||
|
sample.count = 0
|
||||||
val list = item.reactions
|
val list = item.reactions
|
||||||
if(list == null) {
|
if(list == null) {
|
||||||
item.reactions = mutableListOf(sample)
|
item.reactions = mutableListOf(sample)
|
||||||
|
@ -2612,7 +2663,7 @@ class ColumnViewHolder(
|
||||||
list.add(sample)
|
list.add(sample)
|
||||||
} else {
|
} else {
|
||||||
reaction.me = true
|
reaction.me = true
|
||||||
++reaction.count
|
++ reaction.count
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
column.announcementUpdated = SystemClock.elapsedRealtime()
|
column.announcementUpdated = SystemClock.elapsedRealtime()
|
||||||
|
|
|
@ -34,7 +34,8 @@ class EmojiPicker(
|
||||||
name : String,
|
name : String,
|
||||||
instance : String?,
|
instance : String?,
|
||||||
bInstanceHasCustomEmoji : Boolean,
|
bInstanceHasCustomEmoji : Boolean,
|
||||||
unicode:String?
|
unicode : String?,
|
||||||
|
customEmoji : CustomEmoji?
|
||||||
) -> Unit
|
) -> Unit
|
||||||
// onEmojiPickedのinstance引数は通常の絵文字ならnull、カスタム絵文字なら非null、
|
// onEmojiPickedのinstance引数は通常の絵文字ならnull、カスタム絵文字なら非null、
|
||||||
) : View.OnClickListener, ViewPager.OnPageChangeListener {
|
) : View.OnClickListener, ViewPager.OnPageChangeListener {
|
||||||
|
@ -92,7 +93,7 @@ class EmojiPicker(
|
||||||
private var custom_list = ArrayList<EmojiItem>()
|
private var custom_list = ArrayList<EmojiItem>()
|
||||||
private var custom_categories = ArrayList<CustomCategory>()
|
private var custom_categories = ArrayList<CustomCategory>()
|
||||||
|
|
||||||
private val emoji_url_map = HashMap<String, String>()
|
private val emoji_url_map = HashMap<String, CustomEmoji>()
|
||||||
|
|
||||||
private val recent_page_idx : Int
|
private val recent_page_idx : Int
|
||||||
|
|
||||||
|
@ -237,7 +238,7 @@ class EmojiPicker(
|
||||||
newList[category] = subList
|
newList[category] = subList
|
||||||
}
|
}
|
||||||
subList.add(EmojiItem(emoji.shortcode, instance))
|
subList.add(EmojiItem(emoji.shortcode, instance))
|
||||||
emoji_url_map[emoji.shortcode] = emoji.url
|
emoji_url_map[emoji.shortcode] = emoji
|
||||||
}
|
}
|
||||||
// compose categories data list
|
// compose categories data list
|
||||||
val entries = newList.entries
|
val entries = newList.entries
|
||||||
|
@ -452,7 +453,7 @@ class EmojiPicker(
|
||||||
layoutParams = AbsListView.LayoutParams(wh, wh)
|
layoutParams = AbsListView.LayoutParams(wh, wh)
|
||||||
}
|
}
|
||||||
view.setTag(R.id.btnAbout, item)
|
view.setTag(R.id.btnAbout, item)
|
||||||
(view as? NetworkEmojiView)?.setEmoji(emoji_url_map[item.name])
|
(view as? NetworkEmojiView)?.setEmoji(emoji_url_map[item.name]?.url)
|
||||||
} else {
|
} else {
|
||||||
if(viewOld == null) {
|
if(viewOld == null) {
|
||||||
view = ImageView(activity)
|
view = ImageView(activity)
|
||||||
|
@ -506,7 +507,7 @@ class EmojiPicker(
|
||||||
var name = item.name
|
var name = item.name
|
||||||
if(item.instance != null && item.instance.isNotEmpty()) {
|
if(item.instance != null && item.instance.isNotEmpty()) {
|
||||||
// カスタム絵文字
|
// カスタム絵文字
|
||||||
selected(name, item.instance,null)
|
selected(name, item.instance, customEmoji = emoji_url_map[item.name])
|
||||||
} else {
|
} else {
|
||||||
// 普通の絵文字
|
// 普通の絵文字
|
||||||
var ei = EmojiMap.sShortNameToEmojiInfo[name] ?: return
|
var ei = EmojiMap.sShortNameToEmojiInfo[name] ?: return
|
||||||
|
@ -514,20 +515,25 @@ class EmojiPicker(
|
||||||
if(page.hasSkinTone) {
|
if(page.hasSkinTone) {
|
||||||
val sv = applySkinTone(name)
|
val sv = applySkinTone(name)
|
||||||
val tmp = EmojiMap.sShortNameToEmojiInfo[sv]
|
val tmp = EmojiMap.sShortNameToEmojiInfo[sv]
|
||||||
if( tmp!=null){
|
if(tmp != null) {
|
||||||
ei = tmp
|
ei = tmp
|
||||||
name = sv
|
name = sv
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
selected(name, null,ei.unified)
|
selected(name, null, unicode= ei.unified)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// name はスキントーン適用済みであること
|
// name はスキントーン適用済みであること
|
||||||
internal fun selected(name : String, instance : String?,unicode:String?) {
|
internal fun selected(
|
||||||
|
name : String,
|
||||||
|
instance : String?,
|
||||||
|
unicode : String? = null,
|
||||||
|
customEmoji : CustomEmoji? = null
|
||||||
|
) {
|
||||||
|
|
||||||
dialog.dismissSafe()
|
dialog.dismissSafe()
|
||||||
|
|
||||||
|
@ -571,7 +577,7 @@ class EmojiPicker(
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
onEmojiPicked(name, instance, bInstanceHasCustomEmoji,unicode)
|
onEmojiPicked(name, instance, bInstanceHasCustomEmoji, unicode,customEmoji)
|
||||||
}
|
}
|
||||||
|
|
||||||
internal inner class EmojiPickerPagerAdapter : androidx.viewpager.widget.PagerAdapter() {
|
internal inner class EmojiPickerPagerAdapter : androidx.viewpager.widget.PagerAdapter() {
|
||||||
|
|
|
@ -1014,7 +1014,11 @@ class PostHelper(
|
||||||
}
|
}
|
||||||
|
|
||||||
private val open_picker_emoji : Runnable = Runnable {
|
private val open_picker_emoji : Runnable = Runnable {
|
||||||
EmojiPicker(activity, instance, isMisskey) { name, instance, bInstanceHasCustomEmoji,_ ->
|
EmojiPicker(
|
||||||
|
activity,
|
||||||
|
instance,
|
||||||
|
isMisskey
|
||||||
|
) { name, instance, bInstanceHasCustomEmoji, _, _ ->
|
||||||
val et = this.et ?: return@EmojiPicker
|
val et = this.et ?: return@EmojiPicker
|
||||||
|
|
||||||
val src = et.text ?: ""
|
val src = et.text ?: ""
|
||||||
|
@ -1042,7 +1046,11 @@ class PostHelper(
|
||||||
}
|
}
|
||||||
|
|
||||||
fun openEmojiPickerFromMore() {
|
fun openEmojiPickerFromMore() {
|
||||||
EmojiPicker(activity, instance, isMisskey) { name, instance, bInstanceHasCustomEmoji,_ ->
|
EmojiPicker(
|
||||||
|
activity,
|
||||||
|
instance,
|
||||||
|
isMisskey
|
||||||
|
) { name, instance, bInstanceHasCustomEmoji, _, _ ->
|
||||||
val et = this.et ?: return@EmojiPicker
|
val et = this.et ?: return@EmojiPicker
|
||||||
|
|
||||||
val src = et.text ?: ""
|
val src = et.text ?: ""
|
||||||
|
|
|
@ -0,0 +1,12 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<ripple
|
||||||
|
xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:color="?attr/colorRippleEffect"
|
||||||
|
>
|
||||||
|
<item android:id="@android:id/mask">
|
||||||
|
<shape android:shape="rectangle">
|
||||||
|
<solid android:color="@android:color/white" />
|
||||||
|
<corners android:radius="6dp" />
|
||||||
|
</shape>
|
||||||
|
</item>
|
||||||
|
</ripple>
|
Loading…
Reference in New Issue