From 8799cda3b231377c1aa65529f5f00e2d352c38f4 Mon Sep 17 00:00:00 2001 From: Janne Koschinski <janne@kuschku.de> Date: Wed, 12 Dec 2018 13:12:35 +0100 Subject: [PATCH] Usability enhancements --- .../quasseldroid/ui/chat/ToolbarFragment.kt | 48 +++++++++-- .../ui/chat/input/ChatlineFragment.kt | 1 + app/src/main/res/layout/fragment_toolbar.xml | 83 ++++++++++--------- app/src/main/res/layout/layout_editor.xml | 2 + app/src/main/res/values/strings.xml | 3 + .../viewmodel/QuasselViewModel.kt | 3 +- .../quasseldroid/viewmodel/data/BufferData.kt | 4 +- 7 files changed, 98 insertions(+), 46 deletions(-) diff --git a/app/src/main/java/de/kuschku/quasseldroid/ui/chat/ToolbarFragment.kt b/app/src/main/java/de/kuschku/quasseldroid/ui/chat/ToolbarFragment.kt index 26346ebd3..91d99f61b 100644 --- a/app/src/main/java/de/kuschku/quasseldroid/ui/chat/ToolbarFragment.kt +++ b/app/src/main/java/de/kuschku/quasseldroid/ui/chat/ToolbarFragment.kt @@ -24,6 +24,7 @@ import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import android.widget.TextView +import androidx.appcompat.widget.AppCompatImageView import androidx.lifecycle.Observer import butterknife.BindView import butterknife.ButterKnife @@ -31,14 +32,15 @@ import de.kuschku.libquassel.protocol.Buffer_Type import de.kuschku.libquassel.quassel.BufferInfo import de.kuschku.libquassel.util.flag.hasFlag import de.kuschku.libquassel.util.helpers.value +import de.kuschku.quasseldroid.GlideApp import de.kuschku.quasseldroid.R import de.kuschku.quasseldroid.settings.AppearanceSettings import de.kuschku.quasseldroid.settings.MessageSettings import de.kuschku.quasseldroid.ui.chat.info.channel.ChannelInfoActivity import de.kuschku.quasseldroid.ui.chat.info.user.UserInfoActivity -import de.kuschku.quasseldroid.util.helper.combineLatest -import de.kuschku.quasseldroid.util.helper.toLiveData -import de.kuschku.quasseldroid.util.helper.visibleIf +import de.kuschku.quasseldroid.util.ColorContext +import de.kuschku.quasseldroid.util.avatars.AvatarHelper +import de.kuschku.quasseldroid.util.helper.* import de.kuschku.quasseldroid.util.irc.format.IrcFormatDeserializer import de.kuschku.quasseldroid.util.service.ServiceBoundFragment import de.kuschku.quasseldroid.util.ui.SpanFormatter @@ -51,6 +53,9 @@ class ToolbarFragment : ServiceBoundFragment() { @BindView(R.id.toolbar_subtitle) lateinit var toolbarSubtitle: TextView + @BindView(R.id.toolbar_icon) + lateinit var icon: AppCompatImageView + @BindView(R.id.toolbar_action_area) lateinit var actionArea: View @@ -91,10 +96,42 @@ class ToolbarFragment : ServiceBoundFragment() { description, messageSettings.colorizeMirc ) - combineLatest(viewModel.bufferDataThrottled, viewModel.lag).toLiveData() + val avatarSize = resources.getDimensionPixelSize(R.dimen.avatar_size_buffer) + + val colorContext = ColorContext(requireContext(), messageSettings) + + combineLatest(viewModel.bufferDataThrottled, viewModel.lag).map { + val avatarInfo = it.first?.ircUser?.let { user -> + val avatarUrls = AvatarHelper.avatar(messageSettings, user, avatarSize) + + val nickName = user.nick() + val useSelfColor = when (messageSettings.colorizeNicknames) { + MessageSettings.ColorizeNicknamesMode.ALL -> false + MessageSettings.ColorizeNicknamesMode.ALL_BUT_MINE -> + user.network().isMyNick(nickName) + MessageSettings.ColorizeNicknamesMode.NONE -> true + } + + val fallbackDrawable = colorContext.buildTextDrawable(user.nick(), useSelfColor) + + Pair(avatarUrls, fallbackDrawable) + } + + Triple(it.first, it.second, avatarInfo) + }.toLiveData() .observe(this, Observer { if (it != null) { - val (data, lag) = it + val (data, lag, avatarInfo) = it + + if (avatarInfo != null) { + val (avatarUrls, fallbackDrawable) = avatarInfo + icon.loadAvatars(avatarUrls, fallbackDrawable, crop = !messageSettings.squareAvatars) + icon.visibility = View.VISIBLE + } else { + GlideApp.with(icon).clear(icon) + icon.visibility = View.GONE + } + if (data?.info?.type?.hasFlag(Buffer_Type.StatusBuffer) == true) { this.title = data.network?.networkName() } else { @@ -140,6 +177,7 @@ class ToolbarFragment : ServiceBoundFragment() { } } } + actionArea.setTooltip() return view } diff --git a/app/src/main/java/de/kuschku/quasseldroid/ui/chat/input/ChatlineFragment.kt b/app/src/main/java/de/kuschku/quasseldroid/ui/chat/input/ChatlineFragment.kt index af1d91712..a7e1e1785 100644 --- a/app/src/main/java/de/kuschku/quasseldroid/ui/chat/input/ChatlineFragment.kt +++ b/app/src/main/java/de/kuschku/quasseldroid/ui/chat/input/ChatlineFragment.kt @@ -202,6 +202,7 @@ class ChatlineFragment : ServiceBoundFragment() { editorHelper.setOnEnterListener(::send) send.setOnClickListener { send() } + send.setTooltip() tabComplete.visibleIf(autoCompleteSettings.button) tabComplete.setOnClickListener { diff --git a/app/src/main/res/layout/fragment_toolbar.xml b/app/src/main/res/layout/fragment_toolbar.xml index dfa09f03d..8a26f58b8 100644 --- a/app/src/main/res/layout/fragment_toolbar.xml +++ b/app/src/main/res/layout/fragment_toolbar.xml @@ -20,61 +20,66 @@ <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/toolbar_action_area" - android:layout_width="fill_parent" - android:layout_height="fill_parent" + android:layout_width="match_parent" + android:layout_height="match_parent" android:background="?attr/selectableItemBackgroundBorderless" android:clickable="true" android:focusable="true" android:focusableInTouchMode="false" - android:gravity="center_vertical|start" android:minHeight="?attr/actionBarSize" - android:orientation="vertical" + android:contentDescription="@string/label_info" android:theme="?attr/actionBarTheme" + android:orientation="horizontal" tools:showIn="@layout/activity_main"> + <androidx.appcompat.widget.AppCompatImageView + android:id="@+id/toolbar_icon" + android:layout_width="@dimen/avatar_size_buffer" + android:layout_height="@dimen/avatar_size_buffer" + android:layout_gravity="center_vertical" + android:layout_marginEnd="8dp" + android:layout_marginRight="8dp" + android:visibility="gone" + tools:src="@tools:sample/avatars" + tools:visibility="visible" /> + <LinearLayout - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:layout_gravity="center_vertical|start" - android:layout_marginTop="-2dp" - android:baselineAligned="false"> + android:layout_width="match_parent" + android:layout_height="match_parent" + android:gravity="center_vertical|start" + android:orientation="vertical"> - <TextView - android:id="@+id/key" - style="@style/Widget.RtlConformTextView" - android:layout_width="16dp" - android:layout_height="16dp" - android:layout_marginEnd="2dp" - android:layout_marginRight="2dp" - android:layout_marginTop="2dp" - android:gravity="center" - android:textAppearance="@style/TextAppearance.AppCompat.Widget.ActionBar.Title" - android:textColor="?android:textColorPrimary" - android:textSize="16sp" - android:visibility="gone" /> + <LinearLayout + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_gravity="center_vertical|start" + android:layout_marginTop="-2dp" + android:baselineAligned="false"> + + <TextView + android:id="@+id/toolbar_title" + style="@style/Widget.RtlConformTextView" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:ellipsize="end" + android:gravity="center_vertical" + android:singleLine="true" + android:text="@string/app_name" + android:textAppearance="@style/TextAppearance.AppCompat.Widget.ActionBar.Title" + android:textColor="?android:textColorPrimary" /> + + </LinearLayout> <TextView - android:id="@+id/toolbar_title" - style="@style/Widget.RtlConformTextView" + android:id="@+id/toolbar_subtitle" + style="@style/TextAppearance.AppCompat.Widget.ActionBar.Subtitle" android:layout_width="wrap_content" android:layout_height="wrap_content" + android:layout_marginTop="-3dp" android:ellipsize="end" - android:gravity="center_vertical" android:singleLine="true" - android:text="@string/app_name" - android:textAppearance="@style/TextAppearance.AppCompat.Widget.ActionBar.Title" - android:textColor="?android:textColorPrimary" /> + android:textColor="?android:textColorSecondary" + android:visibility="gone" /> </LinearLayout> - - <TextView - android:id="@+id/toolbar_subtitle" - style="@style/TextAppearance.AppCompat.Widget.ActionBar.Subtitle" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:layout_marginTop="-3dp" - android:ellipsize="end" - android:singleLine="true" - android:textColor="?android:textColorSecondary" - android:visibility="gone" /> </LinearLayout> diff --git a/app/src/main/res/layout/layout_editor.xml b/app/src/main/res/layout/layout_editor.xml index dde9aec40..c8e1b5117 100644 --- a/app/src/main/res/layout/layout_editor.xml +++ b/app/src/main/res/layout/layout_editor.xml @@ -45,6 +45,7 @@ android:padding="12dp" android:scaleType="fitXY" app:layout_constraintStart_toStartOf="parent" + android:contentDescription="@string/label_autocomplete" app:srcCompat="@drawable/ic_tab" app:tint="?attr/colorTextSecondary" /> @@ -89,6 +90,7 @@ android:scaleType="fitXY" app:layout_constraintEnd_toEndOf="parent" app:srcCompat="@drawable/ic_send" + android:contentDescription="@string/label_send" app:tint="?attr/colorAccent" tools:ignore="UnusedAttribute" /> </androidx.constraintlayout.widget.ConstraintLayout> diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index de5b41652..336b63168 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -29,6 +29,7 @@ <string name="label_about">About</string> <string name="label_accept">Accept</string> + <string name="label_autocomplete">Autocomplete</string> <string name="label_avatar">Avatar</string> <string name="label_back">Back</string> <string name="label_buffer_name">Buffer Name</string> @@ -56,6 +57,7 @@ <string name="label_hide_temp">Hide Temporarily</string> <string name="label_ignore">Ignore</string> <string name="label_ignore_long">Add/remove user to/from ignore list</string> + <string name="label_info">Details</string> <string name="label_info_channel">Channel Details</string> <string name="label_info_core">Core Details</string> <string name="label_info_user">User Details</string> @@ -92,6 +94,7 @@ <string name="label_rename">Rename</string> <string name="label_save">Save</string> <string name="label_select">Select</string> + <string name="label_send">Send</string> <string name="label_set_default">Set Default</string> <string name="label_settings">Settings</string> <string name="label_settings_client">Client Settings</string> diff --git a/viewmodel/src/main/java/de/kuschku/quasseldroid/viewmodel/QuasselViewModel.kt b/viewmodel/src/main/java/de/kuschku/quasseldroid/viewmodel/QuasselViewModel.kt index 52b89bfff..e4332e416 100644 --- a/viewmodel/src/main/java/de/kuschku/quasseldroid/viewmodel/QuasselViewModel.kt +++ b/viewmodel/src/main/java/de/kuschku/quasseldroid/viewmodel/QuasselViewModel.kt @@ -161,7 +161,8 @@ class QuasselViewModel : ViewModel() { BufferData( info = info, network = network, - description = user.realName() + description = user.realName(), + ircUser = user ) } } diff --git a/viewmodel/src/main/java/de/kuschku/quasseldroid/viewmodel/data/BufferData.kt b/viewmodel/src/main/java/de/kuschku/quasseldroid/viewmodel/data/BufferData.kt index 700c453f1..9a247f6db 100644 --- a/viewmodel/src/main/java/de/kuschku/quasseldroid/viewmodel/data/BufferData.kt +++ b/viewmodel/src/main/java/de/kuschku/quasseldroid/viewmodel/data/BufferData.kt @@ -20,11 +20,13 @@ package de.kuschku.quasseldroid.viewmodel.data import de.kuschku.libquassel.quassel.BufferInfo +import de.kuschku.libquassel.quassel.syncables.IrcUser import de.kuschku.libquassel.quassel.syncables.Network data class BufferData( val info: BufferInfo? = null, val network: Network? = null, val description: String? = null, - val userCount: Int = 0 + val userCount: Int = 0, + val ircUser: IrcUser? = null ) -- GitLab