diff --git a/CHANGES.md b/CHANGES.md
index 1005040328..1381a1e7ca 100644
--- a/CHANGES.md
+++ b/CHANGES.md
@@ -4,6 +4,7 @@ Changes in Element 1.0.12 (2020-XX-XX)
Features ✨:
- Add room aliases management, and room directory visibility management in a dedicated screen (#1579, #2428)
- Room setting: update join rules and guest access (#2442)
+ - Emoji Keyboard (#2520)
Improvements 🙌:
- Add Setting Item to Change PIN (#2462)
diff --git a/vector/build.gradle b/vector/build.gradle
index 62ff3951af..28d8fe5c1b 100644
--- a/vector/build.gradle
+++ b/vector/build.gradle
@@ -440,6 +440,10 @@ dependencies {
implementation 'com.google.zxing:core:3.3.3'
implementation 'me.dm7.barcodescanner:zxing:1.9.13'
+ // Emoji Keyboard
+ implementation 'com.vanniktech:emoji-material:0.7.0'
+ implementation 'com.vanniktech:emoji-google:0.7.0'
+
// TESTS
testImplementation 'junit:junit:4.13'
testImplementation "org.amshove.kluent:kluent-android:$kluent_version"
diff --git a/vector/src/main/assets/open_source_licenses.html b/vector/src/main/assets/open_source_licenses.html
index ac80b0d691..acf0bec14f 100755
--- a/vector/src/main/assets/open_source_licenses.html
+++ b/vector/src/main/assets/open_source_licenses.html
@@ -347,11 +347,6 @@ SOFTWARE.
Copyright 2017 Gabriel Ittner.
-
Apache License
diff --git a/vector/src/main/java/im/vector/app/VectorApplication.kt b/vector/src/main/java/im/vector/app/VectorApplication.kt
index 5be313d719..921e8c0780 100644
--- a/vector/src/main/java/im/vector/app/VectorApplication.kt
+++ b/vector/src/main/java/im/vector/app/VectorApplication.kt
@@ -36,6 +36,8 @@ import com.airbnb.epoxy.EpoxyAsyncUtil
import com.airbnb.epoxy.EpoxyController
import com.facebook.stetho.Stetho
import com.gabrielittner.threetenbp.LazyThreeTen
+import com.vanniktech.emoji.EmojiManager
+import com.vanniktech.emoji.google.GoogleEmojiProvider
import im.vector.app.core.di.ActiveSessionHolder
import im.vector.app.core.di.DaggerVectorComponent
import im.vector.app.core.di.HasVectorInjector
@@ -184,6 +186,8 @@ class VectorApplication :
addAction(Intent.ACTION_SCREEN_OFF)
addAction(Intent.ACTION_SCREEN_ON)
})
+
+ EmojiManager.install(GoogleEmojiProvider())
}
private fun enableStrictModeIfNeeded() {
diff --git a/vector/src/main/java/im/vector/app/features/home/room/detail/RoomDetailFragment.kt b/vector/src/main/java/im/vector/app/features/home/room/detail/RoomDetailFragment.kt
index 3f5e476a5e..bc0f5ce6dc 100644
--- a/vector/src/main/java/im/vector/app/features/home/room/detail/RoomDetailFragment.kt
+++ b/vector/src/main/java/im/vector/app/features/home/room/detail/RoomDetailFragment.kt
@@ -53,7 +53,6 @@ import androidx.lifecycle.Observer
import androidx.recyclerview.widget.ItemTouchHelper
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
-import butterknife.BindView
import com.airbnb.epoxy.EpoxyModel
import com.airbnb.epoxy.OnModelBuildFinishedListener
import com.airbnb.epoxy.addGlidePreloader
@@ -69,6 +68,7 @@ import com.airbnb.mvrx.withState
import com.google.android.material.snackbar.Snackbar
import com.google.android.material.textfield.TextInputEditText
import com.jakewharton.rxbinding3.widget.textChanges
+import com.vanniktech.emoji.EmojiPopup
import im.vector.app.R
import im.vector.app.core.dialogs.ConfirmationDialogBuilder
import im.vector.app.core.dialogs.GalleryOrCameraDialogHelper
@@ -289,8 +289,6 @@ class RoomDetailFragment @Inject constructor(
private lateinit var attachmentsHelper: AttachmentsHelper
private lateinit var keyboardStateUtils: KeyboardStateUtils
- @BindView(R.id.composerLayout)
- lateinit var composerLayout: TextComposerView
private lateinit var attachmentTypeSelector: AttachmentTypeSelectorView
private var lockSendButton = false
@@ -311,6 +309,7 @@ class RoomDetailFragment @Inject constructor(
setupActiveCallView()
setupJumpToBottomView()
setupConfBannerView()
+ setupEmojiPopup()
roomToolbarContentView.debouncedClicks {
navigator.openRoomProfile(requireActivity(), roomDetailArgs.roomId)
@@ -478,6 +477,20 @@ class RoomDetailFragment @Inject constructor(
}
}
+ private fun setupEmojiPopup() {
+ val emojiPopup = EmojiPopup
+ .Builder
+ .fromRootView(rootConstraintLayout)
+ .setKeyboardAnimationStyle(R.style.emoji_fade_animation_style)
+ .setOnEmojiPopupShownListener { composerLayout?.composerEmojiButton?.setImageResource(R.drawable.ic_keyboard) }
+ .setOnEmojiPopupDismissListener { composerLayout?.composerEmojiButton?.setImageResource(R.drawable.ic_insert_emoji) }
+ .build(composerLayout.composerEditText)
+
+ composerLayout.composerEmojiButton.debouncedClicks {
+ emojiPopup.toggle()
+ }
+ }
+
private fun joinJitsiRoom(jitsiWidget: Widget, enableVideo: Boolean) {
navigator.openRoomWidget(requireContext(), roomDetailArgs.roomId, jitsiWidget, mapOf(JitsiCallViewModel.ENABLE_VIDEO_OPTION to enableVideo))
}
@@ -1211,9 +1224,6 @@ class RoomDetailFragment @Inject constructor(
scrollOnHighlightedEventCallback.timeline = roomDetailViewModel.timeline
timelineEventController.update(state)
inviteView.visibility = View.GONE
- val uid = session.myUserId
- val meMember = state.myRoomMember()
- avatarRenderer.render(MatrixItem.UserItem(uid, meMember?.displayName, meMember?.avatarUrl), composerLayout.composerAvatarImageView)
if (state.tombstoneEvent == null) {
if (state.canSendMessage) {
composerLayout.visibility = View.VISIBLE
diff --git a/vector/src/main/java/im/vector/app/features/home/room/detail/composer/ComposerEditText.kt b/vector/src/main/java/im/vector/app/features/home/room/detail/composer/ComposerEditText.kt
index 353ab783db..2257e5ee81 100644
--- a/vector/src/main/java/im/vector/app/features/home/room/detail/composer/ComposerEditText.kt
+++ b/vector/src/main/java/im/vector/app/features/home/room/detail/composer/ComposerEditText.kt
@@ -24,16 +24,16 @@ import android.text.Editable
import android.util.AttributeSet
import android.view.inputmethod.EditorInfo
import android.view.inputmethod.InputConnection
-import androidx.appcompat.widget.AppCompatEditText
import androidx.core.view.inputmethod.EditorInfoCompat
import androidx.core.view.inputmethod.InputConnectionCompat
+import com.vanniktech.emoji.EmojiEditText
import im.vector.app.core.extensions.ooi
import im.vector.app.core.platform.SimpleTextWatcher
import im.vector.app.features.html.PillImageSpan
import timber.log.Timber
class ComposerEditText @JvmOverloads constructor(context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = android.R.attr.editTextStyle)
- : AppCompatEditText(context, attrs, defStyleAttr) {
+ : EmojiEditText(context, attrs, defStyleAttr) {
interface Callback {
fun onRichContentSelected(contentUri: Uri): Boolean
diff --git a/vector/src/main/java/im/vector/app/features/home/room/detail/composer/TextComposerView.kt b/vector/src/main/java/im/vector/app/features/home/room/detail/composer/TextComposerView.kt
index f4b14571c0..af0e1a91f0 100644
--- a/vector/src/main/java/im/vector/app/features/home/room/detail/composer/TextComposerView.kt
+++ b/vector/src/main/java/im/vector/app/features/home/room/detail/composer/TextComposerView.kt
@@ -72,8 +72,8 @@ class TextComposerView @JvmOverloads constructor(context: Context, attrs: Attrib
@BindView(R.id.composerEditText)
lateinit var composerEditText: ComposerEditText
- @BindView(R.id.composer_avatar_view)
- lateinit var composerAvatarImageView: ImageView
+ @BindView(R.id.composer_emoji)
+ lateinit var composerEmojiButton: ImageButton
@BindView(R.id.composer_shield)
lateinit var composerShieldImageView: ImageView
diff --git a/vector/src/main/res/drawable/bg_send.xml b/vector/src/main/res/drawable/bg_send.xml
new file mode 100644
index 0000000000..4b357d7ab1
--- /dev/null
+++ b/vector/src/main/res/drawable/bg_send.xml
@@ -0,0 +1,9 @@
+
+
+ -
+
+
+
+
+
+
\ No newline at end of file
diff --git a/vector/src/main/res/drawable/ic_attachment.xml b/vector/src/main/res/drawable/ic_attachment.xml
index 944998c1cd..ea01e94372 100644
--- a/vector/src/main/res/drawable/ic_attachment.xml
+++ b/vector/src/main/res/drawable/ic_attachment.xml
@@ -1,7 +1,21 @@
-
-
+
+
+
+
diff --git a/vector/src/main/res/drawable/ic_insert_emoji.xml b/vector/src/main/res/drawable/ic_insert_emoji.xml
new file mode 100644
index 0000000000..c35000342b
--- /dev/null
+++ b/vector/src/main/res/drawable/ic_insert_emoji.xml
@@ -0,0 +1,21 @@
+
+
+
+
+
+
diff --git a/vector/src/main/res/drawable/ic_keyboard.xml b/vector/src/main/res/drawable/ic_keyboard.xml
new file mode 100644
index 0000000000..5e5d431abb
--- /dev/null
+++ b/vector/src/main/res/drawable/ic_keyboard.xml
@@ -0,0 +1,4 @@
+
+
+
diff --git a/vector/src/main/res/layout/constraint_set_composer_layout_compact.xml b/vector/src/main/res/layout/constraint_set_composer_layout_compact.xml
index ac67db6a64..6b9fbd4885 100644
--- a/vector/src/main/res/layout/constraint_set_composer_layout_compact.xml
+++ b/vector/src/main/res/layout/constraint_set_composer_layout_compact.xml
@@ -77,9 +77,9 @@
android:alpha="0"
app:layout_constraintEnd_toStartOf="parent"
app:layout_constraintTop_toBottomOf="parent"
+ app:tint="?riotx_text_primary"
tools:ignore="MissingConstraints,MissingPrefix"
- tools:src="@drawable/ic_edit"
- app:tint="?riotx_text_primary" />
+ tools:src="@drawable/ic_edit" />
+ app:tint="@color/riotx_notice"
+ tools:ignore="MissingPrefix"
+ tools:visibility="visible" />
-
-
+ tools:ignore="MissingPrefix" />
-
+ tools:visibility="visible" />
+ app:layout_constraintTop_toTopOf="@id/sendButton"
+ app:layout_goneMarginEnd="8dp" />
diff --git a/vector/src/main/res/layout/constraint_set_composer_layout_expanded.xml b/vector/src/main/res/layout/constraint_set_composer_layout_expanded.xml
index dba996309e..f52b072ece 100644
--- a/vector/src/main/res/layout/constraint_set_composer_layout_expanded.xml
+++ b/vector/src/main/res/layout/constraint_set_composer_layout_expanded.xml
@@ -83,9 +83,9 @@
app:layout_constraintEnd_toEndOf="@id/composer_related_message_avatar_view"
app:layout_constraintStart_toStartOf="@id/composer_related_message_avatar_view"
app:layout_constraintTop_toBottomOf="@id/composer_related_message_avatar_view"
- tools:src="@drawable/ic_edit"
app:tint="?riotx_text_primary"
- tools:ignore="MissingPrefix" />
+ tools:ignore="MissingPrefix"
+ tools:src="@drawable/ic_edit" />
-
-
-
-
-
-
-
-
+
+
+
+
diff --git a/vector/src/main/res/layout/merge_composer_layout.xml b/vector/src/main/res/layout/merge_composer_layout.xml
index 908b3f009b..ea2bc1bf30 100644
--- a/vector/src/main/res/layout/merge_composer_layout.xml
+++ b/vector/src/main/res/layout/merge_composer_layout.xml
@@ -70,8 +70,8 @@
android:id="@+id/composer_related_message_action_image"
android:layout_width="0dp"
android:layout_height="0dp"
- tools:ignore="MissingConstraints,MissingPrefix"
- app:tint="?riotx_text_primary" />
+ app:tint="?riotx_text_primary"
+ tools:ignore="MissingConstraints,MissingPrefix" />
-
-
+ android:background="?android:attr/selectableItemBackground"
+ android:src="@drawable/ic_insert_emoji"
+ tools:ignore="MissingConstraints" />