- アプリ設定に「見た目/アイコンの角丸率」を追加

- アプリ設定に「性能/カラム間でViewPoolを共有する」を追加
This commit is contained in:
tateisu 2018-01-18 16:53:32 +09:00
parent 3bc2a7384d
commit 3edab11faf
19 changed files with 241 additions and 105 deletions

View File

@ -12,8 +12,8 @@ android {
minSdkVersion 21
targetSdkVersion 27
versionCode 205
versionName "2.0.5"
versionCode 206
versionName "2.0.6"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"

View File

@ -212,7 +212,10 @@ class ActAccountSetting : AppCompatActivity(), View.OnClickListener, CompoundBut
}
}
var density: Float = 1f
private fun initUI() {
this.density = resources.displayMetrics.density
this.handler = Handler()
setContentView(R.layout.act_account_setting)
@ -633,7 +636,13 @@ class ActAccountSetting : AppCompatActivity(), View.OnClickListener, CompoundBut
}
internal fun showProfile(src : TootAccount) {
ivProfileAvatar.setImageUrl(App1.pref, 16f, src.avatar_static, src.avatar)
ivProfileAvatar.setImageUrl(
App1.pref,
Styler.calcIconRound(ivProfileAvatar.layoutParams),
src.avatar_static,
src.avatar
)
ivProfileHeader.setImageUrl(App1.pref, 0f, src.header_static, src.header)
val display_name = src.display_name

View File

@ -118,6 +118,8 @@ class ActAppSetting : AppCompatActivity()
private lateinit var etQuoteNameFormat : EditText
private lateinit var etAutoCWLines : EditText
private lateinit var etMediaSizeMax : EditText
private lateinit var etRoundRatio : EditText
private lateinit var tvTimelineFontUrl : TextView
private var timeline_font : String? = null
@ -261,6 +263,9 @@ class ActAppSetting : AppCompatActivity()
etMediaSizeMax = findViewById(R.id.etMediaSizeMax)
etMediaSizeMax.addTextChangedListener(this)
etRoundRatio = findViewById(R.id.etRoundRatio)
etRoundRatio.addTextChangedListener(this)
tvTimelineFontSize = findViewById(R.id.tvTimelineFontSize)
tvAcctFontSize = findViewById(R.id.tvAcctFontSize)
@ -307,6 +312,7 @@ class ActAppSetting : AppCompatActivity()
etAvatarIconSize.setText(Pref.spAvatarIconSize(pref))
etMediaSizeMax.setText(Pref.spMediaSizeMax(pref))
etRoundRatio.setText(Pref.spRoundRatio(pref))
timeline_font = Pref.spTimelineFont(pref)
timeline_font_bold = Pref.spTimelineFontBold(pref)
@ -350,6 +356,8 @@ class ActAppSetting : AppCompatActivity()
.put(Pref.spAutoCWLines, etAutoCWLines.text.toString().trim { it <= ' ' })
.put(Pref.spAvatarIconSize, etAvatarIconSize.text.toString().trim { it <= ' ' })
.put(Pref.spMediaSizeMax, etMediaSizeMax.text.toString().trim { it <= ' ' })
.put(Pref.spRoundRatio, etRoundRatio.text.toString().trim { it <= ' ' })
.put(Pref.spTimelineFont, timeline_font ?:"")
.put(Pref.spTimelineFontBold, timeline_font_bold?:"")

View File

@ -959,9 +959,7 @@ class ActMain : AppCompatActivity()
try {
sv = Pref.spAvatarIconSize(pref)
val fv = if( sv.isEmpty()) Float.NaN else sv.toFloat()
if(fv.isNaN() || fv.isInfinite() || fv < 1f) {
// error or bad range
} else {
if(fv.isFinite() && fv>= 1f ) {
icon_size_dp = fv
}
} catch(ex : Throwable) {
@ -971,6 +969,27 @@ class ActMain : AppCompatActivity()
avatarIconSize = (0.5f + icon_size_dp * density).toInt()
}
run {
var round_ratio = 33f
try {
if( Pref.bpDontRound(pref) ){
round_ratio = 0f
}else {
sv = Pref.spRoundRatio(pref)
if(sv.isNotEmpty()) {
val fv = sv.toFloat()
if(fv.isFinite()) {
round_ratio = fv
}
}
}
} catch(ex : Throwable) {
log.trace(ex)
}
Styler.round_ratio = clipRange(0f,1f,round_ratio/100f) *0.5f
}
llEmpty = findViewById(R.id.llEmpty)
// // toolbar

View File

@ -1005,9 +1005,9 @@ class ActPost : AppCompatActivity(), View.OnClickListener, PostAttachment.Callba
val pa = attachment_list[idx]
val a = pa.attachment
if(pa.status == PostAttachment.STATUS_UPLOADED && a != null) {
iv.setImageUrl(pref, 16f, a.preview_url)
iv.setImageUrl(pref, Styler.calcIconRound(iv.layoutParams.width), a.preview_url)
} else {
iv.setImageUrl(pref, 16f, null)
iv.setImageUrl(pref, Styler.calcIconRound(iv.layoutParams.width), null)
}
}
}
@ -1635,7 +1635,7 @@ class ActPost : AppCompatActivity(), View.OnClickListener, PostAttachment.Callba
decodeEmoji = true
).decodeHTML(this@ActPost, account, in_reply_to_text)
ivReply.setImageUrl(pref, 16f, in_reply_to_image)
ivReply.setImageUrl(pref, Styler.calcIconRound(ivReply.layoutParams), in_reply_to_image)
}
}

View File

@ -236,6 +236,7 @@ class App1 : Application() {
@SuppressLint("StaticFieldLeak")
lateinit var custom_emoji_lister : CustomEmojiLister
fun prepare(app_context : Context) : AppState {
var state = appStateX
if(state != null) return state

View File

@ -190,7 +190,10 @@ class ColumnViewHolder(
tvLoading = root.findViewById(R.id.tvLoading)
listView = root.findViewById(R.id.listView)
listView.recycledViewPool = activity.viewPool
if(Pref.bpShareViewPool(activity.pref)){
listView.recycledViewPool = activity.viewPool
}
btnSearch = root.findViewById(R.id.btnSearch)
etSearch = root.findViewById(R.id.etSearch)

View File

@ -2,6 +2,9 @@ package jp.juggler.subwaytooter
import android.support.v7.widget.RecyclerView
import android.view.ViewGroup
import jp.juggler.subwaytooter.api.entity.TootAccount
import jp.juggler.subwaytooter.api.entity.TootNotification
import jp.juggler.subwaytooter.api.entity.TootStatus
internal class ItemListAdapter(
private val activity : ActMain,
@ -14,6 +17,7 @@ internal class ItemListAdapter(
init {
this.list = column.list_data
setHasStableIds(false)
}
override fun getItemCount() : Int {
@ -23,6 +27,25 @@ internal class ItemListAdapter(
}
}
private fun getItemIdForListIndex(position : Int):Long{
val o = list[position]
return when(o){
is TootAccount -> o.id
is TootStatus -> o.id
is TootNotification -> o.id
else-> 0L
}
}
override fun getItemId(position : Int) : Long {
val headerType = column.getHeaderType()
if( headerType != null){
if(position==0) return 0
return getItemIdForListIndex(position-1)
}
return getItemIdForListIndex(position)
}
override fun getItemViewType(position : Int) : Int {
val headerType = column.getHeaderType()
if( headerType == null || position>0 ) return 0
@ -97,10 +120,7 @@ internal class ItemListAdapter(
// }
// return if(position >= 0 && position < column.list_data.size) list[position] else null
// }
override fun getItemId(position : Int) : Long {
return 0
}
// override fun hasStableIds():Boolean = false

View File

@ -197,9 +197,9 @@ internal class ItemViewHolder(
}
ivThumbnail.layoutParams.height = activity.avatarIconSize
ivThumbnail.layoutParams.width = ivThumbnail.layoutParams.height
ivFollow.layoutParams.width = ivThumbnail.layoutParams.width
ivBoosted.layoutParams.width = ivFollow.layoutParams.width
ivThumbnail.layoutParams.width = activity.avatarIconSize
ivFollow.layoutParams.width = activity.avatarIconSize
ivBoosted.layoutParams.width = activity.avatarIconSize
this.content_invalidator = NetworkEmojiInvalidator(activity.handler, tvContent)
this.spoiler_invalidator = NetworkEmojiInvalidator(activity.handler, tvContentWarning)
@ -483,7 +483,7 @@ internal class ItemViewHolder(
private fun showAccount(who : TootAccount) {
follow_account = who
llFollow.visibility = View.VISIBLE
ivFollow.setImageUrl(activity.pref, 16f, access_info.supplyBaseUrl(who.avatar_static))
ivFollow.setImageUrl(activity.pref, Styler.calcIconRound(ivFollow.layoutParams), access_info.supplyBaseUrl(who.avatar_static))
tvFollowerName.text = who.decoded_display_name
follow_invalidator.register(who.decoded_display_name)
@ -513,7 +513,7 @@ internal class ItemViewHolder(
name_invalidator.register(who.decoded_display_name)
ivThumbnail.setImageUrl(
activity.pref,
16f,
Styler.calcIconRound(ivThumbnail.layoutParams),
access_info.supplyBaseUrl(who.avatar_static),
access_info.supplyBaseUrl(who.avatar)
)

View File

@ -268,6 +268,12 @@ object Pref {
R.id.swForceGap
)
val bpShareViewPool = BooleanPref(
"ShareViewPool",
true,
R.id.swShareViewPool
)
// int
val ipBackButtonAction = IntPref("back_button_action", 0)
@ -304,6 +310,7 @@ object Pref {
val spStreamListenerConfigData = StringPref("stream_listener_config_data", "")
val spMspUserToken = StringPref("mastodon_search_portal_user_token", "")
val spEmojiPickerRecent = StringPref("emoji_picker_recent", "")
val spRoundRatio = StringPref("round_ratio", "33")
// long

View File

@ -249,4 +249,14 @@ object Styler {
lp.rightMargin = pad_lr
}
}
// ActMainの初期化時に更新される
var round_ratio :Float = 0.33f * 0.5f
fun calcIconRound(wh:Int) =wh.toFloat() * round_ratio
fun calcIconRound(lp:ViewGroup.LayoutParams)
=Math.min(lp.width,lp.height).toFloat() * round_ratio
}

View File

@ -166,7 +166,7 @@ internal class ViewHolderHeaderProfile(
ivAvatar.setImageUrl(
activity.pref,
16f,
Styler.calcIconRound(ivAvatar.layoutParams),
access_info.supplyBaseUrl(who.avatar_static),
access_info.supplyBaseUrl(who.avatar)
)
@ -228,7 +228,11 @@ internal class ViewHolderHeaderProfile(
moved_caption_invalidator.register(caption)
ivMoved.layoutParams.width = activity.avatarIconSize
ivMoved.setImageUrl(activity.pref, 16f, access_info.supplyBaseUrl(who_moved.avatar_static))
ivMoved.setImageUrl(
activity.pref,
Styler.calcIconRound(ivMoved.layoutParams),
access_info.supplyBaseUrl(who_moved.avatar_static)
)
tvMovedName.text = who_moved.decoded_display_name
moved_name_invalidator.register(who_moved.decoded_display_name)

View File

@ -59,6 +59,7 @@ class DlgListMember(
private val adapter : MyListAdapter
init {
val density = activity.resources.displayMetrics.density
this.account_list = makeAccountListNonPseudo(activity, null)
this.target_user_full_acct = _list_owner.getFullAcct(who)
@ -84,7 +85,7 @@ class DlgListMember(
btnListOwner.setOnClickListener(this)
view.findViewById<View>(R.id.btnClose).setOnClickListener(this)
ivUser.setImageUrl(App1.pref, 16f, who.avatar_static, who.avatar)
ivUser.setImageUrl(App1.pref, Styler.calcIconRound(ivUser.layoutParams), who.avatar_static, who.avatar)
val user_name_invalidator = NetworkEmojiInvalidator(activity.handler, tvUserName)
val name = who.decodeDisplayName(activity)
tvUserName.text = name

View File

@ -1121,5 +1121,8 @@ object Utils {
fun getExtraObject(data : Intent?, key : String) : Any? {
return data?.extras?.get(key)
}
}
fun <T :Comparable<T>> clipRange( min:T ,max:T ,src:T)
= if( src<min) min else if(src>max) max else src

View File

@ -42,7 +42,8 @@ class MyNetworkImageView @JvmOverloads constructor(
internal val log = LogCategory("MyNetworkImageView")
@SuppressLint("StaticFieldLeak") internal var app_context : Context? = null
@SuppressLint("StaticFieldLeak")
internal var app_context : Context? = null
// private const val SQUARE_RATIO_MARGIN = 0.05f
// private const val maxLoopCount = GifDrawable.LOOP_FOREVER
@ -81,7 +82,12 @@ class MyNetworkImageView @JvmOverloads constructor(
}
@JvmOverloads
fun setImageUrl(pref : SharedPreferences, r : Float, url : String?, gifUrlArg : String? = null) {
fun setImageUrl(
pref : SharedPreferences,
r : Float,
url : String?,
gifUrlArg : String? = null
) {
if(app_context == null) {
val context = context
@ -90,8 +96,7 @@ class MyNetworkImageView @JvmOverloads constructor(
}
}
mCornerRadius = if(Pref.bpDontRound(pref)) 0f else r
mCornerRadius = r
val gif_url = if(Pref.bpEnableGifAnimation(pref)) gifUrlArg else null
@ -193,7 +198,7 @@ class MyNetworkImageView @JvmOverloads constructor(
if(desiredWidth != Target.SIZE_ORIGINAL && desiredWidth <= 0
|| desiredHeight != Target.SIZE_ORIGINAL && desiredHeight <= 0
) {
) {
// desiredWidth,desiredHeight の指定がおかしいと非同期処理中にSimpleTargetが落ちる
// おそらくレイアウト後に再度呼び出される
return
@ -292,32 +297,34 @@ class MyNetworkImageView @JvmOverloads constructor(
// このViewは別の画像を表示するように指定が変わっていた
if(urlLoading != mUrl) return
afterResourceReady(when {
mCornerRadius <= 0f -> {
// 角丸でないならそのまま使う
resource
}
// GidDrawableを置き換える
resource is GifDrawable -> replaceGifDrawable(resource)
// Glide 4.xから、静止画はBitmapDrawableになった
resource is BitmapDrawable -> {
val bitmap = resource.bitmap
if(bitmap == null) {
afterResourceReady(
when {
mCornerRadius <= 0f -> {
// 角丸でないならそのまま使う
resource
} else {
val d = RoundedBitmapDrawableFactory.create(resources, bitmap)
d.cornerRadius = mCornerRadius
d
}
}
else -> {
log.d("onResourceReady: drawable class=%s", resource.javaClass)
resource
}
}, transition)
// GidDrawableを置き換える
resource is GifDrawable -> replaceGifDrawable(resource)
// Glide 4.xから、静止画はBitmapDrawableになった
resource is BitmapDrawable -> {
val bitmap = resource.bitmap
if(bitmap == null) {
resource
} else {
val d = RoundedBitmapDrawableFactory.create(resources, bitmap)
d.cornerRadius = mCornerRadius
d
}
}
else -> {
log.d("onResourceReady: drawable class=%s", resource.javaClass)
resource
}
}, transition
)
} catch(ex : Throwable) {
log.trace(ex)
}
@ -460,17 +467,17 @@ class MyNetworkImageView @JvmOverloads constructor(
val w = when(w_mode) {
MeasureSpec.EXACTLY -> w_size
MeasureSpec.AT_MOST -> w_size
MeasureSpec.UNSPECIFIED ->0
MeasureSpec.UNSPECIFIED -> 0
else -> 0
}
val h = when(h_mode) {
MeasureSpec.EXACTLY -> h_size
MeasureSpec.AT_MOST -> h_size
MeasureSpec.UNSPECIFIED ->0
MeasureSpec.UNSPECIFIED -> 0
else -> 0
}
setMeasuredDimension(w, h)
}else{
} else {
super.onMeasure(widthMeasureSpec, heightMeasureSpec)
}
}

View File

@ -221,6 +221,8 @@
</LinearLayout>
<View style="@style/setting_divider"/>
<TextView
@ -267,7 +269,6 @@
</LinearLayout>
<View style="@style/setting_divider"/>
<TextView
@ -316,8 +317,8 @@
<TextView
style="@style/setting_row_label"
android:text="@string/media_attachment_max_byte_size"
android:labelFor="@+id/etMediaSizeMax"
android:text="@string/media_attachment_max_byte_size"
/>
<LinearLayout style="@style/setting_row_form">
@ -381,10 +382,6 @@
</LinearLayout>
<View style="@style/setting_divider"/>
<TextView
@ -526,8 +523,6 @@
</LinearLayout>
<View style="@style/setting_divider"/>
<TextView
@ -593,16 +588,16 @@
<!--<View style="@style/setting_divider"/>-->
<!--<TextView-->
<!--style="@style/setting_row_label"-->
<!--android:text="@string/disable_fast_scroller"-->
<!--/>-->
<!--style="@style/setting_row_label"-->
<!--android:text="@string/disable_fast_scroller"-->
<!--/>-->
<!--<LinearLayout style="@style/setting_row_form">-->
<!--<Switch-->
<!--android:id="@+id/swDisableFastScroller"-->
<!--style="@style/setting_horizontal_stretch"-->
<!--/>-->
<!--<Switch-->
<!--android:id="@+id/swDisableFastScroller"-->
<!--style="@style/setting_horizontal_stretch"-->
<!--/>-->
<!--</LinearLayout>-->
@ -642,23 +637,6 @@
<View style="@style/setting_divider"/>
<TextView
style="@style/setting_row_label"
android:text="@string/dont_round_avatar"
/>
<LinearLayout style="@style/setting_row_form">
<Switch
android:id="@+id/swDontRound"
style="@style/setting_horizontal_stretch"
android:gravity="center"
/>
</LinearLayout>
<View style="@style/setting_divider"/>
<TextView
style="@style/setting_row_label"
android:text="@string/enable_gif_animation"
@ -674,7 +652,6 @@
</LinearLayout>
<View style="@style/setting_divider"/>
<TextView
@ -746,10 +723,11 @@
<View style="@style/setting_divider"/>
<TextView
style="@style/setting_row_label"
android:text="@string/auto_cw"
android:labelFor="@+id/etAutoCWLines"
android:text="@string/auto_cw"
/>
<LinearLayout style="@style/setting_row_form">
@ -764,21 +742,21 @@
<!--<LinearLayout style="@style/setting_row_form">-->
<!--<TextView-->
<!--style="@style/setting_row_label"-->
<!--android:text="@string/char_per_lines"-->
<!--/>-->
<!--<TextView-->
<!--style="@style/setting_row_label"-->
<!--android:text="@string/char_per_lines"-->
<!--/>-->
<!--</LinearLayout>-->
<!--<LinearLayout style="@style/setting_row_form">-->
<!--<EditText-->
<!--android:id="@+id/etTimelineFontSize"-->
<!--style="@style/setting_horizontal_stretch"-->
<!--android:gravity="center"-->
<!--android:inputType="numberDecimal"-->
<!--/>-->
<!--<EditText-->
<!--android:id="@+id/etTimelineFontSize"-->
<!--style="@style/setting_horizontal_stretch"-->
<!--android:gravity="center"-->
<!--android:inputType="numberDecimal"-->
<!--/>-->
<!--</LinearLayout>-->
@ -1172,6 +1150,41 @@
<View style="@style/setting_divider"/>
<TextView
style="@style/setting_row_label"
android:labelFor="@+id/etRoundRatio"
android:text="@string/avatar_icon_round_ratio"
/>
<LinearLayout style="@style/setting_row_form">
<EditText
android:id="@+id/etRoundRatio"
style="@style/setting_horizontal_stretch"
android:gravity="center"
android:inputType="numberDecimal"
/>
</LinearLayout>
<View style="@style/setting_divider"/>
<TextView
style="@style/setting_row_label"
android:text="@string/avatar_icon_dont_round"
/>
<LinearLayout style="@style/setting_row_form">
<Switch
android:id="@+id/swDontRound"
style="@style/setting_horizontal_stretch"
android:gravity="center"
/>
</LinearLayout>
<View style="@style/setting_divider"/>
<!-- =============================================== -->
<TextView
style="@style/setting_group_header"
@ -1182,6 +1195,22 @@
<View style="@style/setting_divider"/>
<TextView
style="@style/setting_row_label"
android:text="@string/share_view_pool"
/>
<LinearLayout style="@style/setting_row_form">
<Switch
android:id="@+id/swShareViewPool"
style="@style/setting_horizontal_stretch"
/>
</LinearLayout>
<View style="@style/setting_divider"/>
<TextView
style="@style/setting_row_label"
android:text="@string/dont_use_streaming_api"

View File

@ -121,7 +121,7 @@
<string name="dont_refresh">Ne pas actualiser</string>
<string name="dont_refresh_on_activity_resume">Ne pas actualiser à la reprise d\'activité</string>
<string name="dont_resize">Conserver les dimensions</string>
<string name="dont_round_avatar">Ne pas arrondir les coins de l\'image des avatars \n(redémarrage nécessaire)</string>
<string name="dont_screen_off">Garder l\'écran allumé quand l\'application est affichée</string>
<string name="dont_show_boost">Masquer les partages</string>
<string name="dont_show_reply">Masquer les réponses</string>
@ -474,7 +474,7 @@
<string name="profile_unpin">Unpin from profile</string>
<string name="profile_pin_progress">Changing pinned status…</string>
<string name="length_warning">\"%1$s\" is too long (%2$d/%3$d characters).\nIt is not acceptable in the standard instance, but it may be acceptable in some instances.\nAre you sure?</string>
<string name="avatar_icon_size">Avatar icon size (unit:dp. default:48. app restart required)</string>
<string name="short_acct_local_user">Short acct for local user (app restart required)</string>
<string name="loading_notification_title">Loading notification…</string>
<string name="error_notification_title">Server Timeout</string>
@ -602,7 +602,14 @@
<string name="always_show_application">Show (via) application name if possible</string>
<string name="force_gap_when_refresh">Force put gap when refreshing top</string>
<!--<string name="abc_action_bar_home_description">Revenir à l\'accueil</string>-->
<string name="avatar_icon_size">Avatar icon size (unit:dp. default:48. app restart required)</string>
<string name="avatar_icon_round_ratio">Avatar icon round ratio (unit:%. default:33. app restart required)</string>
<string name="avatar_icon_dont_round">Don\'t round corner of avatar icon (app restart required)</string>
<string name="share_view_pool">Share view pool between columns</string>
<!--<string name="abc_action_bar_home_description">Revenir à l\'accueil</string>-->
<!--<string name="abc_action_bar_home_description_format">%1$s, %2$s</string>-->
<!--<string name="abc_action_bar_home_subtitle_description_format">%1$s, %2$s, %3$s</string>-->
<!--<string name="abc_action_bar_up_description">Revenir en haut de la page</string>-->

View File

@ -545,7 +545,6 @@
<string name="visibility">公開範囲</string>
<string name="dont_round_avatar">ユーザ画像を角丸にしない(アプリ再起動が必要)</string>
<string name="color_and_background">色と背景</string>
@ -759,7 +758,7 @@
<string name="profile_unpin">プロフィールの固定表示を解除</string>
<string name="profile_pin_progress">固定表示の変更中…</string>
<string name="length_warning">\"%1$s\"が長すぎます(%2$d/%3$d文字).\n標準的なタンスではエラーとなりますが、一部のタンスでは通るかも。\nよろしいですか?</string>
<string name="avatar_icon_size">アバターアイコンサイズ(単位:dp. デフォルト:48. アプリ再起動が必要)</string>
<string name="short_acct_local_user">ローカルユーザのAcct表記を短くする(アプリ再起動が必要)</string>
<string name="loading_notification_title">通知の取得中…</string>
<string name="error_notification_title">サーバータイムアウト</string>
@ -886,4 +885,9 @@
<string name="always_show_application">アプリ名(via)を可能なら表示する</string>
<string name="force_gap_when_refresh">リフレッシュ時に常にギャップを挟む</string>
<string name="avatar_icon_size">ユーザ画像のサイズ(単位:dp。デフォルト:48。アプリ再起動が必要)</string>
<string name="avatar_icon_round_ratio">ユーザ画像の角丸率(単位:%。デフォルト:33。アプリ再起動が必要)</string>
<string name="avatar_icon_dont_round">ユーザ画像を角丸にしない(アプリ再起動が必要)</string>
<string name="share_view_pool">カラム間でViewPoolを共有する</string>
</resources>

View File

@ -277,7 +277,7 @@
<string name="toot">Toot</string>
<string name="clear_text">Cleat text</string>
<string name="clear_text_and_media">Clear text and media</string>
<string name="dont_round_avatar">Don\'t round corner of avatar image (app restart required)</string>
<string name="menu">Menu</string>
<string name="open_in_pseudo_account">Open in emulated account on %1$s</string>
@ -470,7 +470,7 @@
<string name="profile_unpin">Unpin from profile</string>
<string name="profile_pin_progress">Changing pinned status…</string>
<string name="length_warning">\"%1$s\" is too long (%2$d/%3$d characters).\nIt is not acceptable in the standard instance, but it may be acceptable in some instances.\nAre you sure?</string>
<string name="avatar_icon_size">Avatar icon size (unit:dp. default:48. app restart required)</string>
<string name="short_acct_local_user">Short acct for local user (app restart required)</string>
<string name="loading_notification_title">Loading notification…</string>
<string name="error_notification_title">Server Timeout</string>
@ -591,4 +591,8 @@
<string name="always_show_application">Show (via) application name if possible</string>
<string name="force_gap_when_refresh">Force put gap when refreshing top</string>
<string name="avatar_icon_size">Avatar icon size (unit:dp. default:48. app restart required)</string>
<string name="avatar_icon_round_ratio">Avatar icon round ratio (unit:%. default:33. app restart required)</string>
<string name="avatar_icon_dont_round">Don\'t round corner of avatar icon (app restart required)</string>
<string name="share_view_pool">Share view pool between columns</string>
</resources>