add ability to add arbitrary emojis

Daniel Gultsch created

Change summary

src/main/AndroidManifest.xml                                     |  1 
src/main/java/eu/siacs/conversations/ui/AddReactionActivity.java | 63 ++
src/main/java/eu/siacs/conversations/ui/XmppActivity.java        |  8 
src/main/res/layout/activity_add_reaction.xml                    | 25 
src/main/res/layout/dialog_add_reaction.xml                      | 31 
src/main/res/values/strings.xml                                  |  2 
6 files changed, 121 insertions(+), 9 deletions(-)

Detailed changes

src/main/AndroidManifest.xml πŸ”—

@@ -354,6 +354,7 @@
         <activity
             android:name=".ui.MediaBrowserActivity"
             android:label="@string/media_browser" />
+        <activity android:name=".ui.AddReactionActivity" />
 
         <provider
             android:name="androidx.core.content.FileProvider"

src/main/java/eu/siacs/conversations/ui/AddReactionActivity.java πŸ”—

@@ -0,0 +1,63 @@
+package eu.siacs.conversations.ui;
+
+import android.os.Bundle;
+import android.widget.Toast;
+
+import androidx.databinding.DataBindingUtil;
+
+import com.google.common.base.Strings;
+import com.google.common.collect.ImmutableSet;
+
+import eu.siacs.conversations.R;
+import eu.siacs.conversations.databinding.ActivityAddReactionBinding;
+
+public class AddReactionActivity extends XmppActivity {
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+
+        final ActivityAddReactionBinding binding =
+                DataBindingUtil.setContentView(this, R.layout.activity_add_reaction);
+        Activities.setStatusAndNavigationBarColors(this, binding.getRoot());
+
+        setSupportActionBar(binding.toolbar);
+        binding.toolbar.setNavigationIcon(R.drawable.ic_clear_24dp);
+        binding.toolbar.setNavigationOnClickListener(v -> finish());
+        setTitle(R.string.add_reaction_title);
+        binding.emojiPicker.setOnEmojiPickedListener(
+                emojiViewItem -> addReaction(emojiViewItem.getEmoji()));
+    }
+
+    private void addReaction(final String emoji) {
+        final var intent = getIntent();
+        final var conversation = intent == null ? null : intent.getStringExtra("conversation");
+        final var message = intent == null ? null : intent.getStringExtra("message");
+        if (Strings.isNullOrEmpty(conversation) || Strings.isNullOrEmpty(message)) {
+            Toast.makeText(this, R.string.could_not_add_reaction, Toast.LENGTH_LONG).show();
+            return;
+        }
+        final var c = xmppConnectionService.findConversationByUuid(conversation);
+        final var m = c == null ? null : c.findMessageWithUuid(message);
+        if (m == null) {
+            Toast.makeText(this, R.string.could_not_add_reaction, Toast.LENGTH_LONG).show();
+            return;
+        }
+        final var aggregated = m.getAggregatedReactions();
+        if (aggregated.ourReactions.contains(emoji)) {
+            xmppConnectionService.sendReactions(m, aggregated.ourReactions);
+        } else {
+            final ImmutableSet.Builder<String> reactionBuilder = new ImmutableSet.Builder<>();
+            reactionBuilder.addAll(aggregated.ourReactions);
+            reactionBuilder.add(emoji);
+            xmppConnectionService.sendReactions(m, reactionBuilder.build());
+        }
+        finish();
+    }
+
+    @Override
+    protected void refreshUiReal() {}
+
+    @Override
+    protected void onBackendConnected() {}
+}

src/main/java/eu/siacs/conversations/ui/XmppActivity.java πŸ”—

@@ -326,6 +326,14 @@ public abstract class XmppActivity extends ActionBarActivity {
                         dialog.dismiss();
                     });
         }
+        viewBinding.more.setOnClickListener(
+                v -> {
+                    dialog.dismiss();
+                    final var intent = new Intent(this, AddReactionActivity.class);
+                    intent.putExtra("conversation", message.getConversation().getUuid());
+                    intent.putExtra("message", message.getUuid());
+                    startActivity(intent);
+                });
         dialog.show();
     }
 

src/main/res/layout/activity_add_reaction.xml πŸ”—

@@ -0,0 +1,25 @@
+<layout xmlns:android="http://schemas.android.com/apk/res/android">
+
+    <LinearLayout
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        android:orientation="vertical">
+
+        <com.google.android.material.appbar.AppBarLayout
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content">
+
+            <com.google.android.material.appbar.MaterialToolbar
+                android:id="@+id/toolbar"
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:minHeight="?attr/actionBarSize" />
+
+        </com.google.android.material.appbar.AppBarLayout>
+
+        <androidx.emoji2.emojipicker.EmojiPickerView
+            android:id="@+id/emoji_picker"
+            android:layout_width="match_parent"
+            android:layout_height="match_parent"/>
+    </LinearLayout>
+</layout>

src/main/res/layout/dialog_add_reaction.xml πŸ”—

@@ -1,18 +1,31 @@
 <?xml version="1.0" encoding="utf-8"?>
-<layout xmlns:android="http://schemas.android.com/apk/res/android">
+<layout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto">
 
     <RelativeLayout
         android:layout_width="wrap_content"
-        android:layout_height="match_parent">
+        android:layout_height="wrap_content"
+        android:padding="?dialogPreferredPadding">
 
-    <com.google.android.material.button.MaterialButtonGroup
-        android:layout_centerInParent="true"
+        <com.google.android.material.button.MaterialButtonGroup
+            android:id="@+id/emojis"
+
+            style="@style/Widget.Material3.MaterialButtonGroup.Connected"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_centerHorizontal="true" />
+
+        <Button
+            android:id="@+id/more"
+            style="?attr/materialIconButtonFilledStyle"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_below="@+id/emojis"
+            android:layout_centerHorizontal="true"
+            android:layout_marginTop="8dp"
+            android:contentDescription="@string/more_reactions"
+            app:icon="@drawable/ic_more_horiz_24dp" />
 
-        android:id="@+id/emojis"
-        style="@style/Widget.Material3.MaterialButtonGroup.Connected"
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:padding="?dialogPreferredPadding" />
     </RelativeLayout>
 
 </layout>

src/main/res/values/strings.xml πŸ”—

@@ -1084,4 +1084,6 @@
     <string name="server_info_login_mechanism">Login mechanism</string>
     <string name="could_not_add_reaction">Could not add reaction</string>
     <string name="add_reaction">Add reaction…</string>
+    <string name="add_reaction_title">Add reaction</string>
+    <string name="more_reactions">More reactions</string>
 </resources>