ソースを参照

emoji

Signed-off-by: tobiasKaminsky <tobias@kaminsky.me>
tobiasKaminsky 4 年 前
コミット
21fbb68a2b

+ 2 - 0
build.gradle

@@ -321,6 +321,8 @@ dependencies {
     implementation 'com.caverock:androidsvg:1.4'
     implementation 'androidx.annotation:annotation:1.1.0'
     implementation 'com.google.code.gson:gson:2.8.6'
+    implementation group: 'androidx.emoji', name: 'emoji-bundled', version: '1.0.0'
+    implementation 'com.github.vanniktech:Emoji:0.7.0'
 
     implementation 'com.github.cotechde.hwsecurity:hwsecurity-fido:4.1.0'
     implementation 'com.github.cotechde.hwsecurity:hwsecurity-fido2:4.1.0'

+ 1 - 1
src/main/java/com/nextcloud/ui/ChooseAccountDialogFragment.kt

@@ -61,7 +61,7 @@ class ChooseAccountDialogFragment : DialogFragment(),
     private lateinit var dialogView: View
     private var currentUser: User? = null
     private lateinit var accountManager: UserAccountManager
-    private lateinit var currentStatus: Status
+    private var currentStatus: Status? = null
 
     @Inject
     lateinit var clientFactory: ClientFactory

+ 34 - 3
src/main/java/com/nextcloud/ui/SetStatusDialogFragment.kt

@@ -28,7 +28,10 @@ import android.os.Bundle
 import android.view.LayoutInflater
 import android.view.View
 import android.view.ViewGroup
+import android.view.inputmethod.InputMethodManager
 import androidx.annotation.VisibleForTesting
+import androidx.emoji.bundled.BundledEmojiCompatConfig
+import androidx.emoji.text.EmojiCompat
 import androidx.fragment.app.DialogFragment
 import androidx.recyclerview.widget.LinearLayoutManager
 import com.google.android.material.dialog.MaterialAlertDialogBuilder
@@ -52,6 +55,9 @@ import com.owncloud.android.lib.resources.users.StatusType
 import com.owncloud.android.ui.activity.BaseActivity
 import com.owncloud.android.ui.adapter.PredefinedStatusClickListener
 import com.owncloud.android.ui.adapter.PredefinedStatusListAdapter
+import com.vanniktech.emoji.EmojiManager
+import com.vanniktech.emoji.EmojiPopup
+import com.vanniktech.emoji.googlecompat.GoogleCompatEmojiProvider
 import kotlinx.android.synthetic.main.dialog_set_status.*
 import java.util.ArrayList
 import javax.inject.Inject
@@ -69,6 +75,7 @@ class SetStatusDialogFragment : DialogFragment(),
     private lateinit var predefinedStatus: ArrayList<PredefinedStatus>
     private lateinit var adapter: PredefinedStatusListAdapter
     private var selectedPredefinedMessageId: String? = null
+    private lateinit var popup: EmojiPopup
 
     @Inject
     lateinit var arbitraryDataProvider: ArbitraryDataProvider
@@ -92,6 +99,12 @@ class SetStatusDialogFragment : DialogFragment(),
                 predefinedStatus = Gson().fromJson(json, myType)
             }
         }
+
+        val config = BundledEmojiCompatConfig(requireContext())
+        config.setReplaceAll(true)
+        val emojiCompat = EmojiCompat.init(config)
+
+        EmojiManager.install(GoogleCompatEmojiProvider(emojiCompat))
     }
 
     @SuppressLint("InflateParams")
@@ -107,9 +120,9 @@ class SetStatusDialogFragment : DialogFragment(),
         accountManager = (activity as BaseActivity).userAccountManager
 
         currentStatus?.let {
-            emoji.text = it.icon
+            emoji.setText(it.icon)
             customStatusInput.text.clear()
-            customStatusInput.text.append(it.message)
+            customStatusInput.setText(it.message)
         }
 
         adapter = PredefinedStatusListAdapter(this, requireContext())
@@ -126,6 +139,24 @@ class SetStatusDialogFragment : DialogFragment(),
 
         clearStatus.setOnClickListener { clearStatus() }
         setStatus.setOnClickListener { setStatusMessage() }
+        emoji.setOnClickListener { openEmojiPopup() }
+
+        popup = EmojiPopup.Builder
+            .fromRootView(view)
+            .setOnEmojiClickListener { _, _ ->
+                popup.dismiss()
+                emoji.clearFocus()
+                val imm: InputMethodManager = context?.getSystemService(Context.INPUT_METHOD_SERVICE) as
+                    InputMethodManager
+                imm.hideSoftInputFromWindow(emoji.windowToken, 0)
+            }
+            .build(emoji)
+        emoji.disableKeyboardInput(popup)
+        emoji.forceSingleEmoji()
+    }
+
+    private fun openEmojiPopup() {
+        popup.show()
     }
 
     private fun clearStatus() {
@@ -232,7 +263,7 @@ class SetStatusDialogFragment : DialogFragment(),
 
     override fun onClick(predefinedStatus: PredefinedStatus) {
         selectedPredefinedMessageId = predefinedStatus.id
-        emoji.text = predefinedStatus.icon
+        emoji.setText(predefinedStatus.icon)
         customStatusInput.text.clear()
         customStatusInput.text.append(predefinedStatus.message)
     }

+ 4 - 1
src/main/res/layout/dialog_set_status.xml

@@ -348,12 +348,15 @@
         tools:layout_editor_absoluteX="201dp"
         tools:layout_editor_absoluteY="141dp">
 
-        <TextView
+        <com.vanniktech.emoji.EmojiEditText
             android:id="@+id/emoji"
             android:layout_width="48dp"
             android:layout_height="match_parent"
             android:textSize="25sp"
             android:gravity="center"
+            android:cursorVisible="false"
+            app:maxEmojiCount="1"
+            android:background="@color/grey_200"
             tools:text="☁️" />
 
         <EditText