From 30f15971c42c912ff2f0c65557ba80a8481213f4 Mon Sep 17 00:00:00 2001 From: Janne Koschinski <janne@kuschku.de> Date: Sat, 27 Aug 2016 02:33:01 +0200 Subject: [PATCH] Updated chat UI --- .../ui/chat/chatview/ChatMessageRenderer.java | 63 ++++++++--- .../ui/chat/fragment/ChatFragment.java | 12 ++ .../quasseldroid_ng/ui/theme/AppTheme.java | 6 - .../quasseldroid_ng/ui/theme/ThemeUtil.java | 24 +++- app/src/main/res/layout/fragment_chat.xml | 29 ++++- app/src/main/res/values/attrs.xml | 3 +- app/src/main/res/values/strings_format.xml | 5 +- app/src/main/res/values/themes.xml | 104 +----------------- 8 files changed, 119 insertions(+), 127 deletions(-) diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/chatview/ChatMessageRenderer.java b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/chatview/ChatMessageRenderer.java index a0c4af4a2..ffddc7856 100644 --- a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/chatview/ChatMessageRenderer.java +++ b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/chatview/ChatMessageRenderer.java @@ -42,6 +42,7 @@ public class ChatMessageRenderer { private IrcFormatHelper helper; private MessageStyleContainer highlightStyle; private MessageStyleContainer serverStyle; + private MessageStyleContainer errorStyle; private MessageStyleContainer actionStyle; private MessageStyleContainer plainStyle; @@ -65,6 +66,12 @@ public class ChatMessageRenderer { context.themeUtil().res.colorForegroundSecondary, context.themeUtil().res.colorBackgroundSecondary ); + this.errorStyle = new MessageStyleContainer( + context.themeUtil().res.colorForegroundError, + Typeface.ITALIC, + context.themeUtil().res.colorForegroundSecondary, + context.themeUtil().res.colorBackgroundSecondary + ); this.plainStyle = new MessageStyleContainer( context.themeUtil().res.colorForeground, Typeface.NORMAL, @@ -123,7 +130,7 @@ public class ChatMessageRenderer { } private void onBindNotice(@NonNull MessageViewHolder holder, @NonNull Message message) { - applyStyle(holder, plainStyle, highlightStyle, message.flags.Highlight); + applyStyle(holder, serverStyle, highlightStyle, message.flags.Highlight); holder.content.setText(context.themeUtil().translations.formatAction( formatNick(message.sender, false), helper.formatIrcMessage(context.client(), message) @@ -153,9 +160,13 @@ public class ChatMessageRenderer { )); } + // TODO: Replace this with better display of mode changes private void onBindMode(@NonNull MessageViewHolder holder, @NonNull Message message) { applyStyle(holder, serverStyle, highlightStyle, message.flags.Highlight); - holder.content.setText(message.toString()); + holder.content.setText(context.themeUtil().translations.formatMode( + message.content, + formatNick(message.sender, false) + )); } private void onBindJoin(@NonNull MessageViewHolder holder, @NonNull Message message) { @@ -177,35 +188,60 @@ public class ChatMessageRenderer { private void onBindQuit(@NonNull MessageViewHolder holder, @NonNull Message message) { applyStyle(holder, serverStyle, highlightStyle, message.flags.Highlight); - holder.content.setText(context.themeUtil().translations.formatQuit( - formatNick(message.sender), - message.content - )); + if (message.content.isEmpty()) + holder.content.setText(context.themeUtil().translations.formatQuit( + formatNick(message.sender) + )); + else + holder.content.setText(context.themeUtil().translations.formatQuit( + formatNick(message.sender), + message.content + )); } private void onBindKick(@NonNull MessageViewHolder holder, @NonNull Message message) { applyStyle(holder, serverStyle, highlightStyle, message.flags.Highlight); - holder.content.setText(message.toString()); + if (message.content.contains(" ")) + holder.content.setText(context.themeUtil().translations.formatKick( + formatNick(message.sender), + message.content.substring(0, message.content.indexOf(" ")), + message.content.substring(message.content.indexOf(" ") + 1) + )); + else + holder.content.setText(context.themeUtil().translations.formatKick( + formatNick(message.sender), + message.content + )); } private void onBindKill(@NonNull MessageViewHolder holder, @NonNull Message message) { applyStyle(holder, serverStyle, highlightStyle, message.flags.Highlight); - holder.content.setText(message.toString()); + if (message.content.contains(" ")) + holder.content.setText(context.themeUtil().translations.formatKill( + formatNick(message.sender), + message.content.substring(0, message.content.indexOf(" ")), + message.content.substring(message.content.indexOf(" ") + 1) + )); + else + holder.content.setText(context.themeUtil().translations.formatKill( + formatNick(message.sender), + message.content + )); } private void onBindServer(@NonNull MessageViewHolder holder, @NonNull Message message) { applyStyle(holder, serverStyle, highlightStyle, message.flags.Highlight); - holder.content.setText(message.toString()); + holder.content.setText(message.content); } private void onBindInfo(@NonNull MessageViewHolder holder, @NonNull Message message) { applyStyle(holder, serverStyle, highlightStyle, message.flags.Highlight); - holder.content.setText(message.toString()); + holder.content.setText(message.content); } private void onBindError(@NonNull MessageViewHolder holder, @NonNull Message message) { - applyStyle(holder, serverStyle, highlightStyle, message.flags.Highlight); - holder.content.setText(message.toString()); + applyStyle(holder, errorStyle, highlightStyle, message.flags.Highlight); + holder.content.setText(message.content); } private void onBindDayChange(@NonNull MessageViewHolder holder, @NonNull Message message) { @@ -216,8 +252,9 @@ public class ChatMessageRenderer { } private void onBindTopic(@NonNull MessageViewHolder holder, @NonNull Message message) { + System.out.println(message); applyStyle(holder, serverStyle, highlightStyle, message.flags.Highlight); - holder.content.setText(message.toString()); + holder.content.setText(message.content); } private void onBindNetsplitJoin(@NonNull MessageViewHolder holder, @NonNull Message message) { diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/fragment/ChatFragment.java b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/fragment/ChatFragment.java index ab349f567..5fc78b2f3 100644 --- a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/fragment/ChatFragment.java +++ b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/fragment/ChatFragment.java @@ -23,6 +23,7 @@ package de.kuschku.quasseldroid_ng.ui.chat.fragment; import android.os.Bundle; import android.support.annotation.Nullable; +import android.support.design.widget.FloatingActionButton; import android.support.v4.widget.SwipeRefreshLayout; import android.support.v7.widget.DefaultItemAnimator; import android.support.v7.widget.LinearLayoutManager; @@ -61,6 +62,9 @@ public class ChatFragment extends BoundFragment { @Bind(R.id.sliding_layout) SlidingUpPanelLayout sliderMain; + @Bind(R.id.scroll_down) + FloatingActionButton scrollDown; + private MessageAdapter messageAdapter; private LinearLayoutManager layoutManager; private boolean loading = false; @@ -91,6 +95,14 @@ public class ChatFragment extends BoundFragment { backlogManager.requestMoreBacklog(client.backlogManager().open(), 20); loading = true; } + scrollDown.setVisibility(recyclerView.canScrollVertically(1) ? View.VISIBLE : View.GONE); + } + }); + + scrollDown.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + messages.smoothScrollToPosition(0); } }); diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/theme/AppTheme.java b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/theme/AppTheme.java index 7d7578006..c77e5bab8 100644 --- a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/theme/AppTheme.java +++ b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/theme/AppTheme.java @@ -30,8 +30,6 @@ import de.kuschku.quasseldroid_ng.R; public enum AppTheme { QUASSEL_LIGHT(R.style.Quassel_Light), QUASSEL_DARK(R.style.Quassel_Dark), - MATERIAL_DARK(R.style.Material_Dark), - MATERIAL_LIGHT(R.style.Material_Light), SOLARIZED_LIGHT(R.style.Solarized_Light), SOLARIZED_DARK(R.style.Solarized_Dark); @@ -49,10 +47,6 @@ public enum AppTheme { public static AppTheme themeFromString(@Nullable String s) { if (s == null) s = ""; switch (s) { - case "MATERIAL_DARK": - return MATERIAL_DARK; - case "MATERIAL_LIGHT": - return MATERIAL_LIGHT; case "QUASSEL_DARK": return QUASSEL_DARK; case "SOLARIZED_LIGHT": diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/theme/ThemeUtil.java b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/theme/ThemeUtil.java index 0c649f6cc..481985a31 100644 --- a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/theme/ThemeUtil.java +++ b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/theme/ThemeUtil.java @@ -564,6 +564,9 @@ public class ThemeUtil { @AutoString(R.string.messageKill) public String messageKill; + @AutoString(R.string.messageKillExtra) + public String messageKillExtra; + @AutoString(R.string.messageKick) public String messageKick; @@ -585,6 +588,9 @@ public class ThemeUtil { @AutoString(R.string.messageAction) public String messageAction; + @AutoString(R.string.messageTopic) + public String messageTopic; + @AutoString(R.string.labelStatusBuffer) public String titleStatusBuffer; @@ -647,8 +653,13 @@ public class ThemeUtil { } @NonNull - public CharSequence formatKill(@NonNull CharSequence user, @NonNull CharSequence channel) { - return SpanFormatter.format(messageKill, user, channel); + public CharSequence formatKill(@NonNull CharSequence user, @NonNull CharSequence subject) { + return SpanFormatter.format(messageKill, user, subject); + } + + @NonNull + public CharSequence formatKill(@NonNull CharSequence user, @NonNull CharSequence subject, @Nullable CharSequence reason) { + return SpanFormatter.format(messageKillExtra, user, subject, reason); } @NonNull @@ -694,6 +705,11 @@ public class ThemeUtil { public CharSequence formatPlain(@NonNull CharSequence nick, @NonNull CharSequence message) { return SpanFormatter.format(messagePlain, nick, message); } + + @NonNull + public CharSequence formatTopic(@NonNull CharSequence nick, @NonNull CharSequence channel, @NonNull CharSequence message) { + return SpanFormatter.format(messageTopic, nick, channel, message); + } } public static class Colors { @@ -747,6 +763,10 @@ public class ThemeUtil { @ColorInt public int colorForegroundAction; + @AutoColor(R.attr.colorForegroundError) + @ColorInt + public int colorForegroundError; + @AutoColor(R.attr.colorBackground) @ColorInt public int colorBackground; diff --git a/app/src/main/res/layout/fragment_chat.xml b/app/src/main/res/layout/fragment_chat.xml index 100626338..79ca8b88c 100644 --- a/app/src/main/res/layout/fragment_chat.xml +++ b/app/src/main/res/layout/fragment_chat.xml @@ -34,11 +34,32 @@ app:umanoShadowHeight="4dp" tools:showIn="@layout/activity_chat"> - <android.support.v7.widget.RecyclerView - android:id="@+id/messages" + <FrameLayout android:layout_width="match_parent" - android:layout_height="match_parent" - android:clickable="true" /> + android:layout_height="match_parent"> + + <android.support.v7.widget.RecyclerView + android:id="@+id/messages" + android:layout_width="match_parent" + android:layout_height="match_parent" + android:clickable="true" /> + + <android.support.design.widget.FloatingActionButton + android:id="@+id/scroll_down" + android:visibility="gone" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:src="@drawable/ic_scroll_down_dark" + app:fabSize="mini" + android:layout_marginRight="12dp" + android:layout_marginEnd="12dp" + android:layout_marginBottom="12dp" + app:backgroundTint="#8A808080" + app:elevation="0dip" + app:pressedTranslationZ="0dip" + android:layout_gravity="end|bottom" /> + + </FrameLayout> <include layout="@layout/widget_slider" /> diff --git a/app/src/main/res/values/attrs.xml b/app/src/main/res/values/attrs.xml index b006f4508..b7b150121 100644 --- a/app/src/main/res/values/attrs.xml +++ b/app/src/main/res/values/attrs.xml @@ -64,7 +64,8 @@ <attr name="colorForeground" format="color" /> <attr name="colorForegroundHighlight" format="color" /> <attr name="colorForegroundSecondary" format="color" /> - <attr name="colorForegroundAction" /> + <attr name="colorForegroundAction" format="color" /> + <attr name="colorForegroundError" format="color" /> <attr name="colorAccentFocus" format="color" /> <attr name="colorDivider" format="color" /> diff --git a/app/src/main/res/values/strings_format.xml b/app/src/main/res/values/strings_format.xml index 852d78f03..316a77e23 100644 --- a/app/src/main/res/values/strings_format.xml +++ b/app/src/main/res/values/strings_format.xml @@ -34,7 +34,8 @@ <string name="messageQuit">%1$s has quit</string> <string name="messageQuitExtra">%1$s has quit (%2$s)</string> - <string name="messageKill">%1$s was killed: %2$s</string> + <string name="messageKill">%1$s has killed %2$s</string> + <string name="messageKillExtra">%1$s has killed %2$s: %3$s</string> <string name="messageKick">%1$s has kicked %2$s from %3$s</string> <string name="messageKickExtra">%1$s has kicked %2$s from %3$s: %4$s</string> @@ -47,4 +48,6 @@ <string name="messageDayChange">{ Day changed to %1$s }</string> <string name="messageAction">* %1$s %2$s</string> + + <string name="messageTopic">%1$s has changed topic for %2$s to: "%3$s"</string> </resources> diff --git a/app/src/main/res/values/themes.xml b/app/src/main/res/values/themes.xml index 96528bf4e..36fc79bf4 100644 --- a/app/src/main/res/values/themes.xml +++ b/app/src/main/res/values/themes.xml @@ -21,106 +21,6 @@ --> <resources> - <style name="Material_Light" parent="AppTheme.Light"> - <item name="senderColor0">@color/md_pink_500</item> - <item name="senderColor1">@color/md_purple_500</item> - <item name="senderColor2">@color/md_red_500</item> - <item name="senderColor3">@color/md_green_500</item> - <item name="senderColor4">@color/md_cyan_500</item> - <item name="senderColor5">@color/md_deep_purple_500</item> - <item name="senderColor6">@color/md_amber_500</item> - <item name="senderColor7">@color/md_blue_500</item> - <item name="senderColor8">@color/md_pink_500</item> - <item name="senderColor9">@color/md_purple_500</item> - <item name="senderColorA">@color/md_red_500</item> - <item name="senderColorB">@color/md_green_500</item> - <item name="senderColorC">@color/md_cyan_500</item> - <item name="senderColorD">@color/md_deep_purple_500</item> - <item name="senderColorE">@color/md_amber_500</item> - <item name="senderColorF">@color/md_blue_500</item> - - <item name="mircColor0">#f2f2f2</item> - <item name="mircColor1">#2c2c2c</item> - <item name="mircColor2">#2467be</item> - <item name="mircColor3">#568a34</item> - <item name="mircColor4">#ec5354</item> - <item name="mircColor5">#c3282d</item> - <item name="mircColor6">#6a2398</item> - <item name="mircColor7">#fc8e23</item> - <item name="mircColor8">#fc9f25</item> - <item name="mircColor9">#8cc251</item> - <item name="mircColorA">#17838e</item> - <item name="mircColorB">#39c6d9</item> - <item name="mircColorC">#6bb6f4</item> - <item name="mircColorD">#b96ac6</item> - <item name="mircColorE">#545454</item> - <item name="mircColorF">#e0e0e0</item> - - <item name="colorForeground">@color/md_light_primary_text</item> - <item name="colorForegroundHighlight">@color/md_light_primary_text</item> - <item name="colorForegroundSecondary">@color/md_light_secondary</item> - <item name="colorForegroundAction">#1a237e</item> - - <item name="colorBackground">@color/md_light_background</item> - <item name="colorBackgroundHighlight">#ff8811</item> - <item name="colorBackgroundSecondary">@android:color/transparent</item> - <item name="colorBackgroundCard">@color/md_light_cards</item> - - <item name="colorTintActivity">#88cc33</item> - <item name="colorTintMessage">#2277dd</item> - <item name="colorTintHighlight">#ff8811</item> - </style> - - <style name="Material_Dark" parent="AppTheme"> - <item name="senderColor0">@color/md_pink_500</item> - <item name="senderColor1">@color/md_purple_500</item> - <item name="senderColor2">@color/md_red_500</item> - <item name="senderColor3">@color/md_green_500</item> - <item name="senderColor4">@color/md_cyan_500</item> - <item name="senderColor5">@color/md_deep_purple_500</item> - <item name="senderColor6">@color/md_amber_500</item> - <item name="senderColor7">@color/md_blue_500</item> - <item name="senderColor8">@color/md_pink_500</item> - <item name="senderColor9">@color/md_purple_500</item> - <item name="senderColorA">@color/md_red_500</item> - <item name="senderColorB">@color/md_green_500</item> - <item name="senderColorC">@color/md_cyan_500</item> - <item name="senderColorD">@color/md_deep_purple_500</item> - <item name="senderColorE">@color/md_amber_500</item> - <item name="senderColorF">@color/md_blue_500</item> - - <item name="mircColor0">#f2f2f2</item> - <item name="mircColor1">#2c2c2c</item> - <item name="mircColor2">#2467be</item> - <item name="mircColor3">#568a34</item> - <item name="mircColor4">#ec5354</item> - <item name="mircColor5">#c3282d</item> - <item name="mircColor6">#6a2398</item> - <item name="mircColor7">#fc8e23</item> - <item name="mircColor8">#fc9f25</item> - <item name="mircColor9">#8cc251</item> - <item name="mircColorA">#17838e</item> - <item name="mircColorB">#39c6d9</item> - <item name="mircColorC">#6bb6f4</item> - <item name="mircColorD">#b96ac6</item> - <item name="mircColorE">#545454</item> - <item name="mircColorF">#e0e0e0</item> - - <item name="colorForeground">@color/md_dark_primary_text</item> - <item name="colorForegroundHighlight">@color/md_dark_primary_text</item> - <item name="colorForegroundSecondary">@color/md_dark_secondary</item> - <item name="colorForegroundAction">#7986cb</item> - - <item name="colorBackground">@color/md_dark_background</item> - <item name="colorBackgroundHighlight">#ff8811</item> - <item name="colorBackgroundSecondary">@android:color/transparent</item> - <item name="colorBackgroundCard">@color/md_dark_cards</item> - - <item name="colorTintActivity">#88cc33</item> - <item name="colorTintMessage">#2277dd</item> - <item name="colorTintHighlight">#ff8811</item> - </style> - <style name="Quassel_Light" parent="AppTheme.Light"> <item name="senderColor0">#e90d7f</item> <item name="senderColor1">#8e55e9</item> @@ -160,6 +60,7 @@ <item name="colorForegroundHighlight">@color/md_light_primary_text</item> <item name="colorForegroundSecondary">@color/md_light_secondary</item> <item name="colorForegroundAction">#1a237e</item> + <item name="colorForegroundError">#800000</item> <item name="colorBackground">@color/md_light_background</item> <item name="colorBackgroundHighlight">#ff8811</item> @@ -210,6 +111,7 @@ <item name="colorForegroundHighlight">@color/md_dark_primary_text</item> <item name="colorForegroundSecondary">@color/md_dark_secondary</item> <item name="colorForegroundAction">#7986cb</item> + <item name="colorForegroundError">#800000</item> <item name="colorBackground">@color/md_dark_background</item> <item name="colorBackgroundHighlight">#ff8811</item> @@ -266,6 +168,7 @@ <item name="colorForegroundHighlight">#839495</item> <item name="colorForegroundSecondary">#576A66</item> <item name="colorForegroundAction">#268BD2</item> + <item name="colorForegroundError">#B00000</item> <item name="colorBackground">#FDF6E3</item> <item name="colorBackgroundHighlight">#268bd2</item> @@ -321,6 +224,7 @@ <item name="colorForegroundHighlight">#839495</item> <item name="colorForegroundSecondary">#576A66</item> <item name="colorForegroundAction">#268BD2</item> + <item name="colorForegroundError">#B00000</item> <item name="colorBackground">#002B36</item> <item name="colorBackgroundHighlight">#268bd2</item> -- GitLab