diff --git a/app/src/main/java/de/kuschku/quasseldroid/ui/chat/messages/DayChangeItemDecoration.kt b/app/src/main/java/de/kuschku/quasseldroid/ui/chat/messages/DayChangeItemDecoration.kt index e889eb1598f875afe05ffa661e3442734f79240c..8a1e46e0480535ce171f40ef8b611db0409aedc0 100644 --- a/app/src/main/java/de/kuschku/quasseldroid/ui/chat/messages/DayChangeItemDecoration.kt +++ b/app/src/main/java/de/kuschku/quasseldroid/ui/chat/messages/DayChangeItemDecoration.kt @@ -3,6 +3,7 @@ package de.kuschku.quasseldroid.ui.chat.messages import android.graphics.Canvas import android.graphics.Rect import android.support.v7.widget.RecyclerView +import android.util.TypedValue import android.view.LayoutInflater import android.view.View import android.view.ViewGroup @@ -13,7 +14,10 @@ import org.threeten.bp.format.DateTimeFormatter import org.threeten.bp.format.FormatStyle import org.threeten.bp.temporal.ChronoUnit -class DayChangeItemDecoration(private val adapter: MessageAdapter) : +class DayChangeItemDecoration( + private val adapter: MessageAdapter, + private val textSize: Int +) : RecyclerView.ItemDecoration() { private val dayChangeFormatter = DateTimeFormatter.ofLocalizedDate(FormatStyle.MEDIUM) private val bounds = Rect() @@ -86,6 +90,7 @@ class DayChangeItemDecoration(private val adapter: MessageAdapter) : content?.text = dayChangeFormatter.format( it.content.time.atZone(ZoneId.systemDefault()).truncatedTo(ChronoUnit.DAYS) ) + content?.setTextSize(TypedValue.COMPLEX_UNIT_SP, textSize.toFloat()) fixLayoutSize(layout, parent) v.setTag(R.id.tag_daychange_layout, layout) @@ -93,7 +98,7 @@ class DayChangeItemDecoration(private val adapter: MessageAdapter) : } v.setTag(R.id.tag_daychange, true) val layout = v.getTag(R.id.tag_daychange_layout) as View - outRect.set(0, layout.measuredHeight, 0, 10) + outRect.set(0, layout.measuredHeight, 0, 0) } else { v.setTag(R.id.tag_daychange, false) } diff --git a/app/src/main/java/de/kuschku/quasseldroid/ui/chat/messages/MessageAdapter.kt b/app/src/main/java/de/kuschku/quasseldroid/ui/chat/messages/MessageAdapter.kt index c3ed188c99aee4925ccfde03f8be78ae903687b3..bdeb76b0d4c0ecc73a420720ef7a229a2ce97613 100644 --- a/app/src/main/java/de/kuschku/quasseldroid/ui/chat/messages/MessageAdapter.kt +++ b/app/src/main/java/de/kuschku/quasseldroid/ui/chat/messages/MessageAdapter.kt @@ -8,7 +8,6 @@ import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import android.widget.ImageView -import android.widget.Space import android.widget.TextView import butterknife.BindView import butterknife.ButterKnife @@ -156,14 +155,6 @@ class MessageAdapter @Inject constructor( @JvmField var avatar: ImageView? = null - @BindView(R.id.avatar_container) - @JvmField - var avatarContainer: View? = null - - @BindView(R.id.avatar_placeholder) - @JvmField - var avatarPlaceholder: Space? = null - @BindView(R.id.name) @JvmField var name: TextView? = null diff --git a/app/src/main/java/de/kuschku/quasseldroid/ui/chat/messages/MessageListFragment.kt b/app/src/main/java/de/kuschku/quasseldroid/ui/chat/messages/MessageListFragment.kt index 014abbacbd86b22c63b6cc0925dceae18c386c63..7b16060cc2dfc00769ce33d7c5fbc0c50ef086ac 100644 --- a/app/src/main/java/de/kuschku/quasseldroid/ui/chat/messages/MessageListFragment.kt +++ b/app/src/main/java/de/kuschku/quasseldroid/ui/chat/messages/MessageListFragment.kt @@ -13,6 +13,7 @@ import android.support.v7.widget.LinearLayoutManager import android.support.v7.widget.PopupMenu import android.support.v7.widget.RecyclerView import android.text.SpannableStringBuilder +import android.util.TypedValue import android.view.* import butterknife.BindView import butterknife.ButterKnife @@ -39,6 +40,7 @@ import org.threeten.bp.ZonedDateTime import org.threeten.bp.temporal.ChronoUnit import java.util.concurrent.TimeUnit import javax.inject.Inject +import kotlin.math.roundToInt class MessageListFragment : ServiceBoundFragment() { @BindView(R.id.messages) @@ -255,7 +257,6 @@ class MessageListFragment : ServiceBoundFragment() { val canScrollDown = recyclerView.canScrollVertically(1) val isScrollingDown = dy > 0 - scrollDown.visibility = View.VISIBLE scrollDown.toggle(canScrollDown && isScrollingDown) } @@ -388,16 +389,25 @@ class MessageListFragment : ServiceBoundFragment() { } } }) - scrollDown.hide() + + scrollDown.hide(object : FloatingActionButton.OnVisibilityChangedListener() { + override fun onHidden(fab: FloatingActionButton) { + fab.visibility = View.VISIBLE + } + }) scrollDown.setOnClickListener { messageList.scrollToPosition(0) } savedInstanceState?.run { messageList.layoutManager.onRestoreInstanceState(getParcelable(KEY_STATE_LIST)) } - val avatar_size = resources.getDimensionPixelSize(R.dimen.avatar_size) + val avatarSize = TypedValue.applyDimension( + TypedValue.COMPLEX_UNIT_SP, + messageSettings.textSize * 2.5f, + requireContext().resources.displayMetrics + ).roundToInt() - val sizeProvider = FixedPreloadSizeProvider<String>(avatar_size, avatar_size) + val sizeProvider = FixedPreloadSizeProvider<String>(avatarSize, avatarSize) val preloadModelProvider = object : ListPreloader.PreloadModelProvider<String> { override fun getPreloadItems(position: Int) = adapter[position]?.avatarUrl?.let { @@ -405,13 +415,13 @@ class MessageListFragment : ServiceBoundFragment() { } ?: mutableListOf() override fun getPreloadRequestBuilder(item: String) = - GlideApp.with(this@MessageListFragment).load(item).override(avatar_size) + GlideApp.with(this@MessageListFragment).load(item).override(avatarSize) } val preloader = RecyclerViewPreloader(Glide.with(this), preloadModelProvider, sizeProvider, 10) messageList.addOnScrollListener(preloader) - messageList.addItemDecoration(DayChangeItemDecoration(adapter)) + messageList.addItemDecoration(DayChangeItemDecoration(adapter, messageSettings.textSize)) messageList.addItemDecoration(MarkerLineItemDecoration( adapter, requireContext(), R.dimen.markerline_height, R.attr.colorMarkerLine )) diff --git a/app/src/main/java/de/kuschku/quasseldroid/ui/chat/messages/QuasselMessageRenderer.kt b/app/src/main/java/de/kuschku/quasseldroid/ui/chat/messages/QuasselMessageRenderer.kt index 0e585f94f6a378e7ce01b95f468e88d0fb0875ca..c9f61c45f11468722ebc82ef6d658edadae13577 100644 --- a/app/src/main/java/de/kuschku/quasseldroid/ui/chat/messages/QuasselMessageRenderer.kt +++ b/app/src/main/java/de/kuschku/quasseldroid/ui/chat/messages/QuasselMessageRenderer.kt @@ -4,10 +4,14 @@ import android.content.Context import android.graphics.Typeface import android.graphics.drawable.ColorDrawable import android.graphics.drawable.LayerDrawable +import android.os.Build import android.text.SpannableString import android.text.style.ForegroundColorSpan import android.text.style.StyleSpan import android.util.TypedValue +import android.view.View +import android.widget.FrameLayout +import android.widget.LinearLayout import de.kuschku.libquassel.protocol.Message.MessageType.* import de.kuschku.libquassel.protocol.Message_Flag import de.kuschku.libquassel.protocol.Message_Type @@ -29,6 +33,7 @@ import org.threeten.bp.ZoneId import org.threeten.bp.format.DateTimeFormatter import org.threeten.bp.format.FormatStyle import javax.inject.Inject +import kotlin.math.roundToInt class QuasselMessageRenderer @Inject constructor( private val messageSettings: MessageSettings, @@ -92,14 +97,17 @@ class QuasselMessageRenderer @Inject constructor( } } + val avatarContainer = viewHolder.itemView.findViewById<View>(R.id.avatar_container) + val avatarPlaceholder = viewHolder.itemView.findViewById<View>(R.id.avatar_placeholder) + if (messageSettings.useMonospace) { viewHolder.content?.typeface = if (viewHolder.content?.typeface?.isItalic == true) monospaceItalic else Typeface.MONOSPACE viewHolder.combined?.typeface = if (viewHolder.combined?.typeface?.isItalic == true) monospaceItalic else Typeface.MONOSPACE } viewHolder.avatar?.visibleIf(!isFollowUp) - viewHolder.avatarContainer?.visibleIf(messageSettings.showAvatars) - viewHolder.avatarPlaceholder?.visibleIf(messageSettings.showAvatars) + avatarContainer?.visibleIf(messageSettings.showAvatars) + avatarPlaceholder?.visibleIf(messageSettings.showAvatars) val separateLine = viewHolder.content != null && viewHolder.name != null && messageSettings.nicksOnNewLine viewHolder.name?.visibleIf(separateLine && !isFollowUp) viewHolder.content?.visibleIf(separateLine) @@ -114,6 +122,29 @@ class QuasselMessageRenderer @Inject constructor( viewHolder.content?.setTextSize(TypedValue.COMPLEX_UNIT_SP, textSize) viewHolder.combined?.setTextSize(TypedValue.COMPLEX_UNIT_SP, textSize) viewHolder.name?.setTextSize(TypedValue.COMPLEX_UNIT_SP, textSize) + val avatarSize = TypedValue.applyDimension( + TypedValue.COMPLEX_UNIT_SP, + textSize * 2.5f, + viewHolder.itemView.context.resources.displayMetrics + ).roundToInt() + viewHolder.avatar?.layoutParams = + FrameLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, avatarSize) + avatarContainer?.layoutParams = + LinearLayout.LayoutParams(avatarSize, LinearLayout.LayoutParams.WRAP_CONTENT).apply { + val margin = viewHolder.itemView.context.resources.getDimensionPixelSize(R.dimen.message_horizontal) + setMargins(0, 0, margin, 0) + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) { + marginEnd = margin + } + } + avatarPlaceholder?.layoutParams = + LinearLayout.LayoutParams(avatarSize, LinearLayout.LayoutParams.MATCH_PARENT).apply { + val margin = viewHolder.itemView.context.resources.getDimensionPixelSize(R.dimen.message_horizontal) + setMargins(0, 0, margin, 0) + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) { + marginEnd = margin + } + } } override fun bind(holder: MessageAdapter.QuasselMessageViewHolder, message: FormattedMessage, diff --git a/app/src/main/res/layout/fragment_messages.xml b/app/src/main/res/layout/fragment_messages.xml index 2605c18120983138f65e57d26ca4de611c719164..ea9613948bf82f54893eae80187f7e66ac0d7d15 100644 --- a/app/src/main/res/layout/fragment_messages.xml +++ b/app/src/main/res/layout/fragment_messages.xml @@ -38,4 +38,4 @@ app:pressedTranslationZ="0dip" app:srcCompat="@drawable/ic_scroll_down" /> -</FrameLayout> \ No newline at end of file +</FrameLayout> diff --git a/app/src/main/res/layout/widget_chatmessage_plain.xml b/app/src/main/res/layout/widget_chatmessage_plain.xml index 21d34507635280432495861c627d1739fd629943..4a9172a20e34676263ace8bd2ca4d2c276e66484 100644 --- a/app/src/main/res/layout/widget_chatmessage_plain.xml +++ b/app/src/main/res/layout/widget_chatmessage_plain.xml @@ -29,7 +29,7 @@ <FrameLayout android:id="@+id/avatar_container" android:layout_width="@dimen/avatar_size" - android:layout_height="wrap_content" + android:layout_height="@dimen/avatar_size" android:layout_marginEnd="@dimen/message_horizontal" android:layout_marginRight="@dimen/message_horizontal" android:visibility="gone" @@ -37,12 +37,10 @@ <ImageView android:id="@+id/avatar" - android:layout_width="@dimen/avatar_size" - android:layout_height="@dimen/avatar_size" + android:layout_width="match_parent" + android:layout_height="match_parent" android:contentDescription="@string/label_avatar" - android:visibility="gone" - tools:src="@tools:sample/avatars" - tools:visibility="visible" /> + tools:src="@tools:sample/avatars" /> </FrameLayout> <LinearLayout diff --git a/app/src/main/res/values/dimens.xml b/app/src/main/res/values/dimens.xml index c185448bba21d0eb97cf0218d2567e1c1cee9611..f998f14e0611a5faaa0d2edd49f64611a927ace6 100644 --- a/app/src/main/res/values/dimens.xml +++ b/app/src/main/res/values/dimens.xml @@ -14,5 +14,5 @@ <dimen name="button_corner_radius">2dp</dimen> <dimen name="colorchooser_circlesize">56dp</dimen> - <dimen name="avatar_size">36sp</dimen> + <dimen name="avatar_size">35sp</dimen> </resources> diff --git a/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/IrcChannel.kt b/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/IrcChannel.kt index 052d846183fbb9d258b9562f6a716f4d8f789dcc..6f3f03d3922491d127b23cfc0c9cb4a8ffe44d46 100644 --- a/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/IrcChannel.kt +++ b/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/IrcChannel.kt @@ -173,6 +173,7 @@ class IrcChannel( setCodecForEncoding(charset) } } + fun setCodecForEncoding(codec: Charset) { _codecForEncoding = codec } @@ -183,6 +184,7 @@ class IrcChannel( setCodecForDecoding(charset) } } + fun setCodecForDecoding(codec: Charset) { _codecForDecoding = codec }