v3.5.6. 長すぎるハッシュタグの表示を改善

This commit is contained in:
tateisu 2019-07-09 20:56:22 +09:00
parent 7f59bc7197
commit 0415d183da
6 changed files with 63 additions and 36 deletions

View File

@ -40,7 +40,7 @@
</value>
</option>
</component>
<component name="ProjectRootManager" version="2" languageLevel="JDK_1_7" default="true" project-jdk-name="1.8" project-jdk-type="JavaSDK">
<component name="ProjectRootManager" version="2" languageLevel="JDK_1_8" default="true" project-jdk-name="1.8" project-jdk-type="JavaSDK">
<output url="file://$PROJECT_DIR$/build/classes" />
</component>
<component name="ProjectType">

View File

@ -13,8 +13,8 @@ android {
targetSdkVersion target_sdk_version
minSdkVersion min_sdk_version
versionCode 355
versionName "3.5.5"
versionCode 356
versionName "3.5.6"
applicationId "jp.juggler.subwaytooter"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"

View File

@ -226,6 +226,8 @@ class Column(
internal const val QUICK_FILTER_REACTION = 5
internal const val QUICK_FILTER_VOTE = 6
internal const val HASHTAG_ELLIPSIZE = 26
@Suppress("UNCHECKED_CAST")
private inline fun <reified T> getParamAt(params : Array<out Any>, idx : Int) : T {
return params[idx] as T
@ -388,7 +390,6 @@ class Column(
})
}
private val columnIdMap = HashMap<String, WeakReference<Column>?>()
private fun registerColumnId(id : String, column : Column) {
synchronized(columnIdMap) {
@ -818,6 +819,9 @@ class Column(
TYPE_HASHTAG_FROM_ACCT -> {
hashtag = src.optString(KEY_HASHTAG)
hashtag_acct = src.optString(KEY_HASHTAG_ACCT)
hashtag_any = src.optString(KEY_HASHTAG_ANY)
hashtag_all = src.optString(KEY_HASHTAG_ALL)
hashtag_none = src.optString(KEY_HASHTAG_NONE)
}
TYPE_NOTIFICATION_FROM_ACCT -> {
@ -1011,33 +1015,26 @@ class Column(
(status_id?.toString() ?: "null")
)
TYPE_HASHTAG -> {
val sb = StringBuilder(context.getString(R.string.hashtag_of, hashtag))
if(hashtag_any.isNotBlank()) sb.append(' ').append(
TYPE_HASHTAG ->
StringBuilder(
context.getString(
R.string.hashtag_title_any,
hashtag_any
R.string.hashtag_of,
hashtag.ellipsizeDot3(HASHTAG_ELLIPSIZE)
)
)
if(hashtag_all.isNotBlank()) sb.append(' ').append(
context.getString(
R.string.hashtag_title_all,
hashtag_all
)
)
if(hashtag_none.isNotBlank()) sb.append(' ').append(
context.getString(
R.string.hashtag_title_none,
hashtag_none
)
)
sb.toString()
}
.appendHashtagExtra()
.toString()
TYPE_HASHTAG_FROM_ACCT -> {
context.getString(R.string.hashtag_of_from, hashtag, hashtag_acct)
}
TYPE_HASHTAG_FROM_ACCT ->
StringBuilder(
context.getString(
R.string.hashtag_of_from,
hashtag.ellipsizeDot3(HASHTAG_ELLIPSIZE),
hashtag_acct
)
)
.appendHashtagExtra()
.toString()
TYPE_NOTIFICATION_FROM_ACCT -> {
context.getString(
@ -1574,7 +1571,6 @@ class Column(
return status.checkMuted()
}
internal fun isFiltered(item : TootNotification) : Boolean {
if(when(quick_filter) {
@ -1943,7 +1939,6 @@ class Column(
task.executeOnExecutor(App1.task_executor)
}
private var bMinIdMatched : Boolean = false
internal fun parseRange(
@ -2347,6 +2342,35 @@ class Column(
return streamPath != null
}
internal fun hasHashtagExtra() = when {
isMisskey -> false
column_type == TYPE_HASHTAG || column_type == TYPE_HASHTAG_FROM_ACCT -> true
else -> false
}
private fun StringBuilder.appendHashtagExtra() : StringBuilder {
val limit = ( HASHTAG_ELLIPSIZE * 2 - min( length , HASHTAG_ELLIPSIZE) ) /3
if(hashtag_any.isNotBlank()) append(' ').append(
context.getString(
R.string.hashtag_title_any,
hashtag_any.ellipsizeDot3(limit)
)
)
if(hashtag_all.isNotBlank()) append(' ').append(
context.getString(
R.string.hashtag_title_all,
hashtag_all.ellipsizeDot3(limit)
)
)
if(hashtag_none.isNotBlank()) append(' ').append(
context.getString(
R.string.hashtag_title_none,
hashtag_none.ellipsizeDot3(limit)
)
)
return this
}
fun canReloadWhenRefreshTop() : Boolean {
return when(column_type) {
@ -2902,7 +2926,6 @@ class Column(
}
}
internal fun loadFilter2(client : TootApiClient) : ArrayList<TootFilter>? {
if(access_info.isPseudo || access_info.isMisskey) return null
val column_context = getFilterContext()

View File

@ -682,7 +682,7 @@ class ColumnViewHolder(
vg(llListList, column.column_type == Column.TYPE_LIST_LIST)
vg(cbResolve, column.column_type == Column.TYPE_SEARCH)
vg(llHashtagExtra, column.column_type == Column.TYPE_HASHTAG && ! column.isMisskey)
vg(llHashtagExtra, column.hasHashtagExtra())
etHashtagExtraAny.setText(column.hashtag_any)
etHashtagExtraAll.setText(column.hashtag_all)
etHashtagExtraNone.setText(column.hashtag_none)

View File

@ -138,7 +138,7 @@ inline fun <S : CharSequence, Z : Any?> S?.letNotEmpty(block : (S) -> Z?) : Z? =
// usage: str.notEmpty() ?: fallback
// equivalent: if(this.isNotEmpty() ) this else null
fun <S : CharSequence> S?.notEmpty() :S? = if( this?.isNotEmpty() ==true ) this else null
fun <S : CharSequence> S?.notEmpty() : S? = if(this?.isNotEmpty() == true) this else null
////////////////////////////////////////////////////////////////////
// string
@ -150,7 +150,7 @@ fun String.encodeUTF8() = this.toByteArray(charsetUTF8)
fun ByteArray.decodeUTF8() = this.toString(charsetUTF8)
fun String.codePointCount(beginIndex:Int = 0): Int = this.codePointCount(beginIndex, this.length)
fun String.codePointCount(beginIndex : Int = 0) : Int = this.codePointCount(beginIndex, this.length)
// 16進ダンプ
fun ByteArray.encodeHex() : String {
@ -192,8 +192,12 @@ fun String?.filterNotEmpty() : String? = when {
else -> this
}
//fun String.ellipsize(max : Int) = if(this.length > max) this.substring(0, max - 1) + "…" else this
//
fun String?.ellipsizeDot3(max : Int) = when {
this == null -> null
this.length > max -> this.substring(0, max - 1) + ""
else -> this
}
//fun String.toCamelCase() : String {
// val sb = StringBuilder()
// for(s in this.split("_".toRegex())) {

View File

@ -893,7 +893,7 @@
<string name="vote_button">投票</string>
<string name="end_of_polling_from">%1$sの調査の終了</string>
<string name="open_hashtag_from_account">(%1$sからの)ハッシュタグのカラムを開く</string>
<string name="hashtag_of_from">Hashtag :#%1$s (%2$sから)</string>
<string name="hashtag_of_from">ハッシュタグ #%1$s (%2$sから)</string>
<string name="boost_with_visibility">公開範囲を指定してブースト</string>
<string name="confirm_private_boost_from">このトゥートを %1$s からブーストしますか? 全てのフォロワーに公開されます</string>
<string name="quick_toot_menu">簡易投稿メニュー</string>