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