Show identicon for thread when present

Stephen Paul Weber created

Change summary

build.gradle                                                        |  1 
src/main/java/eu/siacs/conversations/ui/adapter/MessageAdapter.java | 17 
src/main/java/eu/siacs/conversations/utils/UIHelper.java            | 12 
src/main/res/layout/account_row.xml                                 |  1 
src/main/res/layout/message_received.xml                            |  9 
5 files changed, 40 insertions(+)

Detailed changes

build.gradle 🔗

@@ -98,6 +98,7 @@ dependencies {
     implementation 'com.github.ipld:java-cid:v1.3.1'
     implementation 'com.splitwise:tokenautocomplete:3.0.2'
     implementation 'me.saket:better-link-movement-method:2.2.0'
+    implementation 'com.github.singpolyma:android-identicons:master-SNAPSHOT'
     implementation 'org.snikket:webrtc-android:107.0.0'
     // INSERT
 }

src/main/java/eu/siacs/conversations/ui/adapter/MessageAdapter.java 🔗

@@ -42,6 +42,8 @@ import com.cheogram.android.BobTransfer;
 
 import com.google.common.base.Strings;
 
+import com.lelloman.identicon.view.GithubIdenticonView;
+
 import java.io.IOException;
 import java.net.URI;
 import java.net.URISyntaxException;
@@ -733,6 +735,7 @@ public class MessageAdapter extends ArrayAdapter<Message> {
                     viewHolder.encryption = view.findViewById(R.id.message_encryption);
                     viewHolder.audioPlayer = view.findViewById(R.id.audio_player);
                     viewHolder.commands_list = view.findViewById(R.id.commands_list);
+                    viewHolder.thread_identicon = view.findViewById(R.id.thread_identicon);
                     break;
                 case STATUS:
                     view = activity.getLayoutInflater().inflate(R.layout.message_status, parent, false);
@@ -751,6 +754,19 @@ public class MessageAdapter extends ArrayAdapter<Message> {
             }
         }
 
+        if (viewHolder.thread_identicon != null) {
+            viewHolder.thread_identicon.setVisibility(View.GONE);
+            final Element thread = message.getThread();
+            if (thread != null) {
+                final String threadId = thread.getContent();
+                if (threadId != null) {
+                    viewHolder.thread_identicon.setVisibility(View.VISIBLE);
+                    viewHolder.thread_identicon.setColor(UIHelper.getColorForName(threadId));
+                    viewHolder.thread_identicon.setHash(UIHelper.identiconHash(threadId));
+                }
+            }
+        }
+
         boolean darkBackground = type == RECEIVED && (!isInValidSession || mUseGreenBackground) || activity.isDarkTheme();
 
         if (type == DATE_SEPARATOR) {
@@ -1028,6 +1044,7 @@ public class MessageAdapter extends ArrayAdapter<Message> {
         protected TextView status_message;
         protected TextView encryption;
         protected ListView commands_list;
+        protected GithubIdenticonView thread_identicon;
     }
 
     class ThumbnailTask extends AsyncTask<DownloadableFile, Void, Drawable[]> {

src/main/java/eu/siacs/conversations/utils/UIHelper.java 🔗

@@ -11,8 +11,10 @@ import androidx.annotation.ColorInt;
 import androidx.core.content.res.ResourcesCompat;
 
 import com.google.common.base.Strings;
+import com.google.common.primitives.Ints;
 
 import java.math.BigInteger;
+import java.nio.charset.StandardCharsets;
 import java.security.MessageDigest;
 import java.util.Arrays;
 import java.util.Calendar;
@@ -229,6 +231,16 @@ public class UIHelper {
         }
     }
 
+    public static int identiconHash(String name) {
+        try {
+            MessageDigest sha1 = MessageDigest.getInstance("SHA-1");
+            byte[] digest = sha1.digest(name.getBytes(StandardCharsets.UTF_8));
+            return Ints.fromByteArray(digest);
+        } catch (Exception e) {
+            return 0;
+        }
+    }
+
     public static int getColorForName(String name) {
         return getColorForName(name, false);
     }

src/main/res/layout/account_row.xml 🔗

@@ -22,6 +22,7 @@
             android:layout_width="fill_parent"
             android:layout_height="wrap_content"
             android:layout_centerVertical="true"
+            android:layout_toEndOf="@+id/account_image"
             android:layout_toRightOf="@+id/account_image"
             android:orientation="vertical"
             android:paddingLeft="@dimen/avatar_item_distance"

src/main/res/layout/message_received.xml 🔗

@@ -93,6 +93,15 @@
                     android:gravity="center_vertical"
                     android:src="@drawable/ic_mode_edit_white_18dp" />
 
+                <com.lelloman.identicon.view.GithubIdenticonView
+                    android:id="@+id/thread_identicon"
+                    android:visibility="gone"
+                    android:layout_width="9dp"
+                    android:layout_height="9dp"
+                    android:layout_gravity="center_vertical"
+                    android:layout_marginRight="4sp"
+                    android:layout_marginBottom="-1dp" />
+
                 <TextView
                     android:id="@+id/message_time"
                     android:layout_width="wrap_content"