diff --git a/app/src/main/java/de/kuschku/quasseldroid/ui/chat/ChatActivity.kt b/app/src/main/java/de/kuschku/quasseldroid/ui/chat/ChatActivity.kt index 140cc61567e4516a6db52ccd4d28a2862dc2c53e..43dd1caeafaf01f42a75b1cea7eb6a337561fb8f 100644 --- a/app/src/main/java/de/kuschku/quasseldroid/ui/chat/ChatActivity.kt +++ b/app/src/main/java/de/kuschku/quasseldroid/ui/chat/ChatActivity.kt @@ -84,6 +84,7 @@ import de.kuschku.quasseldroid.util.missingfeatures.RequiredFeatures import de.kuschku.quasseldroid.util.service.ServiceBoundActivity import de.kuschku.quasseldroid.util.ui.DragInterceptBottomSheetBehavior import de.kuschku.quasseldroid.util.ui.MaterialContentLoadingProgressBar +import de.kuschku.quasseldroid.util.ui.NickCountDrawable import de.kuschku.quasseldroid.viewmodel.EditorViewModel import de.kuschku.quasseldroid.viewmodel.data.BufferData import org.threeten.bp.Instant @@ -681,6 +682,11 @@ class ChatActivity : ServiceBoundActivity(), SharedPreferences.OnSharedPreferenc } override fun onCreateOptionsMenu(menu: Menu?): Boolean { + val nickCountDrawableSize = resources.getDimensionPixelSize(R.dimen.size_nick_count) + val nickCountDrawableColor = toolbar.context.theme.styledAttributes(R.attr.colorControlNormal) { + getColor(0, 0) + } + menuInflater.inflate(R.menu.activity_main, menu) menu?.findItem(R.id.action_nicklist)?.isVisible = bufferData?.info?.type?.hasFlag(Buffer_Type.ChannelBuffer) ?: false menu?.findItem(R.id.action_filter_messages)?.isVisible = @@ -691,6 +697,12 @@ class ChatActivity : ServiceBoundActivity(), SharedPreferences.OnSharedPreferenc bufferData?.info?.type?.hasFlag(Buffer_Type.QueryBuffer) ?: false) && Build.VERSION.SDK_INT >= Build.VERSION_CODES.O menu?.retint(toolbar.context) + viewModel.nickData.toLiveData().observe(this, Observer { + val count = it?.count() ?: 0 + menu?.findItem(R.id.action_nicklist)?.icon = NickCountDrawable(count, + nickCountDrawableSize, + nickCountDrawableColor) + }) return super.onCreateOptionsMenu(menu) } diff --git a/app/src/main/java/de/kuschku/quasseldroid/util/ui/NickCountDrawable.kt b/app/src/main/java/de/kuschku/quasseldroid/util/ui/NickCountDrawable.kt new file mode 100644 index 0000000000000000000000000000000000000000..71dbe7a10d10093c3cf56da2181d2c3a4bc61779 --- /dev/null +++ b/app/src/main/java/de/kuschku/quasseldroid/util/ui/NickCountDrawable.kt @@ -0,0 +1,87 @@ +package de.kuschku.quasseldroid.util.ui + +import android.graphics.* +import android.graphics.drawable.Drawable +import android.support.annotation.ColorInt +import android.support.annotation.Dimension + +class NickCountDrawable( + count: Int, + @Dimension private val size: Int, + @ColorInt textColor: Int +) : Drawable() { + private val paint = Paint().apply { + color = textColor + isAntiAlias = true + style = Paint.Style.FILL + typeface = Typeface.DEFAULT_BOLD + textAlign = Paint.Align.CENTER + } + + private val formattedText: String = formatCount(count) + + private fun formatCount(count: Int) = when { + count >= 10_000 -> String.format("%.00fK", count / 1_000f) + count >= 1_000 -> String.format("%.01fK", count / 1_000f) + else -> "$count" + } + + private val showText: Boolean = count > 0 + + private val icon = Path().apply { + moveTo(16f, 13f) + cubicTo(15.71f, 13f, 15.38f, 13f, 15.03f, 13.05f) + cubicTo(16.19f, 13.89f, 17f, 15f, 17f, 16.5f) + lineTo(17f, 19f) + lineTo(23f, 19f) + lineTo(23f, 16.5f) + cubicTo(23f, 14.17f, 18.33f, 13f, 16f, 13f) + moveTo(8f, 13f) + cubicTo(5.67f, 13f, 1f, 14.17f, 1f, 16.5f) + lineTo(1f, 19f) + lineTo(15f, 19f) + lineTo(15f, 16.5f) + cubicTo(15f, 14.17f, 10.33f, 13f, 8f, 13f) + addCircle(8f, 8f, 3f, Path.Direction.CCW) + addCircle(16f, 8f, 3f, Path.Direction.CCW) + close() + } + + override fun getIntrinsicHeight() = size + override fun getIntrinsicWidth() = size + + private val tmpPath = Path() + + override fun setAlpha(alpha: Int) { + paint.alpha = alpha + } + + override fun getOpacity(): Int = PixelFormat.TRANSLUCENT + + override fun setColorFilter(colorFilter: ColorFilter?) { + paint.colorFilter = colorFilter + } + + override fun draw(canvas: Canvas) { + if (bounds.width() <= 0 || bounds.height() <= 0) { + // Nothing to draw + return + } + + val smallestDimension = Math.min(bounds.width(), bounds.height()) + icon.transform(Matrix().apply { + preScale(smallestDimension / 24f, smallestDimension / 24f, 0f, 0f) + if (showText) { + preTranslate(0f, -8f) + } + }, tmpPath) + + paint.textSize = smallestDimension * 0.6f + + canvas.drawPath(tmpPath, paint) + if (showText) { + canvas.drawText(formattedText, bounds.width() / 2f, + bounds.height() * 0.85f - ((paint.descent() + paint.ascent()) / 2f), paint) + } + } +} diff --git a/app/src/main/res/values/dimens.xml b/app/src/main/res/values/dimens.xml index e861f1d65528ea9bb82e2c61b5e26b4dcf052127..2966181b6a02309603673b1aa7e457b92444cab6 100644 --- a/app/src/main/res/values/dimens.xml +++ b/app/src/main/res/values/dimens.xml @@ -43,4 +43,5 @@ <dimen name="notification_avatar_width">64dp</dimen> <dimen name="notification_avatar_height">64dp</dimen> + <dimen name="size_nick_count">24dp</dimen> </resources>