- 「アプリ設定/見た目/アプリ内蔵のUnicode絵文字を使う」を削除

- 「アプリ設定/見た目/Twemoji絵文字を使う」を追加
- Unicode絵文字を表示する場所でTwemojiとNotoColorEmojiCompatの使い分け
- 依存関係の追加/更新
androidx.annotation:annotation
androidx.appcompat:appcompat
androidx.emoji2:emoji2
androidx.emoji2:emoji2-bundled
androidx.emoji2:emoji2-views
androidx.emoji2:emoji2-views-helper
com.google.android.exoplayer:exoplayer
This commit is contained in:
tateisu 2021-11-08 18:29:11 +09:00
parent e9eab2b7fb
commit ed3d8a66b9
12 changed files with 150 additions and 90 deletions

View File

@ -137,9 +137,14 @@ dependencies {
implementation project(':emoji') implementation project(':emoji')
implementation project(':apng_android') implementation project(':apng_android')
implementation "androidx.appcompat:appcompat:$appcompat_version" implementation "androidx.appcompat:appcompat:$appcompat_version"
def emojiVersion = "1.0.0-rc01"
implementation "androidx.emoji2:emoji2:$emojiVersion"
implementation "androidx.emoji2:emoji2-bundled:$emojiVersion"
implementation "androidx.emoji2:emoji2-views:$emojiVersion"
implementation "androidx.emoji2:emoji2-views-helper:$emojiVersion"
// DrawerLayout // DrawerLayout
implementation "androidx.drawerlayout:drawerlayout:1.1.1" implementation "androidx.drawerlayout:drawerlayout:1.1.1"
@ -157,7 +162,7 @@ dependencies {
// Recyclerview // Recyclerview
implementation "androidx.recyclerview:recyclerview:1.2.1" implementation "androidx.recyclerview:recyclerview:1.2.1"
kapt 'androidx.annotation:annotation:1.2.0' kapt 'androidx.annotation:annotation:1.3.0'
// https://firebase.google.com/support/release-notes/android // https://firebase.google.com/support/release-notes/android
implementation "com.google.firebase:firebase-messaging:23.0.0" implementation "com.google.firebase:firebase-messaging:23.0.0"
@ -228,7 +233,7 @@ dependencies {
implementation 'com.astuetz:pagerslidingtabstrip:1.0.1' implementation 'com.astuetz:pagerslidingtabstrip:1.0.1'
implementation 'com.google.android.exoplayer:exoplayer:2.15.1' implementation 'com.google.android.exoplayer:exoplayer:2.16.0'
/* /*
WARNING: [Processor] Library '…\exoplayer-ui-2.12.0.aar' contains references to both AndroidX and old support library. This seems like the library is partially migrated. Jetifier will try to rewrite the library anyway. WARNING: [Processor] Library '…\exoplayer-ui-2.12.0.aar' contains references to both AndroidX and old support library. This seems like the library is partially migrated. Jetifier will try to rewrite the library anyway.
Example of androidX reference: 'androidx/core/app/NotificationCompat$Builder' Example of androidX reference: 'androidx/core/app/NotificationCompat$Builder'

View File

@ -343,7 +343,7 @@ class ActMain : AppCompatActivity(),
density = appState.density density = appState.density
completionHelper = CompletionHelper(this, pref, appState.handler) completionHelper = CompletionHelper(this, pref, appState.handler)
EmojiDecoder.handleUnicodeEmoji = PrefB.bpInAppUnicodeEmoji(pref) EmojiDecoder.useTwemoji = PrefB.bpUseTwemoji(pref)
acctPadLr = (0.5f + 4f * density).toInt() acctPadLr = (0.5f + 4f * density).toInt()
reloadTextSize() reloadTextSize()

View File

@ -12,9 +12,10 @@ import android.widget.ImageButton
import android.widget.ImageView import android.widget.ImageView
import androidx.annotation.DrawableRes import androidx.annotation.DrawableRes
import androidx.core.content.ContextCompat import androidx.core.content.ContextCompat
import jp.juggler.subwaytooter.emoji.EmojiMap
import jp.juggler.subwaytooter.api.entity.TootAccount import jp.juggler.subwaytooter.api.entity.TootAccount
import jp.juggler.subwaytooter.api.entity.TootVisibility import jp.juggler.subwaytooter.api.entity.TootVisibility
import jp.juggler.subwaytooter.emoji.EmojiMap
import jp.juggler.subwaytooter.pref.PrefB
import jp.juggler.subwaytooter.pref.PrefI import jp.juggler.subwaytooter.pref.PrefI
import jp.juggler.subwaytooter.pref.pref import jp.juggler.subwaytooter.pref.pref
import jp.juggler.subwaytooter.span.EmojiImageSpan import jp.juggler.subwaytooter.span.EmojiImageSpan
@ -384,14 +385,24 @@ fun SpannableStringBuilder.appendMisskeyReaction(
emojiUtf16: String, emojiUtf16: String,
text: String text: String
): SpannableStringBuilder { ): SpannableStringBuilder {
val start = this.length
this.append(text)
val end = this.length
this.setSpan( val emoji = EmojiMap.unicodeMap[emojiUtf16]
EmojiMap.unicodeMap[emojiUtf16]!!.createSpan(context), when {
start, end, emoji == null ->
Spanned.SPAN_EXCLUSIVE_EXCLUSIVE append("text")
)
PrefB.bpUseTwemoji(context) -> {
val start = this.length
append(text)
val end = this.length
this.setSpan(
emoji.createSpan(context),
start, end,
Spanned.SPAN_EXCLUSIVE_EXCLUSIVE
)
}
else ->
this.append(emoji.unifiedCode)
}
return this return this
} }

View File

@ -784,7 +784,7 @@ val appSettingRoot = AppSettingItem(null, SettingType.Section, R.string.app_sett
sw(PrefB.bpEmojioneShortcode, R.string.emojione_shortcode_support) { sw(PrefB.bpEmojioneShortcode, R.string.emojione_shortcode_support) {
desc = R.string.emojione_shortcode_support_desc desc = R.string.emojione_shortcode_support_desc
} }
sw(PrefB.bpInAppUnicodeEmoji, R.string.in_app_unicode_emoji) sw(PrefB.bpUseTwemoji, R.string.use_twemoji_emoji)
sw(PrefB.bpKeepReactionSpace, R.string.keep_reaction_space) sw(PrefB.bpKeepReactionSpace, R.string.keep_reaction_space)
} }

View File

@ -568,39 +568,50 @@ internal class ViewHolderHeaderProfile(
} }
} }
private fun encodeAcctText(who: TootAccount, whoDetail: TootAccount?) = SpannableStringBuilder().apply { private fun encodeAcctText(who: TootAccount, whoDetail: TootAccount?) =
append("@") SpannableStringBuilder().apply {
append(accessInfo.getFullAcct(who).pretty) append("@")
if (whoDetail?.locked ?: who.locked) { append(accessInfo.getFullAcct(who).pretty)
append(" ") if (whoDetail?.locked ?: who.locked) {
val emoji = EmojiMap.shortNameMap["lock"] append(" ")
if (emoji != null) { val emoji = EmojiMap.shortNameMap["lock"]
appendSpan("locked", emoji.createSpan(activity)) when {
} else { emoji == null ->
append("locked") append("locked")
} PrefB.bpUseTwemoji(App1.pref) ->
} appendSpan("locked", emoji.createSpan(activity))
else ->
append(emoji.unifiedCode)
}
if (who.bot) {
append(" ")
val emoji = EmojiMap.shortNameMap["robot_face"]
if (emoji != null) {
appendSpan("bot", emoji.createSpan(activity))
} else {
append("bot")
} }
}
if (who.suspended) { if (who.bot) {
append(" ") append(" ")
val emoji = EmojiMap.shortNameMap["cross_mark"] val emoji = EmojiMap.shortNameMap["robot_face"]
if (emoji != null) { when {
appendSpan("suspended", emoji.createSpan(activity)) emoji == null ->
} else { append("bot")
append("suspended") PrefB.bpUseTwemoji(App1.pref) ->
appendSpan("bot", emoji.createSpan(activity))
else ->
append(emoji.unifiedCode)
}
}
if (who.suspended) {
append(" ")
val emoji = EmojiMap.shortNameMap["cross_mark"]
when {
emoji == null ->
append("suspended")
PrefB.bpUseTwemoji(App1.pref) ->
appendSpan("suspended", emoji.createSpan(activity))
else ->
append(emoji.unifiedCode)
}
} }
} }
}
private fun encodeMisskeyExtra(whoDetail: TootAccount?) = SpannableStringBuilder().apply { private fun encodeMisskeyExtra(whoDetail: TootAccount?) = SpannableStringBuilder().apply {
var s = whoDetail?.location var s = whoDetail?.location

View File

@ -6,6 +6,7 @@ import android.app.Dialog
import android.graphics.Typeface import android.graphics.Typeface
import android.graphics.drawable.PictureDrawable import android.graphics.drawable.PictureDrawable
import android.util.SparseArray import android.util.SparseArray
import android.util.TypedValue
import android.view.* import android.view.*
import android.widget.* import android.widget.*
import androidx.annotation.StringRes import androidx.annotation.StringRes
@ -463,8 +464,13 @@ class EmojiPicker(
val view: View val view: View
val item = page.emojiList[position] val item = page.emojiList[position]
var unicodeEmoji = item.unicodeEmoji var unicodeEmoji = item.unicodeEmoji
if (unicodeEmoji != null) { if (unicodeEmoji == null) {
view = viewOld ?: NetworkEmojiView(activity).apply {
layoutParams = AbsListView.LayoutParams(wh, wh)
}
view.setTag(R.id.btnAbout, item)
(view as? NetworkEmojiView)?.setEmoji(customEmojiMap[item.name]?.url)
} else if(PrefB.bpUseTwemoji(App1.pref)){
view = viewOld view = viewOld
?: ImageView(activity).apply { ?: ImageView(activity).apply {
layoutParams = AbsListView.LayoutParams(wh, wh) layoutParams = AbsListView.LayoutParams(wh, wh)
@ -486,12 +492,22 @@ class EmojiPicker(
.into(view) .into(view)
} }
} }
} else { }else{
view = viewOld ?: NetworkEmojiView(activity).apply { view = viewOld
layoutParams = AbsListView.LayoutParams(wh, wh) ?: TextView(activity).apply {
} layoutParams = AbsListView.LayoutParams(wh, wh)
}
view.setTag(R.id.btnAbout, item) view.setTag(R.id.btnAbout, item)
(view as? NetworkEmojiView)?.setEmoji(customEmojiMap[item.name]?.url)
if (view is TextView && view.activity?.isDestroyed == false) {
if (page.hasSkinTone) unicodeEmoji = applySkinTone(unicodeEmoji)
view.text = unicodeEmoji.unifiedCode
view.gravity = Gravity.CENTER
view.setLineSpacing(0f,0f)
view.setTextSize(TypedValue.COMPLEX_UNIT_PX, wh.toFloat()*0.7f)
}
} }
return view return view

View File

@ -319,9 +319,9 @@ object PrefB {
false false
) )
val bpInAppUnicodeEmoji = BooleanPref( val bpUseTwemoji = BooleanPref(
"InAppUnicodeEmoji", "UseTwemoji",
true false
) )
val bpKeepReactionSpace = BooleanPref( val bpKeepReactionSpace = BooleanPref(
@ -347,4 +347,4 @@ object PrefB {
"MfmDecorationShowUnsupportedMarkup", "MfmDecorationShowUnsupportedMarkup",
true true
) )
} }

View File

@ -8,14 +8,16 @@ import android.text.style.ReplacementSpan
import androidx.annotation.IntRange import androidx.annotation.IntRange
import com.caverock.androidsvg.SVG import com.caverock.androidsvg.SVG
import jp.juggler.subwaytooter.emoji.UnicodeEmoji import jp.juggler.subwaytooter.emoji.UnicodeEmoji
import jp.juggler.subwaytooter.pref.PrefB
import jp.juggler.util.LogCategory import jp.juggler.util.LogCategory
// 絵文字リソースの種類によって異なるスパンを作る // 絵文字リソースの種類によって異なるスパンを作る
fun UnicodeEmoji.createSpan(context: Context, scale: Float = 1f) = if (isSvg) { fun UnicodeEmoji.createSpan(context: Context, scale: Float = 1f) =
SvgEmojiSpan(context, assetsName!!, scale = scale) if (isSvg) {
} else { SvgEmojiSpan(context, assetsName!!, scale = scale)
EmojiImageSpan(context, drawableId, scale = scale) } else {
} EmojiImageSpan(context, drawableId, scale = scale)
}
// SVG絵文字スパン // SVG絵文字スパン
class SvgEmojiSpan internal constructor( class SvgEmojiSpan internal constructor(

View File

@ -7,11 +7,11 @@ import android.text.Spanned
import android.util.SparseBooleanArray import android.util.SparseBooleanArray
import androidx.annotation.DrawableRes import androidx.annotation.DrawableRes
import jp.juggler.subwaytooter.App1 import jp.juggler.subwaytooter.App1
import jp.juggler.subwaytooter.pref.PrefB
import jp.juggler.subwaytooter.R import jp.juggler.subwaytooter.R
import jp.juggler.subwaytooter.emoji.CustomEmoji import jp.juggler.subwaytooter.emoji.CustomEmoji
import jp.juggler.subwaytooter.emoji.EmojiMap import jp.juggler.subwaytooter.emoji.EmojiMap
import jp.juggler.subwaytooter.emoji.UnicodeEmoji import jp.juggler.subwaytooter.emoji.UnicodeEmoji
import jp.juggler.subwaytooter.pref.PrefB
import jp.juggler.subwaytooter.pref.pref import jp.juggler.subwaytooter.pref.pref
import jp.juggler.subwaytooter.span.EmojiImageSpan import jp.juggler.subwaytooter.span.EmojiImageSpan
import jp.juggler.subwaytooter.span.HighlightSpan import jp.juggler.subwaytooter.span.HighlightSpan
@ -32,13 +32,14 @@ object EmojiDecoder {
private const val cpZwsp = '\u200B'.code private const val cpZwsp = '\u200B'.code
var handleUnicodeEmoji = true var useTwemoji = true
fun customEmojiSeparator(pref: SharedPreferences) = if (PrefB.bpCustomEmojiSeparatorZwsp(pref)) { fun customEmojiSeparator(pref: SharedPreferences) =
'\u200B' if (PrefB.bpCustomEmojiSeparatorZwsp(pref)) {
} else { '\u200B'
' ' } else {
} ' '
}
// タンス側が落ち着いたら [^[:almun:]_] から [:space:]に切り替える // タンス側が落ち着いたら [^[:almun:]_] から [:space:]に切り替える
// private fun isHeadOrAfterWhitespace( s:CharSequence,index:Int):Boolean { // private fun isHeadOrAfterWhitespace( s:CharSequence,index:Int):Boolean {
@ -168,26 +169,33 @@ object EmojiDecoder {
fun addImageSpan(text: String, emoji: UnicodeEmoji) { fun addImageSpan(text: String, emoji: UnicodeEmoji) {
val context = options.context val context = options.context
if (context == null) { when {
openNormalText() context == null -> {
sb.append(text) openNormalText()
} else { sb.append(text)
closeNormalText() }
val start = sb.length PrefB.bpUseTwemoji(context) -> {
sb.append(text) closeNormalText()
val end = sb.length val start = sb.length
sb.setSpan( sb.append(text)
emoji.createSpan(context, scale = options.enlargeEmoji), val end = sb.length
start, sb.setSpan(
end, emoji.createSpan(context, scale = options.enlargeEmoji),
Spanned.SPAN_EXCLUSIVE_EXCLUSIVE start,
) end,
Spanned.SPAN_EXCLUSIVE_EXCLUSIVE
)
}
else -> {
openNormalText()
sb.append(emoji.unifiedCode)
}
} }
} }
fun addUnicodeString(s: String) { fun addUnicodeString(s: String) {
if (!handleUnicodeEmoji) { if (!useTwemoji) {
openNormalText() openNormalText()
sb.append(s) sb.append(s)
return return
@ -466,16 +474,21 @@ object EmojiDecoder {
val emoji = EmojiMap.shortNameMap[shortCode] ?: continue val emoji = EmojiMap.shortNameMap[shortCode] ?: continue
val sb = SpannableStringBuilder() val sb = SpannableStringBuilder()
val start = 0
sb.append(' ')
val end = sb.length
sb.setSpan( if(PrefB.bpUseTwemoji(context)){
emoji.createSpan(context), val start = 0
start, sb.append(' ')
end, val end = sb.length
Spanned.SPAN_EXCLUSIVE_EXCLUSIVE
) sb.setSpan(
emoji.createSpan(context),
start,
end,
Spanned.SPAN_EXCLUSIVE_EXCLUSIVE
)
}else{
sb.append(emoji.unifiedCode)
}
sb.append(' ') sb.append(' ')
.append(':') .append(':')

View File

@ -1101,4 +1101,5 @@
<string name="mfm_show_unsupported_markup">(Misskey)未対応のマークアップを表示する</string> <string name="mfm_show_unsupported_markup">(Misskey)未対応のマークアップを表示する</string>
<string name="show_media_description">添付メディアの説明文を表示する</string> <string name="show_media_description">添付メディアの説明文を表示する</string>
<string name="background_pattern">背景パターン</string> <string name="background_pattern">背景パターン</string>
<string name="use_twemoji_emoji">Twemoji絵文字を使う</string>
</resources> </resources>

View File

@ -1112,4 +1112,5 @@
<string name="mfm_show_unsupported_markup">(Misskey)Show unsupported markups</string> <string name="mfm_show_unsupported_markup">(Misskey)Show unsupported markups</string>
<string name="show_media_description">Show media description</string> <string name="show_media_description">Show media description</string>
<string name="background_pattern">Background pattern</string> <string name="background_pattern">Background pattern</string>
<string name="use_twemoji_emoji">Use Twemoji emoji</string>
</resources> </resources>

View File

@ -6,7 +6,7 @@ buildscript {
ext.target_sdk_version = 31 ext.target_sdk_version = 31
ext.compile_sdk_version = 31 ext.compile_sdk_version = 31
ext.appcompat_version = '1.3.1' ext.appcompat_version = '1.4.0-rc01'
ext.lifecycle_version = "2.4.0" ext.lifecycle_version = "2.4.0"
ext.arch_version = "2.1.0" ext.arch_version = "2.1.0"