diff --git a/app/src/main/java/de/kuschku/libquassel/Client.java b/app/src/main/java/de/kuschku/libquassel/Client.java index d556e4a4595edc063e7a0f2b07e32315f26b5e6d..199c761f010686cd60d953fc316578db5018ccef 100644 --- a/app/src/main/java/de/kuschku/libquassel/Client.java +++ b/app/src/main/java/de/kuschku/libquassel/Client.java @@ -23,7 +23,7 @@ import de.kuschku.libquassel.syncables.types.BufferSyncer; import de.kuschku.libquassel.syncables.types.BufferViewManager; import de.kuschku.libquassel.syncables.types.Network; import de.kuschku.libquassel.syncables.types.SyncableObject; -import de.kuschku.util.Stream; +import de.kuschku.util.backports.Stream; public class Client { diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/MainActivity.java b/app/src/main/java/de/kuschku/quasseldroid_ng/MainActivity.java index 4b4960b60702469b83f6645f3791734b9e47b4d0..b0d5681f56d9d013fc322a9a90741d2c3578ef3d 100644 --- a/app/src/main/java/de/kuschku/quasseldroid_ng/MainActivity.java +++ b/app/src/main/java/de/kuschku/quasseldroid_ng/MainActivity.java @@ -7,12 +7,18 @@ import android.content.res.Configuration; import android.os.Bundle; import android.os.IBinder; import android.support.design.widget.Snackbar; +import android.support.v4.text.TextUtilsCompat; import android.support.v7.app.AlertDialog; import android.support.v7.app.AppCompatActivity; import android.support.v7.widget.AppCompatImageButton; import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.RecyclerView; import android.support.v7.widget.Toolbar; +import android.text.SpannableString; +import android.text.SpannableStringBuilder; +import android.text.Spanned; +import android.text.TextUtils; +import android.text.style.ForegroundColorSpan; import android.util.Log; import android.view.LayoutInflater; import android.view.View; @@ -33,6 +39,9 @@ import com.mikepenz.materialdrawer.model.interfaces.IDrawerItem; import com.mikepenz.materialdrawer.model.interfaces.IProfile; import com.mikepenz.materialdrawer.util.KeyboardUtil; +import org.joda.time.format.DateTimeFormat; + +import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Collections; import java.util.HashSet; @@ -52,8 +61,9 @@ import de.kuschku.libquassel.primitives.types.Message; import de.kuschku.libquassel.syncables.types.BufferViewConfig; import de.kuschku.libquassel.syncables.types.Network; import de.kuschku.quasseldroid_ng.utils.ServerAddress; +import de.kuschku.util.IrcUserUtils; import de.kuschku.util.ObservableList; -import de.kuschku.util.Stream; +import de.kuschku.util.backports.Stream; public class MainActivity extends AppCompatActivity { @@ -319,7 +329,40 @@ public class MainActivity extends AppCompatActivity { @Override public void onBindViewHolder(MessageViewHolder holder, int position) { - holder.text1.setText(messageList.list.get(position).toString()); + int[] colors = { + R.color.md_pink_500, + R.color.md_purple_500, + R.color.md_red_500, + R.color.md_green_500, + R.color.md_cyan_500, + R.color.md_deep_purple_500, + R.color.md_amber_500, + R.color.md_blue_500, + R.color.md_pink_700, + R.color.md_purple_700, + R.color.md_red_700, + R.color.md_green_700, + R.color.md_cyan_700, + R.color.md_deep_purple_700, + R.color.md_amber_700, + R.color.md_blue_700 + }; + + Message msg = messageList.list.get(position); + SpannableString timeSpan = new SpannableString(DateTimeFormat.forPattern("[hh:mm]").print(msg.time)); + timeSpan.setSpan(new ForegroundColorSpan(getResources().getColor(R.color.md_light_secondary)), 0, timeSpan.length(), Spanned.SPAN_INCLUSIVE_EXCLUSIVE); + + String nick = IrcUserUtils.getNick(msg.sender); + SpannableString nickSpan = new SpannableString(nick); + nickSpan.setSpan(new ForegroundColorSpan(getResources().getColor(colors[IrcUserUtils.getSenderColor(nick)])), 0, nickSpan.length(), Spanned.SPAN_INCLUSIVE_EXCLUSIVE); + + holder.text1.setText(TextUtils.concat( + timeSpan, + " ", + nickSpan, + " ", + msg.content + )); } @Override diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/NetworkDrawerItem.java b/app/src/main/java/de/kuschku/quasseldroid_ng/NetworkDrawerItem.java index eb97d3f94a88cad026fc960204efd1900b0e18c4..5def317fbf4fc148caa3e71776836b4a339430d8 100644 --- a/app/src/main/java/de/kuschku/quasseldroid_ng/NetworkDrawerItem.java +++ b/app/src/main/java/de/kuschku/quasseldroid_ng/NetworkDrawerItem.java @@ -9,7 +9,7 @@ import java.util.Set; import de.kuschku.libquassel.localtypes.Buffer; import de.kuschku.libquassel.syncables.types.Network; -import de.kuschku.util.Stream; +import de.kuschku.util.backports.Stream; public class NetworkDrawerItem extends PrimaryDrawerItem { final Network network; diff --git a/app/src/main/java/de/kuschku/util/IrcUserUtils.java b/app/src/main/java/de/kuschku/util/IrcUserUtils.java new file mode 100644 index 0000000000000000000000000000000000000000..03953b10a789353ed17ddff6f2b4f78432e17137 --- /dev/null +++ b/app/src/main/java/de/kuschku/util/IrcUserUtils.java @@ -0,0 +1,79 @@ +package de.kuschku.util; + +import java.nio.charset.Charset; +import java.util.Locale; + +public class IrcUserUtils { + private IrcUserUtils() { + + } + + public static int getSenderColor(String nick) { + nick = trimEnd(nick, '_').toLowerCase(Locale.US); + byte[] data = nick.getBytes(Charset.forName("ISO-8859-1")); + return (0xf & CRCUtils.qChecksum(data)); + } + + public static String trimEnd(String str, char character) { + char[] val = str.toCharArray(); + int len = val.length; + while ((0 < len) && (val[len - 1] == character)) { + len--; + } + return ((len < val.length)) ? str.substring(0, len) : str; + } + + public static class CRCUtils { + private CRCUtils() { + + } + + public static int qChecksum(byte[] data) { + int crc = 0xffff; + int crcHighBitMask = 0x8000; + + for (byte b : data) { + int c = reflect(b, 8); + for (int j = 0x80; j > 0; j >>= 1) { + int highBit = crc & crcHighBitMask; + crc <<= 1; + if ((c & j) > 0) { + highBit ^= crcHighBitMask; + } + if (highBit > 0) { + crc ^= 0x1021; + } + } + } + + crc = reflect(crc, 16); + crc ^= 0xffff; + crc &= 0xffff; + + return crc; + } + + private static int reflect(int crc, int n) { + int j = 1, crcout = 0; + for (int i = (1 << (n - 1)); i > 0; i >>= 1) { + if ((crc & i) > 0) { + crcout |= j; + } + j <<= 1; + } + return crcout; + } + } + + public static String getNick(String hostmask) { + return hostmask.split("!")[0]; + } + + public static String getUser(String hostmask) { + return hostmask.split("!")[1].split("@")[0]; + } + + public static String getHost(String hostmask) { + return hostmask.split("@")[1]; + } +} \ No newline at end of file diff --git a/app/src/main/java/de/kuschku/util/ReflectionUtils.java b/app/src/main/java/de/kuschku/util/ReflectionUtils.java index 979d097db20ef2b1e2bb8f1c99cb593c1a46dafc..25f4b826fd2eadb962a37b23d621e89f95ee6049 100644 --- a/app/src/main/java/de/kuschku/util/ReflectionUtils.java +++ b/app/src/main/java/de/kuschku/util/ReflectionUtils.java @@ -23,16 +23,14 @@ public class ReflectionUtils { classes[i] = argv[i].getClass(); } Method m = getMethodFromSignature(name, o.getClass(), classes); - try { - - if (m != null) { - m.invoke(o, argv); - } + if (m == null) + throw new SyncInvocationException(String.format("Error invoking %s::%s with arguments %s", o.getClass().getSimpleName(), name, Arrays.toString(argv))); + try { + m.invoke(o, argv); } catch (Exception e) { throw new SyncInvocationException(e, String.format("Error invoking %s::%s with arguments %s", o.getClass().getSimpleName(), name, Arrays.toString(argv))); } - throw new SyncInvocationException(String.format("Error invoking %s::%s with arguments %s", o.getClass().getSimpleName(), name, Arrays.toString(argv))); } @NonNull diff --git a/app/src/main/java/de/kuschku/util/SortedListWrapper.java b/app/src/main/java/de/kuschku/util/SortedListWrapper.java index 3af1f8bfd5f770c39af7d4fbdda58c28c4f1f1eb..a50824ce1e6b0847d422a6119881b361f9f8f8ac 100644 --- a/app/src/main/java/de/kuschku/util/SortedListWrapper.java +++ b/app/src/main/java/de/kuschku/util/SortedListWrapper.java @@ -8,6 +8,8 @@ import java.util.Iterator; import java.util.List; import java.util.ListIterator; +import de.kuschku.util.backports.Stream; + public class SortedListWrapper<T> implements List<T> { final SortedList<T> list; diff --git a/app/src/main/java/de/kuschku/util/Absent.java b/app/src/main/java/de/kuschku/util/backports/Absent.java similarity index 96% rename from app/src/main/java/de/kuschku/util/Absent.java rename to app/src/main/java/de/kuschku/util/backports/Absent.java index 515ed35ff4dd3edecbc65cb723e1d86026a60793..ac2e15cf89d750670120a1f0ff48348017a36c5d 100644 --- a/app/src/main/java/de/kuschku/util/Absent.java +++ b/app/src/main/java/de/kuschku/util/backports/Absent.java @@ -1,4 +1,4 @@ -package de.kuschku.util; +package de.kuschku.util.backports; import com.google.common.base.Function; import com.google.common.base.Predicate; diff --git a/app/src/main/java/de/kuschku/util/BinaryFunction.java b/app/src/main/java/de/kuschku/util/backports/BinaryFunction.java similarity index 68% rename from app/src/main/java/de/kuschku/util/BinaryFunction.java rename to app/src/main/java/de/kuschku/util/backports/BinaryFunction.java index 5ab2ebf2794f93d3ab2a8514f1ef93311937e09e..3616eaa8ebfd928a3bc7f5c85ddb89299fee2824 100644 --- a/app/src/main/java/de/kuschku/util/BinaryFunction.java +++ b/app/src/main/java/de/kuschku/util/backports/BinaryFunction.java @@ -1,4 +1,4 @@ -package de.kuschku.util; +package de.kuschku.util.backports; public interface BinaryFunction<A, B, C> { C apply(A arg0, B arg1); diff --git a/app/src/main/java/de/kuschku/util/Consumer.java b/app/src/main/java/de/kuschku/util/backports/Consumer.java similarity index 62% rename from app/src/main/java/de/kuschku/util/Consumer.java rename to app/src/main/java/de/kuschku/util/backports/Consumer.java index b609ea1230ebd9cb4e2019b1b30cf4d39c2f69f7..65ab930cb2124033dde07ccc33d1be58d4d9afc5 100644 --- a/app/src/main/java/de/kuschku/util/Consumer.java +++ b/app/src/main/java/de/kuschku/util/backports/Consumer.java @@ -1,4 +1,4 @@ -package de.kuschku.util; +package de.kuschku.util.backports; public interface Consumer<T> { void apply(T elem); diff --git a/app/src/main/java/de/kuschku/util/ICollector.java b/app/src/main/java/de/kuschku/util/backports/ICollector.java similarity index 67% rename from app/src/main/java/de/kuschku/util/ICollector.java rename to app/src/main/java/de/kuschku/util/backports/ICollector.java index 51517375638019db32edbeae116fb21bf6c95af9..15c02a76c93fd4c293335425ce53ffc161a515a9 100644 --- a/app/src/main/java/de/kuschku/util/ICollector.java +++ b/app/src/main/java/de/kuschku/util/backports/ICollector.java @@ -1,4 +1,4 @@ -package de.kuschku.util; +package de.kuschku.util.backports; public interface ICollector<T, R> { R collect(Stream<T> stream); diff --git a/app/src/main/java/de/kuschku/util/Optional.java b/app/src/main/java/de/kuschku/util/backports/Optional.java similarity index 94% rename from app/src/main/java/de/kuschku/util/Optional.java rename to app/src/main/java/de/kuschku/util/backports/Optional.java index 7f5d7f4393a4c4021adea8e724a2d3bd64c0cd91..266bc93286d2aa217421f0a5a6ef95c81e979477 100644 --- a/app/src/main/java/de/kuschku/util/Optional.java +++ b/app/src/main/java/de/kuschku/util/backports/Optional.java @@ -1,4 +1,4 @@ -package de.kuschku.util; +package de.kuschku.util.backports; import com.google.common.base.Function; import com.google.common.base.Predicate; diff --git a/app/src/main/java/de/kuschku/util/Optionals.java b/app/src/main/java/de/kuschku/util/backports/Optionals.java similarity index 92% rename from app/src/main/java/de/kuschku/util/Optionals.java rename to app/src/main/java/de/kuschku/util/backports/Optionals.java index 68d88661292a7cd6983e117d3e27b0f39376cd36..7a898eeb969e3124ebe8306eda1d5fb724aa6668 100644 --- a/app/src/main/java/de/kuschku/util/Optionals.java +++ b/app/src/main/java/de/kuschku/util/backports/Optionals.java @@ -1,4 +1,4 @@ -package de.kuschku.util; +package de.kuschku.util.backports; public class Optionals { private Optionals() { diff --git a/app/src/main/java/de/kuschku/util/Present.java b/app/src/main/java/de/kuschku/util/backports/Present.java similarity index 97% rename from app/src/main/java/de/kuschku/util/Present.java rename to app/src/main/java/de/kuschku/util/backports/Present.java index 87e9f3c4c36a4416380d5f601aa93638c88d2b34..19a5168f6f32fe7948aad589ade3cf05d6cf89e5 100644 --- a/app/src/main/java/de/kuschku/util/Present.java +++ b/app/src/main/java/de/kuschku/util/backports/Present.java @@ -1,4 +1,4 @@ -package de.kuschku.util; +package de.kuschku.util.backports; import com.google.common.base.Function; import com.google.common.base.Predicate; diff --git a/app/src/main/java/de/kuschku/util/Stream.java b/app/src/main/java/de/kuschku/util/backports/Stream.java similarity index 95% rename from app/src/main/java/de/kuschku/util/Stream.java rename to app/src/main/java/de/kuschku/util/backports/Stream.java index c86550220bead71efefc8eda4873756d2e14be8f..ddf14856bf70b7040bc43823b5a7e68beb14466f 100644 --- a/app/src/main/java/de/kuschku/util/Stream.java +++ b/app/src/main/java/de/kuschku/util/backports/Stream.java @@ -1,4 +1,4 @@ -package de.kuschku.util; +package de.kuschku.util.backports; import com.google.common.base.Function; import com.google.common.base.Predicate; @@ -10,7 +10,7 @@ import java.util.Collection; import java.util.Iterator; import java.util.List; -import de.kuschku.util.collectors.Collectors; +import de.kuschku.util.backports.collectors.Collectors; public class Stream<T> { List<T> list; diff --git a/app/src/main/java/de/kuschku/util/collectors/Collectors.java b/app/src/main/java/de/kuschku/util/backports/collectors/Collectors.java similarity index 80% rename from app/src/main/java/de/kuschku/util/collectors/Collectors.java rename to app/src/main/java/de/kuschku/util/backports/collectors/Collectors.java index 957921a7b07338f77f1e7d26367897314ebf30f4..c5ef5b3745d8054a995e5f87a69f63d6aead8751 100644 --- a/app/src/main/java/de/kuschku/util/collectors/Collectors.java +++ b/app/src/main/java/de/kuschku/util/backports/collectors/Collectors.java @@ -1,9 +1,9 @@ -package de.kuschku.util.collectors; +package de.kuschku.util.backports.collectors; import java.util.List; import java.util.Map; -import de.kuschku.util.Stream; +import de.kuschku.util.backports.Stream; public class Collectors { private Collectors() { diff --git a/app/src/main/java/de/kuschku/util/collectors/ListCollector.java b/app/src/main/java/de/kuschku/util/backports/collectors/ListCollector.java similarity index 59% rename from app/src/main/java/de/kuschku/util/collectors/ListCollector.java rename to app/src/main/java/de/kuschku/util/backports/collectors/ListCollector.java index a2f7749a7bfcc61e198235447cfdd1ffcee991ce..95b94d522f4fef5ea247e7c87abbe88b4259148c 100644 --- a/app/src/main/java/de/kuschku/util/collectors/ListCollector.java +++ b/app/src/main/java/de/kuschku/util/backports/collectors/ListCollector.java @@ -1,9 +1,9 @@ -package de.kuschku.util.collectors; +package de.kuschku.util.backports.collectors; import java.util.List; -import de.kuschku.util.ICollector; -import de.kuschku.util.Stream; +import de.kuschku.util.backports.ICollector; +import de.kuschku.util.backports.Stream; public class ListCollector<T> implements ICollector<T, List<T>> { @Override diff --git a/app/src/main/java/de/kuschku/util/collectors/MapCollector.java b/app/src/main/java/de/kuschku/util/backports/collectors/MapCollector.java similarity index 81% rename from app/src/main/java/de/kuschku/util/collectors/MapCollector.java rename to app/src/main/java/de/kuschku/util/backports/collectors/MapCollector.java index a23a218930130e6aca597ef9d602c31f1a59c92e..cc52c36dc742beb142c5f4a83971f6045c570ac1 100644 --- a/app/src/main/java/de/kuschku/util/collectors/MapCollector.java +++ b/app/src/main/java/de/kuschku/util/backports/collectors/MapCollector.java @@ -1,11 +1,11 @@ -package de.kuschku.util.collectors; +package de.kuschku.util.backports.collectors; import java.util.HashMap; import java.util.List; import java.util.Map; -import de.kuschku.util.ICollector; -import de.kuschku.util.Stream; +import de.kuschku.util.backports.ICollector; +import de.kuschku.util.backports.Stream; public class MapCollector<T> implements ICollector<T, Map<T, T>> { @Override