Przeglądaj źródła

im 聊天 表情功能 表情展现

fancy 5 lat temu
rodzic
commit
396c6c1abf
100 zmienionych plików z 430 dodań i 29 usunięć
  1. 2 1
      o2android/app/build.gradle
  2. 88 1
      o2android/app/src/main/java/net/zoneland/x/bpm/mobile/v1/zoneXBPM/app/im/O2ChatActivity.kt
  3. 37 15
      o2android/app/src/main/java/net/zoneland/x/bpm/mobile/v1/zoneXBPM/app/im/O2ChatMessageAdapter.kt
  4. 97 0
      o2android/app/src/main/java/net/zoneland/x/bpm/mobile/v1/zoneXBPM/app/im/O2IM.kt
  5. 23 6
      o2android/app/src/main/java/net/zoneland/x/bpm/mobile/v1/zoneXBPM/app/im/fm/O2IMConversationFragment.kt
  6. 2 2
      o2android/app/src/main/java/net/zoneland/x/bpm/mobile/v1/zoneXBPM/app/o2/main/MainActivity.kt
  7. 96 0
      o2android/app/src/main/java/net/zoneland/x/bpm/mobile/v1/zoneXBPM/widgets/KeyboardLayout.java
  8. 21 0
      o2android/app/src/main/res/layout/activity_o2_chat.xml
  9. 7 0
      o2android/app/src/main/res/layout/item_o2_chat_message_text_left.xml
  10. 7 0
      o2android/app/src/main/res/layout/item_o2_chat_message_text_right.xml
  11. 17 0
      o2android/app/src/main/res/layout/item_o2_im_chat_emoji.xml
  12. 12 0
      o2android/app/src/main/res/layout/item_o2_im_conversation.xml
  13. BIN
      o2android/app/src/main/res/mipmap-xhdpi/im_emotion_01.png
  14. BIN
      o2android/app/src/main/res/mipmap-xhdpi/im_emotion_02.png
  15. BIN
      o2android/app/src/main/res/mipmap-xhdpi/im_emotion_03.png
  16. BIN
      o2android/app/src/main/res/mipmap-xhdpi/im_emotion_04.png
  17. BIN
      o2android/app/src/main/res/mipmap-xhdpi/im_emotion_05.png
  18. BIN
      o2android/app/src/main/res/mipmap-xhdpi/im_emotion_06.png
  19. BIN
      o2android/app/src/main/res/mipmap-xhdpi/im_emotion_07.png
  20. BIN
      o2android/app/src/main/res/mipmap-xhdpi/im_emotion_08.png
  21. BIN
      o2android/app/src/main/res/mipmap-xhdpi/im_emotion_09.png
  22. BIN
      o2android/app/src/main/res/mipmap-xhdpi/im_emotion_10.png
  23. BIN
      o2android/app/src/main/res/mipmap-xhdpi/im_emotion_11.png
  24. BIN
      o2android/app/src/main/res/mipmap-xhdpi/im_emotion_12.png
  25. BIN
      o2android/app/src/main/res/mipmap-xhdpi/im_emotion_13.png
  26. BIN
      o2android/app/src/main/res/mipmap-xhdpi/im_emotion_14.png
  27. BIN
      o2android/app/src/main/res/mipmap-xhdpi/im_emotion_15.png
  28. BIN
      o2android/app/src/main/res/mipmap-xhdpi/im_emotion_16.png
  29. BIN
      o2android/app/src/main/res/mipmap-xhdpi/im_emotion_17.png
  30. BIN
      o2android/app/src/main/res/mipmap-xhdpi/im_emotion_18.png
  31. BIN
      o2android/app/src/main/res/mipmap-xhdpi/im_emotion_19.png
  32. BIN
      o2android/app/src/main/res/mipmap-xhdpi/im_emotion_20.png
  33. BIN
      o2android/app/src/main/res/mipmap-xhdpi/im_emotion_21.png
  34. BIN
      o2android/app/src/main/res/mipmap-xhdpi/im_emotion_22.png
  35. BIN
      o2android/app/src/main/res/mipmap-xhdpi/im_emotion_23.png
  36. BIN
      o2android/app/src/main/res/mipmap-xhdpi/im_emotion_24.png
  37. BIN
      o2android/app/src/main/res/mipmap-xhdpi/im_emotion_25.png
  38. BIN
      o2android/app/src/main/res/mipmap-xhdpi/im_emotion_26.png
  39. BIN
      o2android/app/src/main/res/mipmap-xhdpi/im_emotion_27.png
  40. BIN
      o2android/app/src/main/res/mipmap-xhdpi/im_emotion_28.png
  41. BIN
      o2android/app/src/main/res/mipmap-xhdpi/im_emotion_29.png
  42. BIN
      o2android/app/src/main/res/mipmap-xhdpi/im_emotion_30.png
  43. BIN
      o2android/app/src/main/res/mipmap-xhdpi/im_emotion_31.png
  44. BIN
      o2android/app/src/main/res/mipmap-xhdpi/im_emotion_32.png
  45. BIN
      o2android/app/src/main/res/mipmap-xhdpi/im_emotion_33.png
  46. BIN
      o2android/app/src/main/res/mipmap-xhdpi/im_emotion_34.png
  47. BIN
      o2android/app/src/main/res/mipmap-xhdpi/im_emotion_35.png
  48. BIN
      o2android/app/src/main/res/mipmap-xhdpi/im_emotion_36.png
  49. BIN
      o2android/app/src/main/res/mipmap-xhdpi/im_emotion_37.png
  50. BIN
      o2android/app/src/main/res/mipmap-xhdpi/im_emotion_38.png
  51. BIN
      o2android/app/src/main/res/mipmap-xhdpi/im_emotion_39.png
  52. BIN
      o2android/app/src/main/res/mipmap-xhdpi/im_emotion_40.png
  53. BIN
      o2android/app/src/main/res/mipmap-xhdpi/im_emotion_41.png
  54. BIN
      o2android/app/src/main/res/mipmap-xhdpi/im_emotion_42.png
  55. BIN
      o2android/app/src/main/res/mipmap-xhdpi/im_emotion_43.png
  56. BIN
      o2android/app/src/main/res/mipmap-xhdpi/im_emotion_44.png
  57. BIN
      o2android/app/src/main/res/mipmap-xhdpi/im_emotion_45.png
  58. BIN
      o2android/app/src/main/res/mipmap-xhdpi/im_emotion_46.png
  59. BIN
      o2android/app/src/main/res/mipmap-xhdpi/im_emotion_47.png
  60. BIN
      o2android/app/src/main/res/mipmap-xhdpi/im_emotion_48.png
  61. BIN
      o2android/app/src/main/res/mipmap-xhdpi/im_emotion_49.png
  62. BIN
      o2android/app/src/main/res/mipmap-xhdpi/im_emotion_50.png
  63. BIN
      o2android/app/src/main/res/mipmap-xhdpi/im_emotion_51.png
  64. BIN
      o2android/app/src/main/res/mipmap-xhdpi/im_emotion_52.png
  65. BIN
      o2android/app/src/main/res/mipmap-xhdpi/im_emotion_53.png
  66. BIN
      o2android/app/src/main/res/mipmap-xhdpi/im_emotion_54.png
  67. BIN
      o2android/app/src/main/res/mipmap-xhdpi/im_emotion_55.png
  68. BIN
      o2android/app/src/main/res/mipmap-xhdpi/im_emotion_56.png
  69. BIN
      o2android/app/src/main/res/mipmap-xhdpi/im_emotion_57.png
  70. BIN
      o2android/app/src/main/res/mipmap-xhdpi/im_emotion_58.png
  71. BIN
      o2android/app/src/main/res/mipmap-xhdpi/im_emotion_59.png
  72. BIN
      o2android/app/src/main/res/mipmap-xhdpi/im_emotion_60.png
  73. BIN
      o2android/app/src/main/res/mipmap-xhdpi/im_emotion_61.png
  74. BIN
      o2android/app/src/main/res/mipmap-xhdpi/im_emotion_62.png
  75. BIN
      o2android/app/src/main/res/mipmap-xhdpi/im_emotion_63.png
  76. BIN
      o2android/app/src/main/res/mipmap-xhdpi/im_emotion_64.png
  77. BIN
      o2android/app/src/main/res/mipmap-xhdpi/im_emotion_65.png
  78. BIN
      o2android/app/src/main/res/mipmap-xhdpi/im_emotion_66.png
  79. BIN
      o2android/app/src/main/res/mipmap-xhdpi/im_emotion_67.png
  80. BIN
      o2android/app/src/main/res/mipmap-xhdpi/im_emotion_68.png
  81. BIN
      o2android/app/src/main/res/mipmap-xhdpi/im_emotion_69.png
  82. BIN
      o2android/app/src/main/res/mipmap-xhdpi/im_emotion_70.png
  83. BIN
      o2android/app/src/main/res/mipmap-xhdpi/im_emotion_71.png
  84. BIN
      o2android/app/src/main/res/mipmap-xhdpi/im_emotion_72.png
  85. BIN
      o2android/app/src/main/res/mipmap-xhdpi/im_emotion_73.png
  86. BIN
      o2android/app/src/main/res/mipmap-xhdpi/im_emotion_74.png
  87. BIN
      o2android/app/src/main/res/mipmap-xhdpi/im_emotion_75.png
  88. BIN
      o2android/app/src/main/res/mipmap-xhdpi/im_emotion_76.png
  89. BIN
      o2android/app/src/main/res/mipmap-xhdpi/im_emotion_77.png
  90. BIN
      o2android/app/src/main/res/mipmap-xhdpi/im_emotion_78.png
  91. BIN
      o2android/app/src/main/res/mipmap-xhdpi/im_emotion_79.png
  92. BIN
      o2android/app/src/main/res/mipmap-xhdpi/im_emotion_80.png
  93. BIN
      o2android/app/src/main/res/mipmap-xhdpi/im_emotion_81.png
  94. BIN
      o2android/app/src/main/res/mipmap-xhdpi/im_emotion_82.png
  95. BIN
      o2android/app/src/main/res/mipmap-xhdpi/im_emotion_83.png
  96. BIN
      o2android/app/src/main/res/mipmap-xhdpi/im_emotion_84.png
  97. BIN
      o2android/app/src/main/res/mipmap-xhdpi/im_emotion_85.png
  98. BIN
      o2android/app/src/main/res/mipmap-xhdpi/im_emotion_86.png
  99. BIN
      o2android/app/src/main/res/mipmap-xhdpi/im_emotion_87.png
  100. 21 4
      o2android/o2_auth_sdk/src/main/java/net/zoneland/x/bpm/mobile/v1/zoneXBPM/model/bo/api/im/IMMessage.kt

+ 2 - 1
o2android/app/build.gradle

@@ -265,7 +265,8 @@ dependencies {
     implementation 'cn.jiguang.sdk:jcore:1.1.9'
     implementation 'cn.jiguang.sdk:jcore:1.1.9'
 
 
     //im
     //im
-    implementation 'com.michaelpardo:activeandroid:3.1.0-SNAPSHOT'
+//    implementation 'com.michaelpardo:activeandroid:3.1.0-SNAPSHOT'
+    implementation files('libs/activeandroid-3.1.0-SNAPSHOT.jar')
     implementation 'com.jakewharton:butterknife:8.4.0'
     implementation 'com.jakewharton:butterknife:8.4.0'
     kapt 'com.jakewharton:butterknife-compiler:8.4.0'
     kapt 'com.jakewharton:butterknife-compiler:8.4.0'
     implementation 'com.github.chrisbanes.photoview:library:1.2.4'
     implementation 'com.github.chrisbanes.photoview:library:1.2.4'

+ 88 - 1
o2android/app/src/main/java/net/zoneland/x/bpm/mobile/v1/zoneXBPM/app/im/O2ChatActivity.kt

@@ -24,7 +24,16 @@ import net.zoneland.x.bpm.mobile.v1.zoneXBPM.utils.extension.hideSoftInput
 import net.zoneland.x.bpm.mobile.v1.zoneXBPM.utils.extension.visible
 import net.zoneland.x.bpm.mobile.v1.zoneXBPM.utils.extension.visible
 import java.util.*
 import java.util.*
 import android.content.IntentFilter
 import android.content.IntentFilter
+import android.support.v7.widget.GridLayoutManager
+import android.view.MotionEvent
+import net.zoneland.x.bpm.mobile.v1.zoneXBPM.core.component.adapter.CommonRecycleViewAdapter
+import net.zoneland.x.bpm.mobile.v1.zoneXBPM.core.component.adapter.CommonRecyclerViewHolder
 import net.zoneland.x.bpm.mobile.v1.zoneXBPM.model.bo.api.im.IMConversationInfo
 import net.zoneland.x.bpm.mobile.v1.zoneXBPM.model.bo.api.im.IMConversationInfo
+import android.view.View
+
+import android.view.animation.AlphaAnimation
+import android.view.WindowManager
+import android.view.inputmethod.InputMethodManager
 
 
 
 
 class O2ChatActivity : BaseMVPActivity<O2ChatContract.View, O2ChatContract.Presenter>(), O2ChatContract.View {
 class O2ChatActivity : BaseMVPActivity<O2ChatContract.View, O2ChatContract.Presenter>(), O2ChatContract.View {
@@ -46,6 +55,16 @@ class O2ChatActivity : BaseMVPActivity<O2ChatContract.View, O2ChatContract.Prese
 
 
 
 
     private val adapter: O2ChatMessageAdapter by lazy { O2ChatMessageAdapter() }
     private val adapter: O2ChatMessageAdapter by lazy { O2ChatMessageAdapter() }
+    private val emojiList = O2IM.im_emoji_hashMap.keys.toList().sortedBy { it }
+    private val emojiAdapter : CommonRecycleViewAdapter<String> by lazy {
+        object : CommonRecycleViewAdapter<String>(this, emojiList, R.layout.item_o2_im_chat_emoji) {
+            override fun convert(holder: CommonRecyclerViewHolder?, t: String?) {
+                if (t != null) {
+                    holder?.setImageViewResource(R.id.image_item_o2_im_chat_emoji, O2IM.emojiResId(t))
+                }
+            }
+        }
+    }
 
 
     //
     //
     private val defaultTitle = "聊天界面"
     private val defaultTitle = "聊天界面"
@@ -56,9 +75,14 @@ class O2ChatActivity : BaseMVPActivity<O2ChatContract.View, O2ChatContract.Prese
     private var conversationInfo: IMConversationInfo? = null
     private var conversationInfo: IMConversationInfo? = null
 
 
 
 
+    private var mKeyboardHeight = 150 // 输入法默认高度为400
+
 
 
 
 
     override fun afterSetContentView(savedInstanceState: Bundle?) {
     override fun afterSetContentView(savedInstanceState: Bundle?) {
+        // 起初的布局可自动调整大小
+        window.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE or WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN)
+
 
 
         setupToolBar(defaultTitle, setupBackButton = true)
         setupToolBar(defaultTitle, setupBackButton = true)
 
 
@@ -82,6 +106,16 @@ class O2ChatActivity : BaseMVPActivity<O2ChatContract.View, O2ChatContract.Prese
             }
             }
         }
         }
 
 
+        //表情初始化
+        rv_o2_chat_emoji_box.layoutManager = GridLayoutManager(this, 10)
+        rv_o2_chat_emoji_box.adapter = emojiAdapter
+        emojiAdapter.setOnItemClickListener { _, position ->
+            val key = emojiList[position]
+            XLog.debug(key)
+        }
+
+
+
         initListener()
         initListener()
 
 
         getPageData()
         getPageData()
@@ -90,6 +124,7 @@ class O2ChatActivity : BaseMVPActivity<O2ChatContract.View, O2ChatContract.Prese
     }
     }
 
 
 
 
+
     override fun onDestroy() {
     override fun onDestroy() {
         super.onDestroy()
         super.onDestroy()
         if (mReceiver != null) {
         if (mReceiver != null) {
@@ -162,13 +197,65 @@ class O2ChatActivity : BaseMVPActivity<O2ChatContract.View, O2ChatContract.Prese
                 }
                 }
             }
             }
         })
         })
+        et_o2_chat_input.setOnClickListener {
+            rv_o2_chat_emoji_box_out.postDelayed({
+                rv_o2_chat_emoji_box.gone()
+                window.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE)
+            }, 250)
+        }
+        rv_o2_chat_emoji_box_out.setKeyboardListener { isActive, keyboardHeight ->
+            if (isActive) { // 输入法打开
+                if (mKeyboardHeight != keyboardHeight) { // 键盘发生改变时才设置emojiView的高度,因为会触发onGlobalLayoutChanged,导致onKeyboardStateChanged再次被调用
+                    mKeyboardHeight = keyboardHeight
+                    initEmojiView() // 每次输入法弹起时,设置emojiView的高度为键盘的高度,以便下次emojiView弹出时刚好等于键盘高度
+                }
+                if (rv_o2_chat_emoji_box.visibility == View.VISIBLE) { // 表情打开状态下
+                    rv_o2_chat_emoji_box.gone()
+                }
+            }
+        }
         btn_o2_chat_emotion.setOnClickListener {
         btn_o2_chat_emotion.setOnClickListener {
-            hideSoftInput()
+            if (rv_o2_chat_emoji_box_out.isKeyboardActive) { //输入法激活时
+                if(rv_o2_chat_emoji_box.visibility == View.GONE) {
+                    window.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_NOTHING) //  不改变布局,隐藏键盘,emojiView弹出
+                    val imm =  it.context.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
+                    imm.hideSoftInputFromWindow(et_o2_chat_input.applicationWindowToken, 0)
+                    rv_o2_chat_emoji_box.visibility = View.VISIBLE
+                }else {
+                    rv_o2_chat_emoji_box.visibility = View.GONE
+                    val imm =  it.context.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
+                    imm.hideSoftInputFromWindow(et_o2_chat_input.applicationWindowToken, 0)
+                    window.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE)
+                }
+            }else {
+                window.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE)
+                if(rv_o2_chat_emoji_box.visibility == View.GONE) {
+                    rv_o2_chat_emoji_box.visibility = View.VISIBLE
+                }else {
+                    rv_o2_chat_emoji_box.visibility = View.GONE
+                }
+            }
+
         }
         }
         btn_o2_chat_send.setOnClickListener {
         btn_o2_chat_send.setOnClickListener {
             sendTextMessage()
             sendTextMessage()
         }
         }
     }
     }
+    // 设置表情栏的高度
+    private fun initEmojiView() {
+        val layoutParams = rv_o2_chat_emoji_box.layoutParams
+        layoutParams.height = mKeyboardHeight
+        rv_o2_chat_emoji_box.layoutParams = layoutParams
+    }
+
+    //打开表情框
+    private fun showEmojiBox() {
+//        rv_o2_chat_emoji_box.visible()
+        val alphaAnimation = AlphaAnimation(1f, 0f)
+        alphaAnimation.duration = 300
+        rv_o2_chat_emoji_box.startAnimation(alphaAnimation)
+        rv_o2_chat_emoji_box.visibility = View.VISIBLE
+    }
 
 
     private fun getPageData() {
     private fun getPageData() {
         mPresenter.getMessage(page + 1, conversationId)
         mPresenter.getMessage(page + 1, conversationId)

+ 37 - 15
o2android/app/src/main/java/net/zoneland/x/bpm/mobile/v1/zoneXBPM/app/im/O2ChatMessageAdapter.kt

@@ -7,6 +7,7 @@ import android.view.animation.Animation
 import android.view.animation.AnimationUtils
 import android.view.animation.AnimationUtils
 import android.widget.ImageButton
 import android.widget.ImageButton
 import android.widget.ImageView
 import android.widget.ImageView
+import android.widget.TextView
 import net.zoneland.x.bpm.mobile.v1.zoneXBPM.O2SDKManager
 import net.zoneland.x.bpm.mobile.v1.zoneXBPM.O2SDKManager
 import net.zoneland.x.bpm.mobile.v1.zoneXBPM.R
 import net.zoneland.x.bpm.mobile.v1.zoneXBPM.R
 import net.zoneland.x.bpm.mobile.v1.zoneXBPM.core.component.adapter.CommonRecyclerViewHolder
 import net.zoneland.x.bpm.mobile.v1.zoneXBPM.core.component.adapter.CommonRecyclerViewHolder
@@ -68,18 +69,24 @@ class O2ChatMessageAdapter : RecyclerView.Adapter<RecyclerView.ViewHolder>() {
 
 
     override fun getItemViewType(position: Int): Int {
     override fun getItemViewType(position: Int): Int {
         val message = messages[position]
         val message = messages[position]
-        val body = message.messageBody()
-        if(body != null) {
-            if (body is IMMessageBody.Text) {
-                return if (message.createPerson == O2SDKManager.instance().distinguishedName) {
-                    TEXT_right
-                }else {
-                    TEXT_left
-                }
-            }
-            //其它
+        return if (message.createPerson == O2SDKManager.instance().distinguishedName) {
+            TEXT_right
+        }else {
+            TEXT_left
         }
         }
-        return 0
+//
+//        val body = message.messageBody()
+//        if(body != null) {
+//            if (body is IMMessageBody.Text) {
+//                return if (message.createPerson == O2SDKManager.instance().distinguishedName) {
+//                    TEXT_right
+//                }else {
+//                    TEXT_left
+//                }
+//            }
+//            //其它
+//        }
+//        return 0
     }
     }
 
 
     override fun onCreateViewHolder(parent: ViewGroup?, viewType: Int): RecyclerView.ViewHolder {
     override fun onCreateViewHolder(parent: ViewGroup?, viewType: Int): RecyclerView.ViewHolder {
@@ -113,11 +120,26 @@ class O2ChatMessageAdapter : RecyclerView.Adapter<RecyclerView.ViewHolder>() {
                     time = DateHelper.imChatMessageTime(message.createTime)
                     time = DateHelper.imChatMessageTime(message.createTime)
                 }
                 }
             }
             }
-            if (messageBody!= null && messageBody is IMMessageBody.Text) {
-                holder.setText(R.id.tv_o2_chat_message_body, messageBody.body)
-                        .setText(R.id.tv_o2_chat_message_person_name, name)
-                        .setText(R.id.tv_o2_chat_message_time, time)
+            if (messageBody != null) {
+                if (messageBody is IMMessageBody.Text) {
+                    val textBody = holder.getView<TextView>(R.id.tv_o2_chat_message_body)
+                    textBody.text = messageBody.body
+                    textBody.visible()
+                    val imgBody = holder.getView<ImageView>(R.id.image_o2_chat_message_emoji_body)
+                    imgBody.gone()
+                    holder.setText(R.id.tv_o2_chat_message_person_name, name)
+                            .setText(R.id.tv_o2_chat_message_time, time)
+                }else if (messageBody is IMMessageBody.Emoji) {
+                    val textBody = holder.getView<TextView>(R.id.tv_o2_chat_message_body)
+                    textBody.gone()
+                    val imgBody = holder.getView<ImageView>(R.id.image_o2_chat_message_emoji_body)
+                    imgBody.setImageResource(O2IM.emojiResId(messageBody.body))
+                    imgBody.visible()
+                    holder.setText(R.id.tv_o2_chat_message_person_name, name)
+                            .setText(R.id.tv_o2_chat_message_time, time)
+                }
             }
             }
+
             //头像
             //头像
             val avatar = holder.getView<CircleImageView>(R.id.image_o2_chat_message_avatar)
             val avatar = holder.getView<CircleImageView>(R.id.image_o2_chat_message_avatar)
             val url = APIAddressHelper.instance().getPersonAvatarUrlWithId(message.createPerson)
             val url = APIAddressHelper.instance().getPersonAvatarUrlWithId(message.createPerson)

+ 97 - 0
o2android/app/src/main/java/net/zoneland/x/bpm/mobile/v1/zoneXBPM/app/im/O2IM.kt

@@ -1,5 +1,7 @@
 package net.zoneland.x.bpm.mobile.v1.zoneXBPM.app.im
 package net.zoneland.x.bpm.mobile.v1.zoneXBPM.app.im
 
 
+import net.zoneland.x.bpm.mobile.v1.zoneXBPM.R
+
 object O2IM {
 object O2IM {
 
 
     const val IM_Message_Receiver_Action = "net.o2oa.android.im.message"
     const val IM_Message_Receiver_Action = "net.o2oa.android.im.message"
@@ -7,4 +9,99 @@ object O2IM {
 
 
     const val conversation_type_single = "single"
     const val conversation_type_single = "single"
     const val conversation_type_group = "group"
     const val conversation_type_group = "group"
+
+    val im_emoji_hashMap = hashMapOf<String, Int>(
+            "[01]" to R.mipmap.im_emotion_01,
+            "[02]" to R.mipmap.im_emotion_02,
+            "[03]" to R.mipmap.im_emotion_03,
+            "[04]" to R.mipmap.im_emotion_04,
+            "[05]" to R.mipmap.im_emotion_05,
+            "[06]" to R.mipmap.im_emotion_06,
+            "[07]" to R.mipmap.im_emotion_07,
+            "[08]" to R.mipmap.im_emotion_08,
+            "[09]" to R.mipmap.im_emotion_09,
+            "[10]" to R.mipmap.im_emotion_10,
+            "[11]" to R.mipmap.im_emotion_11,
+            "[12]" to R.mipmap.im_emotion_12,
+            "[13]" to R.mipmap.im_emotion_13,
+            "[14]" to R.mipmap.im_emotion_14,
+            "[15]" to R.mipmap.im_emotion_15,
+            "[16]" to R.mipmap.im_emotion_16,
+            "[17]" to R.mipmap.im_emotion_17,
+            "[18]" to R.mipmap.im_emotion_18,
+            "[19]" to R.mipmap.im_emotion_19,
+            "[20]" to R.mipmap.im_emotion_20,
+            "[21]" to R.mipmap.im_emotion_21,
+            "[22]" to R.mipmap.im_emotion_22,
+            "[23]" to R.mipmap.im_emotion_23,
+            "[24]" to R.mipmap.im_emotion_24,
+            "[25]" to R.mipmap.im_emotion_25,
+            "[26]" to R.mipmap.im_emotion_26,
+            "[27]" to R.mipmap.im_emotion_27,
+            "[28]" to R.mipmap.im_emotion_28,
+            "[29]" to R.mipmap.im_emotion_29,
+            "[30]" to R.mipmap.im_emotion_30,
+            "[31]" to R.mipmap.im_emotion_31,
+            "[32]" to R.mipmap.im_emotion_32,
+            "[33]" to R.mipmap.im_emotion_33,
+            "[34]" to R.mipmap.im_emotion_34,
+            "[35]" to R.mipmap.im_emotion_35,
+            "[36]" to R.mipmap.im_emotion_36,
+            "[37]" to R.mipmap.im_emotion_37,
+            "[38]" to R.mipmap.im_emotion_38,
+            "[39]" to R.mipmap.im_emotion_39,
+            "[40]" to R.mipmap.im_emotion_40,
+            "[41]" to R.mipmap.im_emotion_41,
+            "[42]" to R.mipmap.im_emotion_42,
+            "[43]" to R.mipmap.im_emotion_43,
+            "[44]" to R.mipmap.im_emotion_44,
+            "[45]" to R.mipmap.im_emotion_45,
+            "[46]" to R.mipmap.im_emotion_46,
+            "[47]" to R.mipmap.im_emotion_47,
+            "[48]" to R.mipmap.im_emotion_48,
+            "[49]" to R.mipmap.im_emotion_49,
+            "[50]" to R.mipmap.im_emotion_50,
+            "[51]" to R.mipmap.im_emotion_51,
+            "[52]" to R.mipmap.im_emotion_52,
+            "[53]" to R.mipmap.im_emotion_53,
+            "[54]" to R.mipmap.im_emotion_54,
+            "[55]" to R.mipmap.im_emotion_55,
+            "[56]" to R.mipmap.im_emotion_56,
+            "[57]" to R.mipmap.im_emotion_57,
+            "[58]" to R.mipmap.im_emotion_58,
+            "[59]" to R.mipmap.im_emotion_59,
+            "[60]" to R.mipmap.im_emotion_60,
+            "[61]" to R.mipmap.im_emotion_61,
+            "[62]" to R.mipmap.im_emotion_62,
+            "[63]" to R.mipmap.im_emotion_63,
+            "[64]" to R.mipmap.im_emotion_64,
+            "[65]" to R.mipmap.im_emotion_65,
+            "[66]" to R.mipmap.im_emotion_66,
+            "[67]" to R.mipmap.im_emotion_67,
+            "[68]" to R.mipmap.im_emotion_68,
+            "[69]" to R.mipmap.im_emotion_69,
+            "[70]" to R.mipmap.im_emotion_70,
+            "[71]" to R.mipmap.im_emotion_71,
+            "[72]" to R.mipmap.im_emotion_72,
+            "[73]" to R.mipmap.im_emotion_73,
+            "[74]" to R.mipmap.im_emotion_74,
+            "[75]" to R.mipmap.im_emotion_75,
+            "[76]" to R.mipmap.im_emotion_76,
+            "[77]" to R.mipmap.im_emotion_77,
+            "[78]" to R.mipmap.im_emotion_78,
+            "[79]" to R.mipmap.im_emotion_79,
+            "[80]" to R.mipmap.im_emotion_80,
+            "[81]" to R.mipmap.im_emotion_81,
+            "[82]" to R.mipmap.im_emotion_82,
+            "[83]" to R.mipmap.im_emotion_83,
+            "[84]" to R.mipmap.im_emotion_84,
+            "[85]" to R.mipmap.im_emotion_85,
+            "[86]" to R.mipmap.im_emotion_86,
+            "[87]" to R.mipmap.im_emotion_87
+    )
+
+    fun emojiResId(key: String) :Int {
+        return im_emoji_hashMap[key] ?: R.mipmap.im_emotion_01
+    }
+
 }
 }

+ 23 - 6
o2android/app/src/main/java/net/zoneland/x/bpm/mobile/v1/zoneXBPM/app/im/fm/O2IMConversationFragment.kt

@@ -3,6 +3,7 @@ package net.zoneland.x.bpm.mobile.v1.zoneXBPM.app.im.fm
 import android.support.v7.widget.LinearLayoutManager
 import android.support.v7.widget.LinearLayoutManager
 import android.view.Menu
 import android.view.Menu
 import android.view.MenuInflater
 import android.view.MenuInflater
+import android.widget.ImageView
 import android.widget.TextView
 import android.widget.TextView
 import kotlinx.android.synthetic.main.fragment_o2_im_conversation.*
 import kotlinx.android.synthetic.main.fragment_o2_im_conversation.*
 import net.zoneland.x.bpm.mobile.v1.zoneXBPM.O2SDKManager
 import net.zoneland.x.bpm.mobile.v1.zoneXBPM.O2SDKManager
@@ -57,15 +58,31 @@ class O2IMConversationFragment : BaseMVPViewPagerFragment<O2IMConversationContra
                     if (lastMessage != null) {
                     if (lastMessage != null) {
                         val lastTime = DateHelper.convertStringToDate(lastMessage.createTime)
                         val lastTime = DateHelper.convertStringToDate(lastMessage.createTime)
                         val lastMessageBody = lastMessage.messageBody()
                         val lastMessageBody = lastMessage.messageBody()
-                        var lastMessageText = ""
-                        if (lastMessageBody != null) {
-                            lastMessageText = when(lastMessageBody) {
-                                is IMMessageBody.Text -> {lastMessageBody.body}
-                                else -> "" //其它消息类型 转化成文本
+                        when(lastMessageBody) {
+                            is IMMessageBody.Emoji -> {
+                                val image = holder.getView<ImageView>(R.id.tv_o2_im_con_last_message_emoji)
+                                image.setImageResource(O2IM.emojiResId(lastMessageBody.body))
+                                image.visible()
+                                val text = holder.getView<TextView>(R.id.tv_o2_im_con_last_message)
+                                text.gone()
+                            }
+                            is IMMessageBody.Text -> {
+                                val image = holder.getView<ImageView>(R.id.tv_o2_im_con_last_message_emoji)
+                                image.gone()
+                                val text = holder.getView<TextView>(R.id.tv_o2_im_con_last_message)
+                                text.text = lastMessageBody.body
+                                text.visible()
+                            }
+                            else -> {
+                                val image = holder.getView<ImageView>(R.id.tv_o2_im_con_last_message_emoji)
+                                image.gone()
+                                val text = holder.getView<TextView>(R.id.tv_o2_im_con_last_message)
+                                text.text = ""
+                                text.visible()
                             }
                             }
                         }
                         }
                         holder.setText(R.id.tv_o2_im_con_last_message_time, DateHelper.friendlyTime(lastTime))
                         holder.setText(R.id.tv_o2_im_con_last_message_time, DateHelper.friendlyTime(lastTime))
-                                .setText(R.id.tv_o2_im_con_last_message, lastMessageText)
+
                     }
                     }
                 }
                 }
             }
             }

+ 2 - 2
o2android/app/src/main/java/net/zoneland/x/bpm/mobile/v1/zoneXBPM/app/o2/main/MainActivity.kt

@@ -81,8 +81,8 @@ class MainActivity : BaseMVPActivity<MainContract.View, MainContract.Presenter>(
         val indexId = O2SDKManager.instance().prefs().getString(O2CustomStyle.INDEX_ID_PREF_KEY, "")
         val indexId = O2SDKManager.instance().prefs().getString(O2CustomStyle.INDEX_ID_PREF_KEY, "")
         XLog.info("main activity isIndex $indexType..............")
         XLog.info("main activity isIndex $indexType..............")
 
 
-//        val newsFragment = O2IMConversationFragment()
-        val newsFragment = NewsFragment()
+        val newsFragment = O2IMConversationFragment()
+//        val newsFragment = NewsFragment()
         fragmentList.add(newsFragment)
         fragmentList.add(newsFragment)
         fragmentTitles.add(getString(R.string.tab_message))
         fragmentTitles.add(getString(R.string.tab_message))
 
 

+ 96 - 0
o2android/app/src/main/java/net/zoneland/x/bpm/mobile/v1/zoneXBPM/widgets/KeyboardLayout.java

@@ -0,0 +1,96 @@
+package net.zoneland.x.bpm.mobile.v1.zoneXBPM.widgets;
+
+import android.content.Context;
+import android.graphics.Rect;
+import android.util.AttributeSet;
+import android.view.ViewTreeObserver;
+import android.view.WindowManager;
+import android.widget.FrameLayout;
+
+/**
+ * Created by fancyLou on 2020-05-19.
+ * Copyright © 2020 O2. All rights reserved.
+ */
+public class KeyboardLayout extends FrameLayout {
+
+    private KeyboardLayoutListener mListener;
+    private boolean mIsKeyboardActive = false; // 输入法是否激活
+    private int mKeyboardHeight = 0; // 输入法高度
+
+    public KeyboardLayout(Context context) {
+        this(context, null, 0);
+    }
+
+    public KeyboardLayout(Context context, AttributeSet attrs) {
+        this(context, attrs, 0);
+    }
+
+    public KeyboardLayout(Context context, AttributeSet attrs, int defStyleAttr) {
+        super(context, attrs, defStyleAttr);
+        // 监听布局变化
+        getViewTreeObserver().addOnGlobalLayoutListener(new KeyboardOnGlobalChangeListener());
+    }
+
+    private class KeyboardOnGlobalChangeListener implements ViewTreeObserver.OnGlobalLayoutListener {
+
+        int mScreenHeight = 0;
+        Rect mRect = new Rect();
+
+        private int getScreenHeight() {
+            if (mScreenHeight > 0) {
+                return mScreenHeight;
+            }
+            mScreenHeight = ((WindowManager) getContext().getSystemService(Context.WINDOW_SERVICE))
+                    .getDefaultDisplay().getHeight();
+            return mScreenHeight;
+        }
+
+        @Override
+        public void onGlobalLayout() {
+//            // 获取当前页面窗口的显示范围
+            getWindowVisibleDisplayFrame(mRect);
+
+            int screenHeight = getScreenHeight();
+            int keyboardHeight = screenHeight - mRect.bottom; // 输入法的高度
+            boolean isActive = false;
+            if (Math.abs(keyboardHeight) > screenHeight / 5) {
+                isActive = true; // 超过屏幕五分之一则表示弹出了输入法
+                mKeyboardHeight = keyboardHeight;
+            }
+            mIsKeyboardActive = isActive;
+            if (mListener != null) {
+                mListener.onKeyboardStateChanged(isActive, keyboardHeight);
+            }
+        }
+    }
+
+    public void setKeyboardListener(KeyboardLayoutListener listener) {
+        mListener = listener;
+    }
+
+    public KeyboardLayoutListener getKeyboardListener() {
+        return mListener;
+    }
+
+    public boolean isKeyboardActive() {
+        return mIsKeyboardActive;
+    }
+
+    /**
+     * 获取输入法高度
+     *
+     * @return
+     */
+    public int getKeyboardHeight() {
+        return mKeyboardHeight;
+    }
+
+    public interface KeyboardLayoutListener {
+        /**
+         * @param isActive       输入法是否激活
+         * @param keyboardHeight 输入法面板高度
+         */
+        void onKeyboardStateChanged(boolean isActive, int keyboardHeight);
+    }
+
+}

+ 21 - 0
o2android/app/src/main/res/layout/activity_o2_chat.xml

@@ -19,6 +19,16 @@
         app:layout_constraintBottom_toTopOf="@+id/ll_o2_chat_input_layout"
         app:layout_constraintBottom_toTopOf="@+id/ll_o2_chat_input_layout"
         app:layout_constraintTop_toBottomOf="@+id/app_bar_layout_snippet" />
         app:layout_constraintTop_toBottomOf="@+id/app_bar_layout_snippet" />
 
 
+    <net.zoneland.x.bpm.mobile.v1.zoneXBPM.widgets.KeyboardLayout
+        android:id="@+id/rv_o2_chat_emoji_box_out"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        app:layout_constraintTop_toTopOf="parent"
+        app:layout_constraintStart_toStartOf="parent"
+        app:layout_constraintEnd_toEndOf="parent"
+        android:visibility="gone">
+
+    </net.zoneland.x.bpm.mobile.v1.zoneXBPM.widgets.KeyboardLayout>
 
 
     <LinearLayout
     <LinearLayout
         android:id="@+id/ll_o2_chat_input_layout"
         android:id="@+id/ll_o2_chat_input_layout"
@@ -133,6 +143,17 @@
             </LinearLayout>
             </LinearLayout>
         </LinearLayout>
         </LinearLayout>
 
 
+        <android.support.v7.widget.RecyclerView
+            android:id="@+id/rv_o2_chat_emoji_box"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:layout_marginBottom="@dimen/spacing_small"
+            android:visibility="gone"
+            android:paddingStart="@dimen/activity_horizontal_margin"
+            android:paddingEnd="@dimen/activity_horizontal_margin"
+            />
+
+
     </LinearLayout>
     </LinearLayout>
 
 
 </android.support.constraint.ConstraintLayout>
 </android.support.constraint.ConstraintLayout>

+ 7 - 0
o2android/app/src/main/res/layout/item_o2_chat_message_text_left.xml

@@ -38,7 +38,14 @@
                 android:id="@+id/tv_o2_chat_message_body"
                 android:id="@+id/tv_o2_chat_message_body"
                 style="@style/o2_im_chat_message_text_style"
                 style="@style/o2_im_chat_message_text_style"
                 android:textAlignment="textStart"
                 android:textAlignment="textStart"
+                android:visibility="gone"
                 tools:text="这里是消息内容。。。。。" />
                 tools:text="这里是消息内容。。。。。" />
+            <ImageView
+                android:id="@+id/image_o2_chat_message_emoji_body"
+                android:layout_width="32dp"
+                android:layout_height="32dp"
+                android:visibility="gone"
+                tools:src="@mipmap/im_emotion_01"/>
         </LinearLayout>
         </LinearLayout>
 
 
         <ImageButton
         <ImageButton

+ 7 - 0
o2android/app/src/main/res/layout/item_o2_chat_message_text_right.xml

@@ -37,7 +37,14 @@
                 android:id="@+id/tv_o2_chat_message_body"
                 android:id="@+id/tv_o2_chat_message_body"
                 style="@style/o2_im_chat_message_text_style"
                 style="@style/o2_im_chat_message_text_style"
                 android:textAlignment="textEnd"
                 android:textAlignment="textEnd"
+                android:visibility="gone"
                 tools:text="这里是消息内容。。。。。" />
                 tools:text="这里是消息内容。。。。。" />
+            <ImageView
+                android:id="@+id/image_o2_chat_message_emoji_body"
+                android:layout_width="32dp"
+                android:layout_height="32dp"
+                android:visibility="gone"
+                tools:src="@mipmap/im_emotion_01"/>
         </LinearLayout>
         </LinearLayout>
 
 
         <ImageButton
         <ImageButton

+ 17 - 0
o2android/app/src/main/res/layout/item_o2_im_chat_emoji.xml

@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="utf-8"?>
+<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:tools="http://schemas.android.com/tools"
+    android:layout_width="wrap_content"
+    android:layout_height="wrap_content"
+    xmlns:app="http://schemas.android.com/apk/res-auto">
+    <ImageView
+        android:id="@+id/image_item_o2_im_chat_emoji"
+        android:layout_width="32dp"
+        android:layout_height="32dp"
+        android:layout_margin="@dimen/spacing_tiny"
+        app:layout_constraintStart_toStartOf="parent"
+        app:layout_constraintEnd_toEndOf="parent"
+        app:layout_constraintTop_toTopOf="parent"
+        app:layout_constraintBottom_toBottomOf="parent"
+        tools:src="@mipmap/im_emotion_01"/>
+</android.support.constraint.ConstraintLayout>

+ 12 - 0
o2android/app/src/main/res/layout/item_o2_im_conversation.xml

@@ -41,8 +41,20 @@
             app:layout_constraintStart_toEndOf="@+id/image_o2_im_con_avatar"
             app:layout_constraintStart_toEndOf="@+id/image_o2_im_con_avatar"
             android:layout_marginStart="@dimen/spacing_small"
             android:layout_marginStart="@dimen/spacing_small"
             android:layout_marginTop="@dimen/spacing_tiny"
             android:layout_marginTop="@dimen/spacing_tiny"
+            android:visibility="gone"
             tools:text="消息" />
             tools:text="消息" />
 
 
+        <ImageView
+            android:id="@+id/tv_o2_im_con_last_message_emoji"
+            android:layout_width="24dp"
+            android:layout_height="24dp"
+            app:layout_constraintTop_toBottomOf="@+id/tv_o2_im_con_title"
+            app:layout_constraintStart_toEndOf="@+id/image_o2_im_con_avatar"
+            android:layout_marginStart="@dimen/spacing_small"
+            android:layout_marginTop="@dimen/spacing_tiny"
+            android:visibility="gone"
+            tools:src="@mipmap/im_emotion_01" />
+
         <TextView
         <TextView
             android:id="@+id/tv_o2_im_con_last_message_time"
             android:id="@+id/tv_o2_im_con_last_message_time"
             android:layout_width="wrap_content"
             android:layout_width="wrap_content"

BIN
o2android/app/src/main/res/mipmap-xhdpi/im_emotion_01.png


BIN
o2android/app/src/main/res/mipmap-xhdpi/im_emotion_02.png


BIN
o2android/app/src/main/res/mipmap-xhdpi/im_emotion_03.png


BIN
o2android/app/src/main/res/mipmap-xhdpi/im_emotion_04.png


BIN
o2android/app/src/main/res/mipmap-xhdpi/im_emotion_05.png


BIN
o2android/app/src/main/res/mipmap-xhdpi/im_emotion_06.png


BIN
o2android/app/src/main/res/mipmap-xhdpi/im_emotion_07.png


BIN
o2android/app/src/main/res/mipmap-xhdpi/im_emotion_08.png


BIN
o2android/app/src/main/res/mipmap-xhdpi/im_emotion_09.png


BIN
o2android/app/src/main/res/mipmap-xhdpi/im_emotion_10.png


BIN
o2android/app/src/main/res/mipmap-xhdpi/im_emotion_11.png


BIN
o2android/app/src/main/res/mipmap-xhdpi/im_emotion_12.png


BIN
o2android/app/src/main/res/mipmap-xhdpi/im_emotion_13.png


BIN
o2android/app/src/main/res/mipmap-xhdpi/im_emotion_14.png


BIN
o2android/app/src/main/res/mipmap-xhdpi/im_emotion_15.png


BIN
o2android/app/src/main/res/mipmap-xhdpi/im_emotion_16.png


BIN
o2android/app/src/main/res/mipmap-xhdpi/im_emotion_17.png


BIN
o2android/app/src/main/res/mipmap-xhdpi/im_emotion_18.png


BIN
o2android/app/src/main/res/mipmap-xhdpi/im_emotion_19.png


BIN
o2android/app/src/main/res/mipmap-xhdpi/im_emotion_20.png


BIN
o2android/app/src/main/res/mipmap-xhdpi/im_emotion_21.png


BIN
o2android/app/src/main/res/mipmap-xhdpi/im_emotion_22.png


BIN
o2android/app/src/main/res/mipmap-xhdpi/im_emotion_23.png


BIN
o2android/app/src/main/res/mipmap-xhdpi/im_emotion_24.png


BIN
o2android/app/src/main/res/mipmap-xhdpi/im_emotion_25.png


BIN
o2android/app/src/main/res/mipmap-xhdpi/im_emotion_26.png


BIN
o2android/app/src/main/res/mipmap-xhdpi/im_emotion_27.png


BIN
o2android/app/src/main/res/mipmap-xhdpi/im_emotion_28.png


BIN
o2android/app/src/main/res/mipmap-xhdpi/im_emotion_29.png


BIN
o2android/app/src/main/res/mipmap-xhdpi/im_emotion_30.png


BIN
o2android/app/src/main/res/mipmap-xhdpi/im_emotion_31.png


BIN
o2android/app/src/main/res/mipmap-xhdpi/im_emotion_32.png


BIN
o2android/app/src/main/res/mipmap-xhdpi/im_emotion_33.png


BIN
o2android/app/src/main/res/mipmap-xhdpi/im_emotion_34.png


BIN
o2android/app/src/main/res/mipmap-xhdpi/im_emotion_35.png


BIN
o2android/app/src/main/res/mipmap-xhdpi/im_emotion_36.png


BIN
o2android/app/src/main/res/mipmap-xhdpi/im_emotion_37.png


BIN
o2android/app/src/main/res/mipmap-xhdpi/im_emotion_38.png


BIN
o2android/app/src/main/res/mipmap-xhdpi/im_emotion_39.png


BIN
o2android/app/src/main/res/mipmap-xhdpi/im_emotion_40.png


BIN
o2android/app/src/main/res/mipmap-xhdpi/im_emotion_41.png


BIN
o2android/app/src/main/res/mipmap-xhdpi/im_emotion_42.png


BIN
o2android/app/src/main/res/mipmap-xhdpi/im_emotion_43.png


BIN
o2android/app/src/main/res/mipmap-xhdpi/im_emotion_44.png


BIN
o2android/app/src/main/res/mipmap-xhdpi/im_emotion_45.png


BIN
o2android/app/src/main/res/mipmap-xhdpi/im_emotion_46.png


BIN
o2android/app/src/main/res/mipmap-xhdpi/im_emotion_47.png


BIN
o2android/app/src/main/res/mipmap-xhdpi/im_emotion_48.png


BIN
o2android/app/src/main/res/mipmap-xhdpi/im_emotion_49.png


BIN
o2android/app/src/main/res/mipmap-xhdpi/im_emotion_50.png


BIN
o2android/app/src/main/res/mipmap-xhdpi/im_emotion_51.png


BIN
o2android/app/src/main/res/mipmap-xhdpi/im_emotion_52.png


BIN
o2android/app/src/main/res/mipmap-xhdpi/im_emotion_53.png


BIN
o2android/app/src/main/res/mipmap-xhdpi/im_emotion_54.png


BIN
o2android/app/src/main/res/mipmap-xhdpi/im_emotion_55.png


BIN
o2android/app/src/main/res/mipmap-xhdpi/im_emotion_56.png


BIN
o2android/app/src/main/res/mipmap-xhdpi/im_emotion_57.png


BIN
o2android/app/src/main/res/mipmap-xhdpi/im_emotion_58.png


BIN
o2android/app/src/main/res/mipmap-xhdpi/im_emotion_59.png


BIN
o2android/app/src/main/res/mipmap-xhdpi/im_emotion_60.png


BIN
o2android/app/src/main/res/mipmap-xhdpi/im_emotion_61.png


BIN
o2android/app/src/main/res/mipmap-xhdpi/im_emotion_62.png


BIN
o2android/app/src/main/res/mipmap-xhdpi/im_emotion_63.png


BIN
o2android/app/src/main/res/mipmap-xhdpi/im_emotion_64.png


BIN
o2android/app/src/main/res/mipmap-xhdpi/im_emotion_65.png


BIN
o2android/app/src/main/res/mipmap-xhdpi/im_emotion_66.png


BIN
o2android/app/src/main/res/mipmap-xhdpi/im_emotion_67.png


BIN
o2android/app/src/main/res/mipmap-xhdpi/im_emotion_68.png


BIN
o2android/app/src/main/res/mipmap-xhdpi/im_emotion_69.png


BIN
o2android/app/src/main/res/mipmap-xhdpi/im_emotion_70.png


BIN
o2android/app/src/main/res/mipmap-xhdpi/im_emotion_71.png


BIN
o2android/app/src/main/res/mipmap-xhdpi/im_emotion_72.png


BIN
o2android/app/src/main/res/mipmap-xhdpi/im_emotion_73.png


BIN
o2android/app/src/main/res/mipmap-xhdpi/im_emotion_74.png


BIN
o2android/app/src/main/res/mipmap-xhdpi/im_emotion_75.png


BIN
o2android/app/src/main/res/mipmap-xhdpi/im_emotion_76.png


BIN
o2android/app/src/main/res/mipmap-xhdpi/im_emotion_77.png


BIN
o2android/app/src/main/res/mipmap-xhdpi/im_emotion_78.png


BIN
o2android/app/src/main/res/mipmap-xhdpi/im_emotion_79.png


BIN
o2android/app/src/main/res/mipmap-xhdpi/im_emotion_80.png


BIN
o2android/app/src/main/res/mipmap-xhdpi/im_emotion_81.png


BIN
o2android/app/src/main/res/mipmap-xhdpi/im_emotion_82.png


BIN
o2android/app/src/main/res/mipmap-xhdpi/im_emotion_83.png


BIN
o2android/app/src/main/res/mipmap-xhdpi/im_emotion_84.png


BIN
o2android/app/src/main/res/mipmap-xhdpi/im_emotion_85.png


BIN
o2android/app/src/main/res/mipmap-xhdpi/im_emotion_86.png


BIN
o2android/app/src/main/res/mipmap-xhdpi/im_emotion_87.png


+ 21 - 4
o2android/o2_auth_sdk/src/main/java/net/zoneland/x/bpm/mobile/v1/zoneXBPM/model/bo/api/im/IMMessage.kt

@@ -20,14 +20,31 @@ data class IMMessage(
         }
         }
         val json = JSONTokener(body).nextValue()
         val json = JSONTokener(body).nextValue()
         if (json is JSONObject) {
         if (json is JSONObject) {
-            val type = json.getString("type")
-            if ("text" == type) {
-                val textBody = json.getString("body")
-                return IMMessageBody.Text(textBody)
+            try {
+                if (json.has("type")) {
+                    val type = json.getString("type")
+                    if (MessageType.text.key == type) {
+                        val textBody = json.getString("body")
+                        return IMMessageBody.Text(textBody)
+                    }else if(MessageType.emoji.key == type) {
+                        val textBody = json.getString("body")
+                        return IMMessageBody.Emoji(textBody)
+                    }
+                }else {
+                    val textBody = json.getString("body")
+                    return IMMessageBody.Text(textBody)
+                }
+            } catch (e: Exception) {
             }
             }
+
         }
         }
         return null
         return null
     }
     }
 
 
 
 
+}
+
+enum class MessageType(val key:String) {
+    text("text"),
+    emoji("emoji")
 }
 }

Niektóre pliki nie zostały wyświetlone z powodu dużej ilości zmienionych plików