From 42421cd5204c23bc79896d4af757d71ebe21d260 Mon Sep 17 00:00:00 2001
From: Janne Koschinski <janne@kuschku.de>
Date: Fri, 29 Jan 2016 12:55:57 +0100
Subject: [PATCH] =?UTF-8?q?Updated=20UI:=20=20-=20Sliding=20Panel=20isn?=
 =?UTF-8?q?=E2=80=99t=20above=20ActionBar=20anymore=20=20-=20Sliding=20Pan?=
 =?UTF-8?q?el=E2=80=99s=20chatline=20automatically=20expands=20in=20expand?=
 =?UTF-8?q?ed=20view?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../ui/chat/BufferViewConfigWrapper.java      |   5 +-
 .../quasseldroid_ng/ui/chat/ChatActivity.java | 106 ++++++++++++------
 .../ui/chat/chatview/ChatMessageRenderer.java |  33 +++---
 .../ui/chat/chatview/MessageAdapter.java      |   3 +-
 .../ui/chat/drawer/BufferItem.java            |   2 +-
 .../ui/chat/drawer/NetworkItem.java           |  11 +-
 .../ui/{ => theme}/AppContext.java            |   3 +-
 .../ui/{ => theme}/AppTheme.java              |   2 +-
 .../ui/theme}/ThemeUtil.java                  |  17 ++-
 .../util/annotationbind/AutoBinder.java       |  19 ++++
 .../util/annotationbind/AutoDimen.java        |  12 ++
 .../de/kuschku/util/irc/IrcFormatHelper.java  |   2 +-
 .../java/de/kuschku/util/ui/MessageUtil.java  |  10 +-
 app/src/main/res/layout/activity_chat.xml     |  27 +++--
 app/src/main/res/layout/slider_main.xml       |  18 +--
 app/src/main/res/values/attrs.xml             |   3 +
 app/src/main/res/values/colors.xml            |   3 +-
 app/src/main/res/values/styles.xml            |   8 ++
 18 files changed, 178 insertions(+), 106 deletions(-)
 rename app/src/main/java/de/kuschku/quasseldroid_ng/ui/{ => theme}/AppContext.java (94%)
 rename app/src/main/java/de/kuschku/quasseldroid_ng/ui/{ => theme}/AppTheme.java (95%)
 rename app/src/main/java/de/kuschku/{util/ui => quasseldroid_ng/ui/theme}/ThemeUtil.java (89%)
 create mode 100644 app/src/main/java/de/kuschku/util/annotationbind/AutoDimen.java

diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/BufferViewConfigWrapper.java b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/BufferViewConfigWrapper.java
index 474ba962c..f6512fed1 100644
--- a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/BufferViewConfigWrapper.java
+++ b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/BufferViewConfigWrapper.java
@@ -3,16 +3,13 @@ package de.kuschku.quasseldroid_ng.ui.chat;
 import com.mikepenz.materialdrawer.Drawer;
 import com.mikepenz.materialdrawer.model.interfaces.IDrawerItem;
 
-import java.lang.reflect.Array;
 import java.util.ArrayList;
 
-import de.kuschku.libquassel.Client;
 import de.kuschku.libquassel.syncables.types.BufferViewConfig;
 import de.kuschku.libquassel.syncables.types.Network;
-import de.kuschku.quasseldroid_ng.ui.AppContext;
+import de.kuschku.quasseldroid_ng.ui.theme.AppContext;
 import de.kuschku.quasseldroid_ng.ui.chat.drawer.NetworkItem;
 import de.kuschku.util.observables.callbacks.ElementCallback;
-import de.kuschku.util.observables.lists.ObservableComparableSortedList;
 import de.kuschku.util.observables.lists.ObservableSortedList;
 
 import static de.kuschku.util.AndroidAssert.assertNotNull;
diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/ChatActivity.java b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/ChatActivity.java
index 51072a4ef..ebc3a2790 100644
--- a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/ChatActivity.java
+++ b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/ChatActivity.java
@@ -20,17 +20,13 @@ import android.support.v7.widget.LinearLayoutManager;
 import android.support.v7.widget.RecyclerView;
 import android.support.v7.widget.Toolbar;
 import android.util.Log;
-import android.view.LayoutInflater;
-import android.view.Menu;
-import android.view.MenuItem;
 import android.view.View;
+import android.view.ViewGroup;
 
-import com.afollestad.materialdialogs.DialogAction;
 import com.afollestad.materialdialogs.MaterialDialog;
 import com.google.common.base.Splitter;
 import com.mikepenz.fastadapter.FastAdapter;
 import com.mikepenz.fastadapter.IExpandable;
-import com.mikepenz.fastadapter.IItem;
 import com.mikepenz.materialdrawer.AccountHeader;
 import com.mikepenz.materialdrawer.AccountHeaderBuilder;
 import com.mikepenz.materialdrawer.Drawer;
@@ -38,43 +34,40 @@ import com.mikepenz.materialdrawer.DrawerBuilder;
 import com.mikepenz.materialdrawer.model.PrimaryDrawerItem;
 import com.mikepenz.materialdrawer.model.ProfileDrawerItem;
 import com.mikepenz.materialdrawer.model.SecondaryDrawerItem;
-import com.mikepenz.materialdrawer.model.interfaces.IDrawerItem;
-import com.mikepenz.materialdrawer.model.interfaces.IProfile;
 import com.sothree.slidinguppanel.SlidingUpPanelLayout;
 
 import java.util.Map;
 
+import aspm.annotations.BooleanPreference;
+import aspm.annotations.IntPreference;
 import aspm.annotations.PreferenceWrapper;
+import aspm.annotations.StringPreference;
 import butterknife.Bind;
 import butterknife.ButterKnife;
 import de.kuschku.libquassel.BusProvider;
-import de.kuschku.libquassel.Client;
 import de.kuschku.libquassel.events.BacklogReceivedEvent;
 import de.kuschku.libquassel.events.ConnectionChangeEvent;
 import de.kuschku.libquassel.events.GeneralErrorEvent;
 import de.kuschku.libquassel.events.LagChangedEvent;
-import de.kuschku.libquassel.exceptions.UnknownTypeException;
 import de.kuschku.libquassel.localtypes.Buffer;
 import de.kuschku.libquassel.message.Message;
 import de.kuschku.libquassel.syncables.types.BufferViewConfig;
 import de.kuschku.libquassel.syncables.types.BufferViewManager;
-import de.kuschku.libquassel.syncables.types.Network;
 import de.kuschku.quasseldroid_ng.BuildConfig;
 import de.kuschku.quasseldroid_ng.R;
 import de.kuschku.quasseldroid_ng.service.ClientBackgroundThread;
 import de.kuschku.quasseldroid_ng.service.QuasselService;
-import de.kuschku.quasseldroid_ng.ui.AppContext;
-import de.kuschku.quasseldroid_ng.ui.AppTheme;
 import de.kuschku.quasseldroid_ng.ui.chat.chatview.MessageAdapter;
-import de.kuschku.quasseldroid_ng.ui.chat.drawer.NetworkItem;
-import de.kuschku.util.keyboardutils.DialogKeyboardUtil;
+import de.kuschku.quasseldroid_ng.ui.theme.AppContext;
+import de.kuschku.quasseldroid_ng.ui.theme.AppTheme;
+import de.kuschku.quasseldroid_ng.ui.theme.ThemeUtil;
 import de.kuschku.util.ServerAddress;
 import de.kuschku.util.instancestateutil.Storable;
 import de.kuschku.util.instancestateutil.Store;
+import de.kuschku.util.keyboardutils.DialogKeyboardUtil;
 import de.kuschku.util.observables.AutoScroller;
 import de.kuschku.util.observables.lists.ObservableSortedList;
 import de.kuschku.util.ui.SpanFormatter;
-import de.kuschku.util.ui.ThemeUtil;
 
 import static de.kuschku.util.AndroidAssert.assertNotNull;
 
@@ -97,20 +90,19 @@ public class ChatActivity extends AppCompatActivity {
     SwipeRefreshLayout swipeView;
     @Bind(R.id.messages)
     RecyclerView messages;
-    private boolean tr = true;
-
 
     @PreferenceWrapper(BuildConfig.APPLICATION_ID)
     public static abstract class Settings {
+        @StringPreference("QUASSEL_LIGHT")
         String theme;
-        boolean fullHostmask;
-        int textSize;
-        boolean mircColors;
-
-        String lastHost;
-        int lastPort;
-        String lastUsername;
-        String lastPassword;
+        @BooleanPreference(false)   boolean fullHostmask;
+        @IntPreference(2)           int textSize;
+        @BooleanPreference(true)    boolean mircColors;
+
+        @StringPreference("")       String lastHost;
+        @IntPreference(4242)        int lastPort;
+        @StringPreference("")       String lastUsername;
+        @StringPreference("")       String lastPassword;
     }
 
     private AppContext context = new AppContext();
@@ -207,9 +199,6 @@ public class ChatActivity extends AppCompatActivity {
         drawerLeft.addStickyFooterItem(new SecondaryDrawerItem().withName("Settings").withIdentifier(-2));
         drawerLeft.setOnDrawerItemClickListener((view, position, drawerItem) -> {
             long identifier = drawerItem.getIdentifier();
-            Log.e("DEBUG", "IDENT: "+identifier);
-            Log.e("DEBUG", "IDENT: "+(identifier==-1));
-            Log.e("DEBUG", "IDENT: "+(identifier==-2));
             if (identifier == -1) {
                 showConnectDialog();
                 return false;
@@ -236,13 +225,52 @@ public class ChatActivity extends AppCompatActivity {
         msgHistory.setLayoutManager(new LinearLayoutManager(this));
         msgHistory.setItemAnimator(new DefaultItemAnimator());
 
-        swipeView.setColorSchemeColors(context.getThemeUtil().colors.colorPrimary);
+        swipeView.setColorSchemeColors(context.getThemeUtil().res.colorPrimary);
         swipeView.setOnRefreshListener(() -> {
             assertNotNull(context.getClient());
             context.getClient().getBacklogManager().requestMoreBacklog(status.bufferId, 20);
         });
 
         send.setOnClickListener(view -> sendInput());
+
+        slidingLayout.setPanelSlideListener(new SlidingUpPanelLayout.PanelSlideListener() {
+            @Override
+            public void onPanelSlide(View panel, float slideOffset) {
+
+            }
+
+            @Override
+            public void onPanelCollapsed(View panel) {
+                int selectionStart = chatline.getSelectionStart();
+                int selectionEnd = chatline.getSelectionEnd();
+
+                chatline.getLayoutParams().height =context.getThemeUtil().res.actionBarSize;
+                chatline.setSingleLine(true);
+
+                chatline.setSelection(selectionStart, selectionEnd);
+            }
+
+            @Override
+            public void onPanelExpanded(View panel) {
+                int selectionStart = chatline.getSelectionStart();
+                int selectionEnd = chatline.getSelectionEnd();
+
+                chatline.getLayoutParams().height = ViewGroup.LayoutParams.WRAP_CONTENT;
+                chatline.setSingleLine(false);
+
+                chatline.setSelection(selectionStart, selectionEnd);
+            }
+
+            @Override
+            public void onPanelAnchored(View panel) {
+
+            }
+
+            @Override
+            public void onPanelHidden(View panel) {
+
+            }
+        });
     }
 
     public void showThemeDialog() {
@@ -257,13 +285,14 @@ public class ChatActivity extends AppCompatActivity {
         new MaterialDialog.Builder(this)
                 .items(strings)
                 .positiveText("Select Theme")
-                .neutralText("Cancel")
+                .negativeText("Cancel")
                 .itemsCallbackSingleChoice(startIndex, (dialog, itemView, which, text) -> {
                     context.getSettings().theme.set(strings[dialog.getSelectedIndex()]);
                     recreate();
                     return true;
                 })
-                .buttonRippleColor(context.getThemeUtil().colors.colorAccent)
+                .negativeColor(context.getThemeUtil().res.colorForeground)
+                .buttonRippleColor(context.getThemeUtil().res.colorAccentFocus)
                 .build()
                 .show();
     }
@@ -408,12 +437,14 @@ public class ChatActivity extends AppCompatActivity {
 
                     Log.e("TIME", String.valueOf(System.currentTimeMillis()));
                 })
+                .negativeColor(context.getThemeUtil().res.colorForeground)
+                .buttonRippleColor(context.getThemeUtil().res.colorAccentFocus)
                 .positiveText("Login")
-                .neutralText("Cancel")
+                .negativeText("Cancel")
                 .build();
         dialog.setOnKeyListener(new DialogKeyboardUtil(dialog));
-        ((AppCompatEditText) dialog.getView().findViewById(R.id.username)).setText(context.getSettings().lastUsername.or(""));
-        ((AppCompatEditText) dialog.getView().findViewById(R.id.password)).setText(context.getSettings().lastPassword.or(""));
+        ((AppCompatEditText) dialog.getView().findViewById(R.id.username)).setText(context.getSettings().lastUsername.get());
+        ((AppCompatEditText) dialog.getView().findViewById(R.id.password)).setText(context.getSettings().lastPassword.get());
         dialog.show();
     }
 
@@ -431,15 +462,16 @@ public class ChatActivity extends AppCompatActivity {
                     context.getSettings().lastPort.set(port);
                     serviceInterface.connect(new ServerAddress(host, port));
                 })
+                .negativeColor(context.getThemeUtil().res.colorForeground)
                 .positiveText("Connect")
-                .neutralText("Cancel")
+                .negativeText("Cancel")
                 .build();
         AppCompatEditText hostField = (AppCompatEditText) dialog.getView().findViewById(R.id.host);
         AppCompatEditText portField = (AppCompatEditText) dialog.getView().findViewById(R.id.port);
 
         dialog.setOnKeyListener(new DialogKeyboardUtil(dialog));
-        hostField.setText(context.getSettings().lastHost.or(""));
-        portField.setText(String.valueOf(context.getSettings().lastPort.or(4242)));
+        hostField.setText(context.getSettings().lastHost.get());
+        portField.setText(String.valueOf(context.getSettings().lastPort.get()));
 
         dialog.show();
     }
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 7b70ddd74..d8a929f9c 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
@@ -8,19 +8,16 @@ import android.support.annotation.Nullable;
 import android.support.annotation.UiThread;
 import android.util.Log;
 
-import org.joda.time.format.DateTimeFormatter;
-
 import de.kuschku.libquassel.localtypes.Buffer;
 import de.kuschku.libquassel.message.Message;
 import de.kuschku.quasseldroid_ng.R;
-import de.kuschku.quasseldroid_ng.ui.AppContext;
+import de.kuschku.quasseldroid_ng.ui.theme.AppContext;
 import de.kuschku.util.annotationbind.AutoBinder;
 import de.kuschku.util.annotationbind.AutoString;
 import de.kuschku.util.irc.IrcFormatHelper;
 import de.kuschku.util.irc.IrcUserUtils;
-import de.kuschku.util.ui.DateTimeFormatHelper;
 import de.kuschku.util.ui.SpanFormatter;
-import de.kuschku.util.ui.ThemeUtil;
+import de.kuschku.quasseldroid_ng.ui.theme.ThemeUtil;
 
 import static de.kuschku.util.AndroidAssert.assertNotNull;
 
@@ -45,31 +42,31 @@ public class ChatMessageRenderer {
     }
 
     public void setTheme(ThemeUtil themeUtil) {
-        this.helper = new IrcFormatHelper(themeUtil.colors);
+        this.helper = new IrcFormatHelper(themeUtil.res);
 
         this.highlightStyle = new MessageStyleContainer(
-                themeUtil.colors.colorForegroundHighlight,
+                themeUtil.res.colorForegroundHighlight,
                 Typeface.NORMAL,
-                themeUtil.colors.colorForegroundHighlight,
-                themeUtil.colors.colorBackgroundHighlight
+                themeUtil.res.colorForegroundHighlight,
+                themeUtil.res.colorBackgroundHighlight
         );
         this.serverStyle = new MessageStyleContainer(
-                themeUtil.colors.colorForegroundSecondary,
+                themeUtil.res.colorForegroundSecondary,
                 Typeface.ITALIC,
-                themeUtil.colors.colorForegroundSecondary,
-                themeUtil.colors.colorBackgroundSecondary
+                themeUtil.res.colorForegroundSecondary,
+                themeUtil.res.colorBackgroundSecondary
         );
         this.plainStyle = new MessageStyleContainer(
-                themeUtil.colors.colorForeground,
+                themeUtil.res.colorForeground,
                 Typeface.NORMAL,
-                themeUtil.colors.colorForegroundSecondary,
-                themeUtil.colors.transparent
+                themeUtil.res.colorForegroundSecondary,
+                themeUtil.res.transparent
         );
         this.actionStyle = new MessageStyleContainer(
-                themeUtil.colors.colorForegroundAction,
+                themeUtil.res.colorForegroundAction,
                 Typeface.ITALIC,
-                themeUtil.colors.colorForegroundSecondary,
-                themeUtil.colors.transparent
+                themeUtil.res.colorForegroundSecondary,
+                themeUtil.res.transparent
         );
     }
 
diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/chatview/MessageAdapter.java b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/chatview/MessageAdapter.java
index 61e434651..92ded6f6a 100644
--- a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/chatview/MessageAdapter.java
+++ b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/chatview/MessageAdapter.java
@@ -8,10 +8,9 @@ import android.support.v7.widget.RecyclerView;
 import android.view.LayoutInflater;
 import android.view.ViewGroup;
 
-import de.kuschku.libquassel.Client;
 import de.kuschku.libquassel.message.Message;
 import de.kuschku.quasseldroid_ng.R;
-import de.kuschku.quasseldroid_ng.ui.AppContext;
+import de.kuschku.quasseldroid_ng.ui.theme.AppContext;
 import de.kuschku.util.observables.AutoScroller;
 import de.kuschku.util.observables.callbacks.UICallback;
 import de.kuschku.util.observables.callbacks.wrappers.AdapterUICallbackWrapper;
diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/drawer/BufferItem.java b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/drawer/BufferItem.java
index 320a41bb2..9ac11f026 100644
--- a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/drawer/BufferItem.java
+++ b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/drawer/BufferItem.java
@@ -17,7 +17,7 @@ import de.kuschku.libquassel.localtypes.QueryBuffer;
 import de.kuschku.libquassel.localtypes.StatusBuffer;
 import de.kuschku.libquassel.message.Message;
 import de.kuschku.quasseldroid_ng.R;
-import de.kuschku.quasseldroid_ng.ui.AppContext;
+import de.kuschku.quasseldroid_ng.ui.theme.AppContext;
 import de.kuschku.util.observables.IObservable;
 import de.kuschku.util.observables.callbacks.GeneralCallback;
 import de.kuschku.util.observables.callbacks.wrappers.GeneralCallbackWrapper;
diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/drawer/NetworkItem.java b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/drawer/NetworkItem.java
index 7c03161fb..0ed01812c 100644
--- a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/drawer/NetworkItem.java
+++ b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/drawer/NetworkItem.java
@@ -1,35 +1,26 @@
 package de.kuschku.quasseldroid_ng.ui.chat.drawer;
 
-import android.content.Context;
 import android.util.Log;
 import android.util.SparseArray;
-import android.view.View;
-import android.widget.TextView;
 
-import com.mikepenz.fastadapter.utils.ViewHolderFactory;
 import com.mikepenz.materialdrawer.holder.ColorHolder;
 import com.mikepenz.materialdrawer.holder.StringHolder;
-import com.mikepenz.materialdrawer.model.BaseViewHolder;
 import com.mikepenz.materialdrawer.model.PrimaryDrawerItem;
 import com.mikepenz.materialdrawer.model.interfaces.IDrawerItem;
 
 import java.util.ArrayList;
 import java.util.List;
 
-import de.kuschku.libquassel.Client;
 import de.kuschku.libquassel.localtypes.Buffer;
 import de.kuschku.libquassel.syncables.types.BufferViewConfig;
 import de.kuschku.libquassel.syncables.types.Network;
-import de.kuschku.quasseldroid_ng.ui.AppContext;
-import de.kuschku.util.AndroidAssert;
+import de.kuschku.quasseldroid_ng.ui.theme.AppContext;
 import de.kuschku.util.observables.IObservable;
 import de.kuschku.util.observables.callbacks.ElementCallback;
 import de.kuschku.util.observables.callbacks.GeneralCallback;
 import de.kuschku.util.observables.callbacks.wrappers.GeneralCallbackWrapper;
 import de.kuschku.util.observables.lists.ObservableSortedList;
 
-import static de.kuschku.util.AndroidAssert.*;
-
 public class NetworkItem extends PrimaryDrawerItem implements IObservable<GeneralCallback>, GeneralCallback {
     private final AppContext context;
     private final Network network;
diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/AppContext.java b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/theme/AppContext.java
similarity index 94%
rename from app/src/main/java/de/kuschku/quasseldroid_ng/ui/AppContext.java
rename to app/src/main/java/de/kuschku/quasseldroid_ng/ui/theme/AppContext.java
index 2851cbb08..06bf9f86d 100644
--- a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/AppContext.java
+++ b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/theme/AppContext.java
@@ -1,9 +1,8 @@
-package de.kuschku.quasseldroid_ng.ui;
+package de.kuschku.quasseldroid_ng.ui.theme;
 
 import de.kuschku.libquassel.BusProvider;
 import de.kuschku.libquassel.Client;
 import de.kuschku.quasseldroid_ng.ui.chat.WrappedSettings;
-import de.kuschku.util.ui.ThemeUtil;
 
 public class AppContext {
     private ThemeUtil themeUtil;
diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/AppTheme.java b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/theme/AppTheme.java
similarity index 95%
rename from app/src/main/java/de/kuschku/quasseldroid_ng/ui/AppTheme.java
rename to app/src/main/java/de/kuschku/quasseldroid_ng/ui/theme/AppTheme.java
index 6753fd622..19f7f5231 100644
--- a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/AppTheme.java
+++ b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/theme/AppTheme.java
@@ -1,4 +1,4 @@
-package de.kuschku.quasseldroid_ng.ui;
+package de.kuschku.quasseldroid_ng.ui.theme;
 
 import android.support.annotation.StyleRes;
 
diff --git a/app/src/main/java/de/kuschku/util/ui/ThemeUtil.java b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/theme/ThemeUtil.java
similarity index 89%
rename from app/src/main/java/de/kuschku/util/ui/ThemeUtil.java
rename to app/src/main/java/de/kuschku/quasseldroid_ng/ui/theme/ThemeUtil.java
index 8e4732d42..a4295233e 100644
--- a/app/src/main/java/de/kuschku/util/ui/ThemeUtil.java
+++ b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/theme/ThemeUtil.java
@@ -1,4 +1,4 @@
-package de.kuschku.util.ui;
+package de.kuschku.quasseldroid_ng.ui.theme;
 
 import android.content.Context;
 import android.support.annotation.ColorInt;
@@ -7,13 +7,14 @@ import android.support.annotation.UiThread;
 import android.support.v7.view.ContextThemeWrapper;
 
 import de.kuschku.quasseldroid_ng.R;
-import de.kuschku.quasseldroid_ng.ui.AppTheme;
 import de.kuschku.util.annotationbind.AutoBinder;
 import de.kuschku.util.annotationbind.AutoColor;
+import de.kuschku.util.annotationbind.AutoDimen;
+import de.kuschku.util.ui.DateTimeFormatHelper;
 
 public class ThemeUtil {
     @NonNull
-    public final Colors colors = new Colors();
+    public final Colors res = new Colors();
     public DateTimeFormatHelper formatter;
 
     public ThemeUtil(@NonNull Context ctx) {
@@ -29,7 +30,7 @@ public class ThemeUtil {
     @UiThread
     public void initColors(@NonNull ContextThemeWrapper wrapper) {
         try {
-            AutoBinder.bind(colors, wrapper);
+            AutoBinder.bind(res, wrapper);
         } catch (IllegalAccessException e) {
             e.printStackTrace();
         }
@@ -52,6 +53,10 @@ public class ThemeUtil {
         @ColorInt
         public int colorAccent;
 
+        @AutoColor(R.attr.colorAccentFocus)
+        @ColorInt
+        public int colorAccentFocus;
+
         @AutoColor({R.attr.senderColor0, R.attr.senderColor1, R.attr.senderColor2, R.attr.senderColor3,
                 R.attr.senderColor4, R.attr.senderColor5, R.attr.senderColor6, R.attr.senderColor7,
                 R.attr.senderColor8, R.attr.senderColor9, R.attr.senderColorA, R.attr.senderColorB,
@@ -109,5 +114,9 @@ public class ThemeUtil {
         @AutoColor(R.attr.colorTintHighlight)
         @ColorInt
         public int colorTintHighlight;
+
+        @AutoDimen(R.attr.actionBarSize)
+        @ColorInt
+        public int actionBarSize;
     }
 }
diff --git a/app/src/main/java/de/kuschku/util/annotationbind/AutoBinder.java b/app/src/main/java/de/kuschku/util/annotationbind/AutoBinder.java
index 04826ca7d..d9d05980f 100644
--- a/app/src/main/java/de/kuschku/util/annotationbind/AutoBinder.java
+++ b/app/src/main/java/de/kuschku/util/annotationbind/AutoBinder.java
@@ -46,6 +46,14 @@ public class AutoBinder {
                     f.set(o, strings[0]);
                 else
                     throw new IllegalAccessException("Field length does not correspond to argument length");
+            } else if (f.isAnnotationPresent(AutoDimen.class)) {
+                int[] dimens = obtainDimen(f.getAnnotation(AutoDimen.class).value(), theme);
+                if (f.getType().isArray())
+                    f.set(o, dimens);
+                else if (dimens.length == 1)
+                    f.set(o, dimens[0]);
+                else
+                    throw new IllegalAccessException("Field length does not correspond to argument length");
             }
         }
     }
@@ -70,4 +78,15 @@ public class AutoBinder {
         }
         return result;
     }
+
+    @NonNull
+    private static int[] obtainDimen(@NonNull int[] res, @NonNull Resources.Theme theme) {
+        int[] result = new int[res.length];
+        TypedArray t = theme.obtainStyledAttributes(res);
+        for (int i = 0; i < res.length; i++) {
+            result[i] = (int) t.getDimension(i, 0x00000000);
+        }
+        t.recycle();
+        return result;
+    }
 }
diff --git a/app/src/main/java/de/kuschku/util/annotationbind/AutoDimen.java b/app/src/main/java/de/kuschku/util/annotationbind/AutoDimen.java
new file mode 100644
index 000000000..61b43cb62
--- /dev/null
+++ b/app/src/main/java/de/kuschku/util/annotationbind/AutoDimen.java
@@ -0,0 +1,12 @@
+package de.kuschku.util.annotationbind;
+
+import android.support.annotation.AnyRes;
+import android.support.annotation.NonNull;
+
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+
+@Retention(RetentionPolicy.RUNTIME)
+public @interface AutoDimen {
+    @NonNull @AnyRes int[] value() default {};
+}
diff --git a/app/src/main/java/de/kuschku/util/irc/IrcFormatHelper.java b/app/src/main/java/de/kuschku/util/irc/IrcFormatHelper.java
index 11aa24459..077562e98 100644
--- a/app/src/main/java/de/kuschku/util/irc/IrcFormatHelper.java
+++ b/app/src/main/java/de/kuschku/util/irc/IrcFormatHelper.java
@@ -24,7 +24,7 @@ import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 
 import de.kuschku.quasseldroid_ng.R;
-import de.kuschku.util.ui.ThemeUtil;
+import de.kuschku.quasseldroid_ng.ui.theme.ThemeUtil;
 
 public class IrcFormatHelper {
     @NonNull
diff --git a/app/src/main/java/de/kuschku/util/ui/MessageUtil.java b/app/src/main/java/de/kuschku/util/ui/MessageUtil.java
index 75a7e02cd..cd301f37a 100644
--- a/app/src/main/java/de/kuschku/util/ui/MessageUtil.java
+++ b/app/src/main/java/de/kuschku/util/ui/MessageUtil.java
@@ -9,6 +9,8 @@ import android.text.style.ForegroundColorSpan;
 import android.text.style.StyleSpan;
 import android.text.style.UnderlineSpan;
 
+import de.kuschku.quasseldroid_ng.ui.theme.ThemeUtil;
+
 public class MessageUtil {
     // Transparent in ARGB
     private static final int COLOR_TRANSPARENT = 0x00000000;
@@ -128,12 +130,12 @@ public class MessageUtil {
                     newString.setSpan(new StyleSpan(style), start, end, Spannable.SPAN_INCLUSIVE_EXCLUSIVE);
                 }
 
-                if (fg != -1 && themeUtil.colors.mircColors[fg] != COLOR_TRANSPARENT) {
-                    newString.setSpan(new ForegroundColorSpan(themeUtil.colors.mircColors[fg]), start, end,
+                if (fg != -1 && themeUtil.res.mircColors[fg] != COLOR_TRANSPARENT) {
+                    newString.setSpan(new ForegroundColorSpan(themeUtil.res.mircColors[fg]), start, end,
                             Spannable.SPAN_INCLUSIVE_EXCLUSIVE);
                 }
-                if (bg != -1 && themeUtil.colors.mircColors[fg] != COLOR_TRANSPARENT) {
-                    newString.setSpan(new BackgroundColorSpan(themeUtil.colors.mircColors[fg]), start, end,
+                if (bg != -1 && themeUtil.res.mircColors[fg] != COLOR_TRANSPARENT) {
+                    newString.setSpan(new BackgroundColorSpan(themeUtil.res.mircColors[fg]), start, end,
                             Spannable.SPAN_INCLUSIVE_EXCLUSIVE);
                 }
             }
diff --git a/app/src/main/res/layout/activity_chat.xml b/app/src/main/res/layout/activity_chat.xml
index a0a00ed3b..3553dfe0b 100644
--- a/app/src/main/res/layout/activity_chat.xml
+++ b/app/src/main/res/layout/activity_chat.xml
@@ -1,26 +1,25 @@
 <?xml version="1.0" encoding="utf-8"?>
-<com.sothree.slidinguppanel.SlidingUpPanelLayout
-    xmlns:android="http://schemas.android.com/apk/res/android"
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:app="http://schemas.android.com/apk/res-auto"
-    android:id="@+id/sliding_layout"
     android:layout_width="match_parent"
     android:layout_height="match_parent"
-    android:gravity="bottom"
-    android:orientation="vertical"
-    app:umanoPanelHeight="?attr/actionBarSize"
-    app:umanoShadowHeight="4dp">
+    android:orientation="vertical">
 
-    <LinearLayout
+    <include layout="@layout/toolbar" />
+
+    <com.sothree.slidinguppanel.SlidingUpPanelLayout
+        android:id="@+id/sliding_layout"
         android:layout_width="match_parent"
         android:layout_height="match_parent"
-        android:orientation="vertical">
-
-        <include layout="@layout/toolbar" />
+        android:gravity="bottom"
+        android:orientation="vertical"
+        app:umanoPanelHeight="?attr/actionBarSize"
+        app:umanoShadowHeight="4dp">
 
         <include layout="@layout/content_main" />
 
-    </LinearLayout>
+        <include layout="@layout/slider_main" />
 
-    <include layout="@layout/slider_main" />
+    </com.sothree.slidinguppanel.SlidingUpPanelLayout>
 
-</com.sothree.slidinguppanel.SlidingUpPanelLayout>
+</LinearLayout>
diff --git a/app/src/main/res/layout/slider_main.xml b/app/src/main/res/layout/slider_main.xml
index 4c7f5c4f7..ffc9fa6c1 100644
--- a/app/src/main/res/layout/slider_main.xml
+++ b/app/src/main/res/layout/slider_main.xml
@@ -6,29 +6,33 @@
 
     <LinearLayout
         android:layout_width="match_parent"
-        android:layout_height="?attr/actionBarSize"
+        android:layout_height="wrap_content"
+        android:animateLayoutChanges="true"
         android:background="?attr/colorBackgroundCard"
         android:orientation="horizontal">
 
         <android.support.v7.widget.AppCompatEditText
             android:id="@+id/chatline"
             android:layout_width="0dip"
-            android:layout_height="match_parent"
+            android:layout_height="?attr/actionBarSize"
             android:layout_weight="1"
             android:background="@android:color/transparent"
             android:hint="@string/message_placeholder"
             android:imeOptions="actionSend"
-            android:inputType="textShortMessage|textCapSentences|textAutoCorrect"
+            android:inputType="textCapSentences|textShortMessage|textAutoCorrect"
             android:paddingLeft="20dp"
             android:paddingRight="20dp"
-            android:textSize="16sp" />
+            android:paddingTop="19dp"
+            android:textSize="16sp"
+            android:gravity="top"
+            android:paddingBottom="19dp" />
 
         <android.support.v7.widget.AppCompatImageButton
             android:id="@+id/send"
             style="?attr/buttonStyleSmall"
             android:layout_width="56dp"
-            android:layout_height="match_parent"
-            android:layout_gravity="center_vertical"
+            android:layout_height="?attr/actionBarSize"
+            android:layout_gravity="top"
             android:background="?attr/selectableItemBackgroundBorderless"
             android:padding="12dp"
             android:src="@drawable/ic_send"
@@ -40,5 +44,5 @@
         android:layout_width="match_parent"
         android:layout_height="0dip"
         android:layout_weight="1"
-        android:background="?attr/colorBackgroundSecondary" />
+        android:background="?attr/colorBackgroundCard" />
 </LinearLayout>
diff --git a/app/src/main/res/values/attrs.xml b/app/src/main/res/values/attrs.xml
index 6e98e96b5..e5604dde7 100644
--- a/app/src/main/res/values/attrs.xml
+++ b/app/src/main/res/values/attrs.xml
@@ -1,5 +1,7 @@
 <?xml version="1.0" encoding="utf-8"?>
 <resources>
+    <attr name="colorAccentFocus" />
+
     <!-- sender colors -->
 
     <attr name="senderColor0" format="color" />
@@ -55,4 +57,5 @@
     <attr name="colorTintActivity" format="color" />
     <attr name="colorTintMessage" format="color" />
     <attr name="colorTintHighlight" format="color" />
+    <attr name="chatlineExpandedSize" />
 </resources>
diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml
index d52c48ef3..5719794dc 100644
--- a/app/src/main/res/values/colors.xml
+++ b/app/src/main/res/values/colors.xml
@@ -7,5 +7,6 @@
     -->
     <color name="colorPrimary">#0271B3</color>
     <color name="colorPrimaryDark">#02588c</color>
-    <color name="colorAccent">#ffeb3b</color>
+    <color name="colorAccent">#afb42b</color>
+    <color name="colorAccentFocus">#40afb42b</color>
 </resources>
diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml
index ef4364400..ad7c39210 100644
--- a/app/src/main/res/values/styles.xml
+++ b/app/src/main/res/values/styles.xml
@@ -6,6 +6,10 @@
         <item name="colorPrimary">@color/colorPrimary</item>
         <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
         <item name="colorAccent">@color/colorAccent</item>
+        <item name="colorAccentFocus">@color/colorAccentFocus</item>
+
+        <item name="colorControlHighlight">@color/colorAccentFocus</item>
+        <item name="windowActionModeOverlay">true</item>
     </style>
 
     <style name="AppTheme.Light" parent="MaterialDrawerTheme.Light.DarkToolbar.TranslucentStatus">
@@ -13,6 +17,10 @@
         <item name="colorPrimary">@color/colorPrimary</item>
         <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
         <item name="colorAccent">@color/colorAccent</item>
+        <item name="colorAccentFocus">@color/colorAccentFocus</item>
+
+        <item name="colorControlHighlight">@color/colorAccentFocus</item>
+        <item name="windowActionModeOverlay">true</item>
     </style>
 
     <style name="AppTheme.AppBarOverlay" parent="ThemeOverlay.AppCompat.Dark.ActionBar" />
-- 
GitLab