فهرست منبع

持久化消息查看

fancy 5 سال پیش
والد
کامیت
a72758ae40
20فایلهای تغییر یافته به همراه569 افزوده شده و 41 حذف شده
  1. 2 2
      o2android/app/build.gradle
  2. 2 1
      o2android/app/src/main/AndroidManifest.xml
  3. 27 20
      o2android/app/src/main/java/net/zoneland/x/bpm/mobile/v1/zoneXBPM/app/im/O2ChatActivity.kt
  4. 110 0
      o2android/app/src/main/java/net/zoneland/x/bpm/mobile/v1/zoneXBPM/app/im/O2IM.kt
  5. 99 0
      o2android/app/src/main/java/net/zoneland/x/bpm/mobile/v1/zoneXBPM/app/im/O2InstantMessageActivity.kt
  6. 18 0
      o2android/app/src/main/java/net/zoneland/x/bpm/mobile/v1/zoneXBPM/app/im/O2InstantMessageContract.kt
  7. 13 0
      o2android/app/src/main/java/net/zoneland/x/bpm/mobile/v1/zoneXBPM/app/im/O2InstantMessagePresenter.kt
  8. 3 0
      o2android/app/src/main/java/net/zoneland/x/bpm/mobile/v1/zoneXBPM/app/im/fm/O2IMConversationContract.kt
  9. 25 2
      o2android/app/src/main/java/net/zoneland/x/bpm/mobile/v1/zoneXBPM/app/im/fm/O2IMConversationFragment.kt
  10. 37 0
      o2android/app/src/main/java/net/zoneland/x/bpm/mobile/v1/zoneXBPM/app/im/fm/O2IMConversationPresenter.kt
  11. 1 1
      o2android/app/src/main/java/net/zoneland/x/bpm/mobile/v1/zoneXBPM/app/o2/main/MainActivity.kt
  12. 13 9
      o2android/app/src/main/java/net/zoneland/x/bpm/mobile/v1/zoneXBPM/app/o2/organization/NewOrganizationPresenter.kt
  13. 1 0
      o2android/app/src/main/res/layout/activity_login.xml
  14. 19 0
      o2android/app/src/main/res/layout/activity_o2_instant_message.xml
  15. 85 3
      o2android/app/src/main/res/layout/fragment_o2_im_conversation.xml
  16. 2 1
      o2android/build.gradle
  17. 24 2
      o2android/o2_auth_sdk/src/main/java/net/zoneland/x/bpm/mobile/v1/zoneXBPM/core/component/api/O2Interceptor.kt
  18. 10 0
      o2android/o2_auth_sdk/src/main/java/net/zoneland/x/bpm/mobile/v1/zoneXBPM/core/component/api/service/MessageCommunicateService.kt
  19. 56 0
      o2android/o2_auth_sdk/src/main/java/net/zoneland/x/bpm/mobile/v1/zoneXBPM/model/bo/api/InstantMessage.kt
  20. 22 0
      o2android/o2_auth_sdk/src/main/java/net/zoneland/x/bpm/mobile/v1/zoneXBPM/model/bo/api/InstantMessageData.kt

+ 2 - 2
o2android/app/build.gradle

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

+ 2 - 1
o2android/app/src/main/AndroidManifest.xml

@@ -41,7 +41,8 @@
         android:label="@string/app_name"
         android:roundIcon="@mipmap/logo_round"
         android:theme="@style/XBPMTheme.NoActionBar">
-        <activity android:name=".app.im.O2ChatActivity"></activity>
+        <activity android:name=".app.im.O2InstantMessageActivity"></activity>
+        <activity android:name=".app.im.O2ChatActivity" />
         <activity android:name=".app.VideoPlayerActivity" />
         <activity
             android:name=".app.clouddrive.v2.viewer.BigImageViewActivity"

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

@@ -4,15 +4,23 @@ import android.app.Activity
 import android.content.BroadcastReceiver
 import android.content.Context
 import android.content.Intent
+import android.content.IntentFilter
 import android.os.Bundle
+import android.support.v7.widget.GridLayoutManager
 import android.support.v7.widget.LinearLayoutManager
 import android.text.Editable
 import android.text.TextUtils
 import android.text.TextWatcher
+import android.view.View
+import android.view.WindowManager
+import android.view.inputmethod.InputMethodManager
 import kotlinx.android.synthetic.main.activity_o2_chat.*
 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.app.base.BaseMVPActivity
+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.IMMessage
 import net.zoneland.x.bpm.mobile.v1.zoneXBPM.model.bo.api.im.IMMessageBody
 import net.zoneland.x.bpm.mobile.v1.zoneXBPM.utils.DateHelper
@@ -20,20 +28,8 @@ import net.zoneland.x.bpm.mobile.v1.zoneXBPM.utils.XLog
 import net.zoneland.x.bpm.mobile.v1.zoneXBPM.utils.XToast
 import net.zoneland.x.bpm.mobile.v1.zoneXBPM.utils.extension.go
 import net.zoneland.x.bpm.mobile.v1.zoneXBPM.utils.extension.gone
-import net.zoneland.x.bpm.mobile.v1.zoneXBPM.utils.extension.hideSoftInput
 import net.zoneland.x.bpm.mobile.v1.zoneXBPM.utils.extension.visible
 import java.util.*
-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 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 {
@@ -112,6 +108,9 @@ class O2ChatActivity : BaseMVPActivity<O2ChatContract.View, O2ChatContract.Prese
         emojiAdapter.setOnItemClickListener { _, position ->
             val key = emojiList[position]
             XLog.debug(key)
+            newEmojiMessage(key)
+            //更新阅读时间
+            mPresenter.readConversation(conversationId)
         }
 
 
@@ -248,14 +247,6 @@ class O2ChatActivity : BaseMVPActivity<O2ChatContract.View, O2ChatContract.Prese
         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() {
         mPresenter.getMessage(page + 1, conversationId)
@@ -296,6 +287,22 @@ class O2ChatActivity : BaseMVPActivity<O2ChatContract.View, O2ChatContract.Prese
         scroll2Bottom()
     }
 
+    /**
+     * 创建表情消息
+     */
+    private fun newEmojiMessage(emoji: String) {
+        val time = DateHelper.now()
+        val body = IMMessageBody.Emoji(emoji)
+        val bodyJson = O2SDKManager.instance().gson.toJson(body)
+        XLog.debug("body: $bodyJson")
+        val uuid = UUID.randomUUID().toString()
+        val message = IMMessage(uuid, conversationId, bodyJson,
+                O2SDKManager.instance().distinguishedName, time, 1)
+        adapter.addMessage(message)
+        mPresenter.sendTextMessage(message)//发送到服务器
+        scroll2Bottom()
+    }
+
     /**
      * 接收到消息
      */

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

@@ -2,6 +2,7 @@ package net.zoneland.x.bpm.mobile.v1.zoneXBPM.app.im
 
 import net.zoneland.x.bpm.mobile.v1.zoneXBPM.R
 
+
 object O2IM {
 
     const val IM_Message_Receiver_Action = "net.o2oa.android.im.message"
@@ -104,4 +105,113 @@ object O2IM {
         return im_emoji_hashMap[key] ?: R.mipmap.im_emotion_01
     }
 
+
+    //instant message type
+
+    /**
+     * 流程类型
+     */
+    const val TYPE_APPLICATION_CREATE = "application_create"
+
+    const val TYPE_APPLICATION_UPDATE = "application_update"
+
+    const val TYPE_APPLICATION_DELETE = "application_delete"
+
+    const val TYPE_PROCESS_CREATE = "process_create"
+
+    const val TYPE_PROCESS_UPDATE = "process_update"
+
+    const val TYPE_PROCESS_DELETE = "process_delete"
+
+    /* 有新的工作通过消息节点 */
+    const val TYPE_ACTIVITY_MESSAGE = "activity_message"
+
+    const val TYPE_WORK_TO_WORKCOMPLETED = "work_to_workCompleted"
+
+    const val TYPE_WORK_CREATE = "work_create"
+
+    const val TYPE_WORK_DELETE = "work_delete"
+
+    const val TYPE_WORKCOMPLETED_CREATE = "workCompleted_create"
+
+    const val TYPE_WORKCOMPLETED_DELETE = "workCompleted_delete"
+
+    const val TYPE_TASK_TO_TASKCOMPLETED = "task_to_taskCompleted"
+
+    const val TYPE_TASK_CREATE = "task_create"
+
+    const val TYPE_TASK_DELETE = "task_delete"
+
+    const val TYPE_TASK_URGE = "task_urge"
+
+    const val TYPE_TASK_EXPIRE = "task_expire"
+
+    const val TYPE_TASK_PRESS = "task_press"
+
+    const val TYPE_TASKCOMPLETED_CREATE = "taskCompleted_create"
+
+    const val TYPE_TASKCOMPLETED_DELETE = "taskCompleted_delete"
+
+    const val TYPE_READ_TO_READCOMPLETED = "read_to_readCompleted"
+
+    const val TYPE_READ_CREATE = "read_create"
+
+    const val TYPE_READ_DELETE = "read_delete"
+
+    const val TYPE_READCOMPLETED_CREATE = "readCompleted_create"
+
+    const val TYPE_READCOMPLETED_DELETE = "readCompleted_delete"
+
+    const val TYPE_REVIEW_CREATE = "review_create"
+
+    const val TYPE_REVIEW_DELETE = "review_delete"
+
+    const val TYPE_ATTACHMENT_CREATE = "attachment_create"
+
+    const val TYPE_ATTACHMENT_DELETE = "attachment_delete"
+
+    const val TYPE_MEETING_INVITE = "meeting_invite"
+
+    const val TYPE_MEETING_DELETE = "meeting_delete"
+
+    const val TYPE_MEETING_ACCEPT = "meeting_accept"
+
+    const val TYPE_MEETING_REJECT = "meeting_reject"
+
+    const val TYPE_ATTACHMENT_SHARE = "attachment_share"
+
+    const val TYPE_ATTACHMENT_SHARECANCEL = "attachment_shareCancel"
+
+    const val TYPE_ATTACHMENT_EDITOR = "attachment_editor"
+
+    const val TYPE_ATTACHMENT_EDITORCANCEL = "attachment_editorCancel"
+
+    const val TYPE_ATTACHMENT_EDITORMODIFY = "attachment_editorModify"
+
+    const val TYPE_CALENDAR_ALARM = "calendar_alarm"
+
+    const val TYPE_CUSTOM_CREATE = "custom_create"
+
+    const val TYPE_TEAMWORK_TASKCREATE = "teamwork_taskCreate"
+
+    const val TYPE_TEAMWORK_TASKUPDATE = "teamwork_taskUpdate"
+
+    const val TYPE_TEAMWORK_TASKDELETE = "teamwork_taskDelelte"
+
+    const val TYPE_TEAMWORK_TASKOVERTIME = "teamwork_taskOvertime"
+
+    const val TYPE_TEAMWORK_CHAT = "teamwork_taskChat"
+
+    const val TYPE_CMS_PUBLISH = "cms_publish"
+
+    const val TYPE_BBS_SUBJECTCREATE = "bbs_subjectCreate"
+
+    const val TYPE_BBS_REPLYCREATE = "bbs_replyCreate"
+
+    const val TYPE_MIND_FILESEND = "mind_fileSend"
+
+    const val TYPE_MIND_FILESHARE = "mind_fileShare"
+
+    const val TYPE_IM_CREATE = "im_create"
+
 }

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

@@ -0,0 +1,99 @@
+package net.zoneland.x.bpm.mobile.v1.zoneXBPM.app.im
+
+import android.app.Activity
+import android.os.Bundle
+import android.support.v7.widget.LinearLayoutManager
+import android.widget.TextView
+import kotlinx.android.synthetic.main.activity_o2_instant_message.*
+import net.zoneland.x.bpm.mobile.v1.zoneXBPM.R
+import net.zoneland.x.bpm.mobile.v1.zoneXBPM.app.base.BaseMVPActivity
+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.InstantMessage
+import net.zoneland.x.bpm.mobile.v1.zoneXBPM.utils.DateHelper
+import net.zoneland.x.bpm.mobile.v1.zoneXBPM.utils.extension.go
+import net.zoneland.x.bpm.mobile.v1.zoneXBPM.utils.extension.visible
+import net.zoneland.x.bpm.mobile.v1.zoneXBPM.widgets.CircleImageView
+
+class O2InstantMessageActivity : BaseMVPActivity<O2InstantMessageContract.View, O2InstantMessageContract.Presenter>(), O2InstantMessageContract.View {
+    override var mPresenter: O2InstantMessageContract.Presenter = O2InstantMessagePresenter()
+
+
+    override fun layoutResId(): Int = R.layout.activity_o2_instant_message
+
+
+    companion object {
+        val messageListKey = "messageListKey"
+        fun openInstantActivity(instantList: ArrayList<InstantMessage>, activity: Activity) {
+            val bundle = Bundle()
+            bundle.putParcelableArrayList(messageListKey, instantList)
+            activity.go<O2InstantMessageActivity>(bundle)
+        }
+    }
+
+    private val instantList = ArrayList<InstantMessage>()
+    private val adapter: CommonRecycleViewAdapter<InstantMessage> by lazy {
+        object : CommonRecycleViewAdapter<InstantMessage>(this, instantList, R.layout.item_o2_chat_message_text_left) {
+            override fun convert(holder: CommonRecyclerViewHolder?, t: InstantMessage?) {
+                if (t != null && holder!= null) {
+                    val avatar = holder.getView<CircleImageView>(R.id.image_o2_chat_message_avatar)
+                    avatar.setImageResource(messageTypeAvatar(t.type))
+                    val titleText = holder.getView<TextView>(R.id.tv_o2_chat_message_body)
+                    titleText.text = t.title
+                    titleText.visible()
+                    val time = DateHelper.imChatMessageTime(t.createTime)
+                    holder.setText(R.id.tv_o2_chat_message_time, time)
+                }
+
+            }
+
+        }
+    }
+
+
+    override fun afterSetContentView(savedInstanceState: Bundle?) {
+        setupToolBar("通知消息", setupBackButton = true)
+        val inList = intent?.extras?.getParcelableArrayList<InstantMessage>(messageListKey)
+        if (inList != null && inList.isNotEmpty()) {
+            instantList.clear()
+            instantList.addAll(inList)
+        }
+
+        rv_o2_instant_messages.layoutManager = LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false)
+        rv_o2_instant_messages.adapter = adapter
+        if (instantList.isNotEmpty()) {
+            rv_o2_instant_messages.scrollToPosition(instantList.size - 1)
+        }
+    }
+
+
+    private fun messageTypeAvatar(type: String) : Int {
+        if (type.startsWith("task_")) {
+            return R.mipmap.ic_todo_task
+        }else if (type.startsWith("taskCompleted_")) {
+            return R.mipmap.ic_todo_task_completed
+        }else if (type.startsWith("read_")) {
+            return R.mipmap.ic_todo_read
+        }else if (type.startsWith("readCompleted_")) {
+            return R.mipmap.ic_todo_read_completed
+        }else if (type.startsWith("review_")||type.startsWith("work_")||type.startsWith("process_")) {
+            return R.mipmap.ic_todo_task
+        }else if (type.startsWith("meeting_")) {
+            return R.mipmap.app_meeting
+        }else if (type.startsWith("attachment_")) {
+            return R.mipmap.app_yunpan
+        }else if (type.startsWith("calendar_")) {
+            return R.mipmap.app_calendar
+        }else if (type.startsWith("cms_")) {
+            return R.mipmap.app_cms
+        }else if (type.startsWith("bbs_")) {
+            return R.mipmap.app_bbs
+        }else if (type.startsWith("mind_")) {
+            return R.mipmap.app_mind_map
+        }else if (type.startsWith("attachment_")) {
+            return R.mipmap.app_attendance
+        }else {
+            return R.mipmap.app_o2_ai
+        }
+    }
+}

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

@@ -0,0 +1,18 @@
+package net.zoneland.x.bpm.mobile.v1.zoneXBPM.app.im
+
+import net.zoneland.x.bpm.mobile.v1.zoneXBPM.app.base.BasePresenter
+import net.zoneland.x.bpm.mobile.v1.zoneXBPM.app.base.BaseView
+
+
+/**
+ * Created by fancyLou on 2020-05-25.
+ * Copyright © 2020 O2. All rights reserved.
+ */
+object O2InstantMessageContract {
+    interface View: BaseView {
+
+    }
+    interface Presenter: BasePresenter<View> {
+
+    }
+}

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

@@ -0,0 +1,13 @@
+package net.zoneland.x.bpm.mobile.v1.zoneXBPM.app.im
+
+import net.zoneland.x.bpm.mobile.v1.zoneXBPM.app.base.BasePresenterImpl
+
+
+/**
+ * Created by fancyLou on 2020-05-25.
+ * Copyright © 2020 O2. All rights reserved.
+ */
+
+class O2InstantMessagePresenter : BasePresenterImpl<O2InstantMessageContract.View>(), O2InstantMessageContract.Presenter  {
+
+}

+ 3 - 0
o2android/app/src/main/java/net/zoneland/x/bpm/mobile/v1/zoneXBPM/app/im/fm/O2IMConversationContract.kt

@@ -2,14 +2,17 @@ package net.zoneland.x.bpm.mobile.v1.zoneXBPM.app.im.fm
 
 import net.zoneland.x.bpm.mobile.v1.zoneXBPM.app.base.BasePresenter
 import net.zoneland.x.bpm.mobile.v1.zoneXBPM.app.base.BaseView
+import net.zoneland.x.bpm.mobile.v1.zoneXBPM.model.bo.api.InstantMessage
 import net.zoneland.x.bpm.mobile.v1.zoneXBPM.model.bo.api.im.IMConversationInfo
 
 object O2IMConversationContract {
     interface View: BaseView {
         fun myConversationList(list: List<IMConversationInfo>)
+        fun myInstantMessageList(instantList: List<InstantMessage>)
     }
 
     interface Presenter: BasePresenter<View> {
         fun getMyConversationList()
+        fun getMyInstantMessageList()
     }
 }

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

@@ -11,9 +11,11 @@ import net.zoneland.x.bpm.mobile.v1.zoneXBPM.R
 import net.zoneland.x.bpm.mobile.v1.zoneXBPM.app.base.BaseMVPViewPagerFragment
 import net.zoneland.x.bpm.mobile.v1.zoneXBPM.app.im.O2ChatActivity
 import net.zoneland.x.bpm.mobile.v1.zoneXBPM.app.im.O2IM
+import net.zoneland.x.bpm.mobile.v1.zoneXBPM.app.im.O2InstantMessageActivity
 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.core.component.api.APIAddressHelper
+import net.zoneland.x.bpm.mobile.v1.zoneXBPM.model.bo.api.InstantMessage
 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.IMMessage
 import net.zoneland.x.bpm.mobile.v1.zoneXBPM.model.bo.api.im.IMMessageBody
@@ -30,6 +32,7 @@ class O2IMConversationFragment : BaseMVPViewPagerFragment<O2IMConversationContra
     override var mPresenter: O2IMConversationContract.Presenter = O2IMConversationPresenter()
 
     override fun layoutResId(): Int = R.layout.fragment_o2_im_conversation
+    private val instantList = ArrayList<InstantMessage>()
     private val cList = ArrayList<IMConversationInfo>()
     private val adapter: CommonRecycleViewAdapter<IMConversationInfo> by lazy {
         object : CommonRecycleViewAdapter<IMConversationInfo>(activity, cList,
@@ -95,6 +98,11 @@ class O2IMConversationFragment : BaseMVPViewPagerFragment<O2IMConversationContra
         adapter.setOnItemClickListener { _, position ->
             O2ChatActivity.startChat(activity, cList[position].id)
         }
+        ll_o2_instant_message.setOnClickListener {
+            if (instantList.isNotEmpty()) {
+                O2InstantMessageActivity.openInstantActivity(instantList, activity)
+            }
+        }
     }
 
 
@@ -111,14 +119,29 @@ class O2IMConversationFragment : BaseMVPViewPagerFragment<O2IMConversationContra
     override fun myConversationList(list: List<IMConversationInfo>) {
         if (list.isEmpty()) {
             tv_null_conversation.visible()
-            rv_o2_im_conversation.gone()
+            ll_o2_im_message_list.gone()
         } else {
             tv_null_conversation.gone()
-            rv_o2_im_conversation.visible()
+            ll_o2_im_message_list.visible()
             cList.clear()
             cList.addAll(list)
             adapter.notifyDataSetChanged()
         }
+        mPresenter.getMyInstantMessageList()
+    }
+
+    override fun myInstantMessageList(instantList: List<InstantMessage>) {
+         if (instantList.isNotEmpty()) {
+             this.instantList.clear()
+             this.instantList.addAll(instantList)
+             ll_o2_instant_message.visible()
+             val lastMsg = instantList.last()
+             val lastTime = DateHelper.convertStringToDate(lastMsg.createTime)
+             tv_o2_in_con_last_message_time.text = DateHelper.friendlyTime(lastTime)
+             tv_o2_in_con_last_message.text = lastMsg.title
+         }else {
+             ll_o2_instant_message.gone()
+         }
     }
 
     fun receiveMessageFromWebsocket(message: IMMessage) {

+ 37 - 0
o2android/app/src/main/java/net/zoneland/x/bpm/mobile/v1/zoneXBPM/app/im/fm/O2IMConversationPresenter.kt

@@ -3,11 +3,46 @@ package net.zoneland.x.bpm.mobile.v1.zoneXBPM.app.im.fm
 import net.zoneland.x.bpm.mobile.v1.zoneXBPM.app.base.BasePresenterImpl
 import net.zoneland.x.bpm.mobile.v1.zoneXBPM.utils.XLog
 import net.zoneland.x.bpm.mobile.v1.zoneXBPM.utils.extension.o2Subscribe
+import rx.Observable
 import rx.android.schedulers.AndroidSchedulers
 import rx.schedulers.Schedulers
 
 class O2IMConversationPresenter : BasePresenterImpl<O2IMConversationContract.View>(), O2IMConversationContract.Presenter {
 
+
+
+    override fun getMyInstantMessageList() {
+        val service = getMessageCommunicateService(mView?.getContext())
+        service?.let { ser ->
+            ser.instantMessageList(100)
+                    .subscribeOn(Schedulers.io())
+                    .flatMap { res ->
+                        val list = res.data
+                        if (list != null && list.isNotEmpty()) {
+                            val newList = list.sortedBy { it.createTime }
+                            Observable.just(newList)
+                        }else {
+                            Observable.just(ArrayList())
+                        }
+                    }
+                    .observeOn(AndroidSchedulers.mainThread())
+                    .o2Subscribe {
+                        onNext { list->
+                            if (list != null) {
+                                mView?.myInstantMessageList(list)
+                            }else{
+                                mView?.myInstantMessageList(ArrayList())
+                            }
+                        }
+                        onError { e, _ ->
+                            XLog.error("", e)
+                            mView?.myInstantMessageList(ArrayList())
+                        }
+                    }
+
+        }
+    }
+
     override fun getMyConversationList() {
         val service = getMessageCommunicateService(mView?.getContext())
         service?.let {
@@ -29,4 +64,6 @@ class O2IMConversationPresenter : BasePresenterImpl<O2IMConversationContract.Vie
                     }
         }
     }
+
+
 }

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

@@ -373,7 +373,7 @@ class MainActivity : BaseMVPActivity<MainContract.View, MainContract.Presenter>(
             0 -> resetToolBar(getString(R.string.tab_message))
             1 -> resetToolBar(getString(R.string.tab_contact))
             2 -> setIndexToolBar()
-            3 -> resetToolBar(getString(R.string.tab_contact))
+            3 -> resetToolBar(getString(R.string.tab_app))
             4 -> resetToolBar(getString(R.string.tab_settings))
         }
 

+ 13 - 9
o2android/app/src/main/java/net/zoneland/x/bpm/mobile/v1/zoneXBPM/app/o2/organization/NewOrganizationPresenter.kt

@@ -1,17 +1,15 @@
 package net.zoneland.x.bpm.mobile.v1.zoneXBPM.app.o2.organization
 
 import net.muliba.accounting.app.ExceptionHandler
-import net.zoneland.x.bpm.mobile.v1.zoneXBPM.R
 import net.zoneland.x.bpm.mobile.v1.zoneXBPM.app.base.BasePresenterImpl
 import net.zoneland.x.bpm.mobile.v1.zoneXBPM.model.bo.api.ApiResponse
 import net.zoneland.x.bpm.mobile.v1.zoneXBPM.model.bo.api.main.identity.IdentityLevelForm
 import net.zoneland.x.bpm.mobile.v1.zoneXBPM.model.bo.api.main.person.PersonListLikeForm
-import net.zoneland.x.bpm.mobile.v1.zoneXBPM.model.bo.api.main.unit.UnitJson
-import net.zoneland.x.bpm.mobile.v1.zoneXBPM.model.vo.NewContactFragmentVO
 import net.zoneland.x.bpm.mobile.v1.zoneXBPM.model.vo.NewContactListVO
+import net.zoneland.x.bpm.mobile.v1.zoneXBPM.utils.XLog
+import net.zoneland.x.bpm.mobile.v1.zoneXBPM.utils.extension.o2Subscribe
 import rx.Observable
 import rx.android.schedulers.AndroidSchedulers
-import rx.functions.Action0
 import rx.functions.Action1
 import rx.schedulers.Schedulers
 
@@ -90,8 +88,7 @@ class NewOrganizationPresenter : BasePresenterImpl<NewOrganizationContract.View>
     }
 
     override fun searchPersonWithKey(result: String) {
-            val form = PersonListLikeForm( result)
-            val backResult = ArrayList<NewContactListVO>()
+            val form = PersonListLikeForm(result)
             getOrganizationAssembleControlApi(mView?.getContext())?.let { service ->
                 service.personListLike(form)
                         .subscribeOn(Schedulers.io())
@@ -99,6 +96,7 @@ class NewOrganizationPresenter : BasePresenterImpl<NewOrganizationContract.View>
                             val retList = ArrayList<NewContactListVO>()
                             val list = response.data
                             if (list != null && list.isNotEmpty()) {
+                                XLog.debug("size:${list.size}")
                                 list.map {
                                     retList.add(NewContactListVO.Identity(
                                             name = it.name,
@@ -110,9 +108,15 @@ class NewOrganizationPresenter : BasePresenterImpl<NewOrganizationContract.View>
                             retList
                         }
                         .observeOn(AndroidSchedulers.mainThread())
-                        .subscribe(Action1<ArrayList<NewContactListVO>> { list -> backResult.addAll(list) },
-                                ExceptionHandler(mView?.getContext()) { e -> mView?.backError(e.message ?: "") },
-                                Action0 { mView?.callbackResult(backResult) })
+                        .o2Subscribe {
+                            onNext {
+                                list -> mView?.callbackResult(list)
+                            }
+                            onError { e, _ ->
+                                XLog.error("", e)
+                                mView?.backError(e?.message ?: "")
+                            }
+                        }
             }
         }
 }

+ 1 - 0
o2android/app/src/main/res/layout/activity_login.xml

@@ -82,6 +82,7 @@
                             android:background="@null"
                             android:hint="@string/activity_login_username"
                             android:maxLines="1"
+                            android:singleLine="true"
                             android:textColor="@color/z_color_text_primary"
                             android:textColorHint="@color/z_color_text_hint"
                             android:textSize="13sp" />

+ 19 - 0
o2android/app/src/main/res/layout/activity_o2_instant_message.xml

@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="utf-8"?>
+<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
+    xmlns:tools="http://schemas.android.com/tools"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    tools:context=".app.im.O2InstantMessageActivity">
+
+    <include layout="@layout/snippet_appbarlayout_toolbar" />
+
+    <android.support.v7.widget.RecyclerView
+        android:id="@+id/rv_o2_instant_messages"
+        android:layout_width="match_parent"
+        android:layout_height="0dp"
+        app:layout_constraintStart_toStartOf="parent"
+        app:layout_constraintEnd_toEndOf="parent"
+        app:layout_constraintBottom_toBottomOf="parent"
+        app:layout_constraintTop_toBottomOf="@+id/app_bar_layout_snippet" />
+</android.support.constraint.ConstraintLayout>

+ 85 - 3
o2android/app/src/main/res/layout/fragment_o2_im_conversation.xml

@@ -1,5 +1,7 @@
 <?xml version="1.0" encoding="utf-8"?>
 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
+    xmlns:tools="http://schemas.android.com/tools"
     android:layout_width="match_parent"
     android:layout_height="match_parent"
     android:background="@color/z_color_background">
@@ -18,10 +20,90 @@
             android:textSize="16sp"
             android:visibility="gone"/>
 
-        <android.support.v7.widget.RecyclerView
-            android:id="@+id/rv_o2_im_conversation"
+        <LinearLayout
+            android:id="@+id/ll_o2_im_message_list"
             android:layout_width="match_parent"
-            android:layout_height="match_parent"/>
+            android:layout_height="match_parent"
+            android:orientation="vertical">
+
+            <LinearLayout
+                android:id="@+id/ll_o2_instant_message"
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:visibility="gone"
+                android:orientation="vertical">
+
+                <android.support.constraint.ConstraintLayout
+                    android:layout_width="match_parent"
+                    android:layout_height="wrap_content"
+                    android:layout_marginTop="@dimen/spacing_small">
+                    <net.zoneland.x.bpm.mobile.v1.zoneXBPM.widgets.CircleImageView
+                        android:id="@+id/image_o2_in_con_avatar"
+                        app:layout_constraintStart_toStartOf="parent"
+                        app:layout_constraintTop_toTopOf="parent"
+                        app:layout_constraintBottom_toBottomOf="parent"
+                        android:layout_marginStart="@dimen/spacing_small"
+                        android:layout_width="@dimen/item_head_icon_size"
+                        android:layout_height="@dimen/item_head_icon_size"
+                        android:scaleType="fitXY"
+                        android:src="@mipmap/icon_msg"/>
+
+                    <TextView
+                        android:id="@+id/tv_o2_in_con_title"
+                        android:layout_width="wrap_content"
+                        android:layout_height="wrap_content"
+                        android:textSize="14sp"
+                        android:textColor="@color/z_color_text_primary"
+                        android:textAlignment="textStart"
+                        app:layout_constraintTop_toTopOf="parent"
+                        app:layout_constraintStart_toEndOf="@+id/image_o2_in_con_avatar"
+                        android:layout_marginStart="@dimen/spacing_small"
+                        android:text="通知消息"/>
+
+                    <TextView
+                        android:id="@+id/tv_o2_in_con_last_message"
+                        android:layout_width="wrap_content"
+                        android:layout_height="wrap_content"
+                        android:textSize="12sp"
+                        android:textColor="@color/z_color_text_hint"
+                        android:textAlignment="textStart"
+                        app:layout_constraintTop_toBottomOf="@+id/tv_o2_in_con_title"
+                        app:layout_constraintStart_toEndOf="@+id/image_o2_in_con_avatar"
+                        android:layout_marginStart="@dimen/spacing_small"
+                        android:layout_marginTop="@dimen/spacing_tiny"
+                        tools:text="消息" />
+
+
+
+                    <TextView
+                        android:id="@+id/tv_o2_in_con_last_message_time"
+                        android:layout_width="wrap_content"
+                        android:layout_height="wrap_content"
+                        android:textSize="14sp"
+                        android:textColor="@color/z_color_text_hint"
+                        android:textAlignment="textEnd"
+                        app:layout_constraintTop_toTopOf="parent"
+                        app:layout_constraintEnd_toEndOf="parent"
+                        android:layout_marginEnd="@dimen/spacing_small"
+                        tools:text="9:10" />
+
+
+                </android.support.constraint.ConstraintLayout>
+                <View
+                    android:layout_width="match_parent"
+                    android:layout_height="1px"
+                    android:background="@color/z_color_split_meeting_line"
+                    android:layout_marginStart="60dp"
+                    android:layout_marginTop="@dimen/spacing_small"/>
+            </LinearLayout>
+
+            <android.support.v7.widget.RecyclerView
+                android:id="@+id/rv_o2_im_conversation"
+                android:layout_width="match_parent"
+                android:layout_height="0dp"
+                android:layout_weight="1"/>
+        </LinearLayout>
+
 
     </FrameLayout>
 </RelativeLayout>

+ 2 - 1
o2android/build.gradle

@@ -37,7 +37,8 @@ allprojects {
         maven {
             url "https://oss.sonatype.org/content/repositories/snapshots/"
         }
-        maven { url "http://mvn.zoneland.net/nexus/content/repositories/land_repo/" }
+//        maven { url "http://mvn.zoneland.net/nexus/content/repositories/land_repo/" }
+        maven { url "http://maven.o2oa.net/repository/maven-public/" }
     }
 
 }

+ 24 - 2
o2android/o2_auth_sdk/src/main/java/net/zoneland/x/bpm/mobile/v1/zoneXBPM/core/component/api/O2Interceptor.kt

@@ -1,18 +1,31 @@
 package net.zoneland.x.bpm.mobile.v1.zoneXBPM.core.component.api
 
 import android.text.TextUtils
+import android.util.Log
 import net.zoneland.x.bpm.mobile.v1.zoneXBPM.O2
 import net.zoneland.x.bpm.mobile.v1.zoneXBPM.O2SDKManager
 import okhttp3.Interceptor
 import okhttp3.Response
+import retrofit2.adapter.rxjava.Result.response
+import android.R.string
+import retrofit2.adapter.rxjava.Result.response
+
+
+
+
 
 /**
  * Created by fancy on 2017/6/5.
  */
 
 class O2Interceptor : Interceptor {
+    val TAG = "O2Interceptor"
     override fun intercept(chain: Interceptor.Chain): Response {
         val original = chain.request()
+//        Log.d(TAG,"\n")
+//        Log.d(TAG,"----------Start----------------")
+//        Log.d(TAG, "| $original")
+
         val originalHttpUrl = original.url()
         val url = originalHttpUrl.newBuilder().addQueryParameter("o", (Math.random()*100).toString()).build()
         val xToken = O2SDKManager.instance().zToken
@@ -20,10 +33,19 @@ class O2Interceptor : Interceptor {
         if (!TextUtils.isEmpty(xToken)) {
             requestBuilder.addHeader("x-token", xToken)
         }
-//        XLog.debug("url: $url")
+//        Log.d(TAG, "url: $url")
         val request = requestBuilder.addHeader("x-client", O2.DEVICE_TYPE)
                 .method(original.method(), original.body())
                 .url(url).build()
-        return chain.proceed(request)
+
+        val response = chain.proceed(request)
+        val mediaType = response.body()?.contentType()
+        val content = response.body()?.string()
+//        Log.d(TAG, "| Response:$content")
+//        return chain.proceed(request)
+
+        return response.newBuilder()
+                .body(okhttp3.ResponseBody.create(mediaType, content ?: ""))
+                .build()
     }
 }

+ 10 - 0
o2android/o2_auth_sdk/src/main/java/net/zoneland/x/bpm/mobile/v1/zoneXBPM/core/component/api/service/MessageCommunicateService.kt

@@ -2,6 +2,8 @@ package net.zoneland.x.bpm.mobile.v1.zoneXBPM.core.component.api.service
 
 import net.zoneland.x.bpm.mobile.v1.zoneXBPM.model.bo.api.ApiResponse
 import net.zoneland.x.bpm.mobile.v1.zoneXBPM.model.bo.api.IdData
+import net.zoneland.x.bpm.mobile.v1.zoneXBPM.model.bo.api.InstantMessage
+import net.zoneland.x.bpm.mobile.v1.zoneXBPM.model.bo.api.InstantMessageData
 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.IMMessage
 import net.zoneland.x.bpm.mobile.v1.zoneXBPM.model.bo.api.im.IMMessageForm
@@ -59,4 +61,12 @@ interface MessageCommunicateService {
     fun messageByPage(@Path("page")page: Int,  @Path("size") size: Int, @Body conversation: IMMessageForm) :
             Observable<ApiResponse<List<IMMessage>>>
 
+
+    /**
+     * 个人消息 排除IM消息
+     *  列表
+     */
+    @GET("jaxrs/instant/list/currentperson/noim/count/{count}/desc")
+    fun instantMessageList(@Path("count") count: Int) : Observable<ApiResponse<List<InstantMessage>>>
+
 }

+ 56 - 0
o2android/o2_auth_sdk/src/main/java/net/zoneland/x/bpm/mobile/v1/zoneXBPM/model/bo/api/InstantMessage.kt

@@ -0,0 +1,56 @@
+package net.zoneland.x.bpm.mobile.v1.zoneXBPM.model.bo.api
+
+import android.os.Parcel
+import android.os.Parcelable
+
+
+/**
+ * Created by fancyLou on 2020-05-25.
+ * Copyright © 2020 O2. All rights reserved.
+ */
+
+data class InstantMessage(
+        var id: String = "",
+        var title: String = "",
+        var type: String = "",
+        var body: String = "",
+        var person: String = "",
+        var consumerList: ArrayList<String> = ArrayList(),
+        var consumed: Boolean = false,
+        var createTime: String = "",
+        var updateTime: String = ""
+) : Parcelable {
+    constructor(source: Parcel) : this(
+            source.readString(),
+            source.readString(),
+            source.readString(),
+            source.readString(),
+            source.readString(),
+            source.createStringArrayList(),
+            1 == source.readInt(),
+            source.readString(),
+            source.readString()
+    )
+
+    override fun describeContents() = 0
+
+    override fun writeToParcel(dest: Parcel, flags: Int) = with(dest) {
+        writeString(id)
+        writeString(title)
+        writeString(type)
+        writeString(body)
+        writeString(person)
+        writeStringList(consumerList)
+        writeInt((if (consumed) 1 else 0))
+        writeString(createTime)
+        writeString(updateTime)
+    }
+
+    companion object {
+        @JvmField
+        val CREATOR: Parcelable.Creator<InstantMessage> = object : Parcelable.Creator<InstantMessage> {
+            override fun createFromParcel(source: Parcel): InstantMessage = InstantMessage(source)
+            override fun newArray(size: Int): Array<InstantMessage?> = arrayOfNulls(size)
+        }
+    }
+}

+ 22 - 0
o2android/o2_auth_sdk/src/main/java/net/zoneland/x/bpm/mobile/v1/zoneXBPM/model/bo/api/InstantMessageData.kt

@@ -0,0 +1,22 @@
+package net.zoneland.x.bpm.mobile.v1.zoneXBPM.model.bo.api
+
+import android.os.Parcel
+import android.os.Parcelable
+
+
+/**
+ * Created by fancyLou on 2020-05-25.
+ * Copyright © 2020 O2. All rights reserved.
+ */
+
+data class InstantMessageData(
+        var id: String = "",
+        var title: String = "",
+        var type: String = "",
+        var body: String = "",
+        var person: String = "",
+        var consumerList: ArrayList<String> = ArrayList(),
+        var consumed: Boolean = false,
+        var createTime: String = "",
+        var updateTime: String = ""
+)