Преглед изворни кода

IM添加群名、群成员修改

fancy пре 5 година
родитељ
комит
f2a4d8832b

+ 1 - 1
o2android/app/src/main/java/net/zoneland/x/bpm/mobile/v1/zoneXBPM/app/calendar/vm/CalendarViewModel.kt

@@ -48,7 +48,7 @@ class CalendarViewModel(app: Application) : BaseO2ViewModel(app) {
                         onNext { list ->
                             groups.value = list
                         }
-                        onError { e, isNetworkError ->
+                        onError { e, _ ->
                             XLog.error("我的日历查询异常", e)
                             groups.value = null
                         }

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

@@ -15,10 +15,9 @@ import android.support.v7.widget.LinearLayoutManager
 import android.text.Editable
 import android.text.TextUtils
 import android.text.TextWatcher
-import android.view.MotionEvent
-import android.view.View
-import android.view.WindowManager
+import android.view.*
 import android.view.inputmethod.InputMethodManager
+import android.widget.EditText
 import com.wugang.activityresult.library.ActivityResult
 import com.zlw.main.recorderlib.RecordManager
 import com.zlw.main.recorderlib.recorder.RecordConfig
@@ -29,14 +28,18 @@ import net.muliba.fancyfilepickerlibrary.PicturePicker
 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.app.o2.organization.ContactPickerActivity
 import net.zoneland.x.bpm.mobile.v1.zoneXBPM.app.o2.webview.LocalImageViewActivity
 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.*
+import net.zoneland.x.bpm.mobile.v1.zoneXBPM.model.vo.ContactPickerResult
 import net.zoneland.x.bpm.mobile.v1.zoneXBPM.utils.*
 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.visible
+import net.zoneland.x.bpm.mobile.v1.zoneXBPM.widgets.dialog.O2DialogSupport
+import org.jetbrains.anko.find
 import java.io.File
 import java.util.*
 import kotlin.math.abs
@@ -113,6 +116,9 @@ class O2ChatActivity : BaseMVPActivity<O2ChatContract.View, O2ChatContract.Prese
     private val cameraImageUri: Uri by lazy { FileUtil.getUriFromFile(this, File(FileExtensionHelper.getCameraCacheFilePath())) }
     private val camera_result_code = 10240
 
+    //是否能修改群名 群成员
+    private var canUpdate = false
+
 
 
 
@@ -182,6 +188,64 @@ class O2ChatActivity : BaseMVPActivity<O2ChatContract.View, O2ChatContract.Prese
     }
 
 
+    override fun onPrepareOptionsMenu(menu: Menu?): Boolean {
+        menu?.clear()
+        if (canUpdate) {
+            menuInflater.inflate(R.menu.menu_chat, menu)
+        }
+        return super.onPrepareOptionsMenu(menu)
+    }
+
+    override fun onOptionsItemSelected(item: MenuItem?): Boolean {
+        when(item?.itemId) {
+            R.id.menu_chat_update_title -> {
+                updateTitle()
+                return true
+            }
+            R.id.menu_chat_update_member -> {
+                updateMembers()
+                return true
+            }
+        }
+        return super.onOptionsItemSelected(item)
+    }
+
+    private fun updateTitle() {
+        val dialog = O2DialogSupport.openCustomViewDialog(this, "修改群名", R.layout.dialog_name_modify) { dialog ->
+            val text = dialog.findViewById<EditText>(R.id.dialog_name_editText_id)
+            val content = text.text.toString()
+            dialog.dismiss()
+            if (TextUtils.isEmpty(content)) {
+                XToast.toastShort(this@O2ChatActivity, "群名不能为空!")
+            } else {
+                showLoadingDialog()
+                mPresenter.updateConversationTitle(conversationId, content)
+            }
+        }
+        val edit = dialog.findViewById<EditText>(R.id.dialog_name_editText_id)
+        edit.hint = "请输入群名!"
+    }
+
+    private fun updateMembers() {
+        val users = conversationInfo?.personList ?: ArrayList<String>()
+        ActivityResult.of(this)
+                .className(ContactPickerActivity::class.java)
+                .params(ContactPickerActivity.startPickerBundle(pickerModes = arrayListOf(ContactPickerActivity.personPicker), multiple = true, initUserList = users))
+                .greenChannel().forResult { _, data ->
+                    val result = data?.getParcelableExtra<ContactPickerResult>(ContactPickerActivity.CONTACT_PICKED_RESULT)
+                    if (result != null && result.users.isNotEmpty()) {
+                        val a = arrayListOf<String>()
+                        a.addAll(result.users.map { it.distinguishedName })
+                        if (!a.any { it == O2SDKManager.instance().distinguishedName }) {
+                            a.add(O2SDKManager.instance().distinguishedName)
+                        }
+                        showLoadingDialog()
+                        mPresenter.updateConversationPeople(conversationId, a)
+                    }else {
+                        XLog.debug("没有选择人员!!!!")
+                    }
+                }
+    }
 
 
     override fun onDestroy() {
@@ -244,8 +308,24 @@ class O2ChatActivity : BaseMVPActivity<O2ChatContract.View, O2ChatContract.Prese
         return false
     }
 
+    override fun updateSuccess(info: IMConversationInfo) {
+        hideLoadingDialog()
+        this.conversationInfo?.title = info.title
+        updateToolbarTitle(info.title)
+        this.conversationInfo?.personList = info.personList
+    }
+
+    override fun updateFail(msg: String) {
+        hideLoadingDialog()
+        XToast.toastShort(this, msg)
+    }
+
     override fun conversationInfo(info: IMConversationInfo) {
         conversationInfo = info
+        if (conversationInfo?.adminPerson == O2SDKManager.instance().distinguishedName) {
+            canUpdate = true
+            invalidateOptionsMenu()
+        }
         //
         var title = defaultTitle
         if (O2IM.conversation_type_single == conversationInfo?.type) {
@@ -540,6 +620,7 @@ class O2ChatActivity : BaseMVPActivity<O2ChatContract.View, O2ChatContract.Prese
      * 获取消息数据
      */
     private fun getPageData() {
+        mPresenter.getConversation(conversationId)
         mPresenter.getMessage(page + 1, conversationId)
         //更新阅读时间
         mPresenter.readConversation(conversationId)

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

@@ -16,6 +16,8 @@ object O2ChatContract  {
         fun conversationGetFail()
         fun localFile(filePath: String, msgType: String, position: Int)
         fun downloadFileFail(msg: String)
+        fun updateSuccess(info: IMConversationInfo)
+        fun updateFail(msg: String)
     }
     interface Presenter: BasePresenter<View> {
         fun sendIMMessage(msg: IMMessage)
@@ -23,5 +25,7 @@ object O2ChatContract  {
         fun readConversation(conversationId: String)
         fun getConversation(id: String)
         fun getFileFromNetOrLocal(position: Int, body: IMMessageBody)
+        fun updateConversationTitle(id: String, title: String)
+        fun updateConversationPeople(id: String, users: ArrayList<String>)
     }
 }

+ 56 - 4
o2android/app/src/main/java/net/zoneland/x/bpm/mobile/v1/zoneXBPM/app/im/O2ChatPresenter.kt

@@ -6,10 +6,7 @@ import net.zoneland.x.bpm.mobile.v1.zoneXBPM.O2SDKManager
 import net.zoneland.x.bpm.mobile.v1.zoneXBPM.app.base.BasePresenterImpl
 import net.zoneland.x.bpm.mobile.v1.zoneXBPM.core.component.api.APIAddressHelper
 import net.zoneland.x.bpm.mobile.v1.zoneXBPM.core.component.api.RetrofitClient
-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.model.bo.api.im.IMMessageForm
-import net.zoneland.x.bpm.mobile.v1.zoneXBPM.model.bo.api.im.MessageType
+import net.zoneland.x.bpm.mobile.v1.zoneXBPM.model.bo.api.im.*
 import net.zoneland.x.bpm.mobile.v1.zoneXBPM.utils.FileExtensionHelper
 import net.zoneland.x.bpm.mobile.v1.zoneXBPM.utils.FileUtil
 import net.zoneland.x.bpm.mobile.v1.zoneXBPM.utils.O2FileDownloadHelper
@@ -47,6 +44,61 @@ class O2ChatPresenter : BasePresenterImpl<O2ChatContract.View>(), O2ChatContract
                 }
     }
 
+    override fun updateConversationTitle(id: String, title: String) {
+        if (id.isEmpty() || title.isEmpty()) {
+            mView?.updateFail("参数不正确,无法修改")
+            return
+        }
+        val service = getMessageCommunicateService(mView?.getContext())
+        val form = IMConversationUpdateForm()
+        form.id = id
+        form.title = title
+        service?.updateConversation(form)
+                ?.subscribeOn(Schedulers.io())
+                ?.observeOn(AndroidSchedulers.mainThread())
+                ?.o2Subscribe {
+                    onNext {
+                        if (it.data != null) {
+                            mView?.updateSuccess(it.data)
+                        } else {
+                            mView?.updateFail("修改失败!")
+                        }
+                    }
+                    onError { e, _ ->
+                        XLog.error("", e)
+                        mView?.updateFail("修改失败!")
+                    }
+                }
+
+    }
+
+    override fun updateConversationPeople(id: String, users: ArrayList<String>) {
+        if (id.isEmpty() || users.isEmpty()) {
+            mView?.updateFail("参数不正确,无法修改")
+            return
+        }
+        val service = getMessageCommunicateService(mView?.getContext())
+        val form = IMConversationUpdateForm()
+        form.id = id
+        form.personList = users
+        service?.updateConversation(form)
+                ?.subscribeOn(Schedulers.io())
+                ?.observeOn(AndroidSchedulers.mainThread())
+                ?.o2Subscribe {
+                    onNext {
+                        if (it.data != null) {
+                            mView?.updateSuccess(it.data)
+                        } else {
+                            mView?.updateFail("修改失败!")
+                        }
+                    }
+                    onError { e, _ ->
+                        XLog.error("", e)
+                        mView?.updateFail("修改失败!")
+                    }
+                }
+    }
+
     override fun sendIMMessage(msg: IMMessage) {
         val service = getMessageCommunicateService(mView?.getContext())
         //audio 和 image 需要先上传文件 然后发送消息

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

@@ -118,6 +118,7 @@ class O2IMConversationFragment : BaseMVPViewPagerFragment<O2IMConversationContra
 
 
     override fun lazyLoad() {
+        XLog.debug("lazy load im conversation。。。。。。。。。。")
         mPresenter.getMyConversationList()
     }
 

+ 12 - 1
o2android/app/src/main/res/layout/fragment_o2_im_conversation.xml

@@ -52,11 +52,17 @@
                         android:id="@+id/tv_o2_in_con_title"
                         android:layout_width="wrap_content"
                         android:layout_height="wrap_content"
+                        android:maxWidth="250dp"
                         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"
+                        app:layout_constraintEnd_toEndOf="parent"
+                        app:layout_constraintHorizontal_bias="0.0"
+                        android:layout_marginEnd="40dp"
+                        android:singleLine="true"
+                        android:ellipsize="end"
                         android:layout_marginStart="@dimen/spacing_small"
                         android:text="通知消息"/>
 
@@ -67,11 +73,16 @@
                         android:textSize="12sp"
                         android:textColor="@color/z_color_text_hint"
                         android:textAlignment="textStart"
+                        android:ellipsize="end"
+                        android:maxWidth="200dp"
+                        android:singleLine="true"
                         app:layout_constraintTop_toBottomOf="@+id/tv_o2_in_con_title"
                         app:layout_constraintStart_toEndOf="@+id/image_o2_in_con_avatar"
+                        app:layout_constraintEnd_toEndOf="parent"
+                        app:layout_constraintHorizontal_bias="0.0"
                         android:layout_marginStart="@dimen/spacing_small"
                         android:layout_marginTop="@dimen/spacing_tiny"
-                        tools:text="消息" />
+                        tools:text="消息消息消息消息消息消息消息" />
 
 
 

+ 19 - 8
o2android/app/src/main/res/layout/item_o2_im_conversation.xml

@@ -22,27 +22,38 @@
             android:id="@+id/tv_o2_im_con_title"
             android:layout_width="wrap_content"
             android:layout_height="wrap_content"
+            android:maxWidth="250dp"
             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_im_con_avatar"
+            app:layout_constraintEnd_toEndOf="parent"
+            app:layout_constraintHorizontal_bias="0.0"
             android:layout_marginStart="@dimen/spacing_small"
-            tools:text="FancyLou"/>
+            android:layout_marginEnd="40dp"
+            android:singleLine="true"
+            android:ellipsize="end"
+            tools:text="韩飞鸿、汤笑蕾、汤笑蕾、汤笑蕾、汤笑蕾、汤笑蕾、汤笑蕾、汤笑蕾、汤笑蕾、汤笑蕾、汤笑蕾、汤笑蕾、汤笑蕾、"/>
 
         <TextView
             android:id="@+id/tv_o2_im_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_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:layout_marginTop="4dp"
+            android:ellipsize="end"
+            android:maxWidth="200dp"
+            android:singleLine="true"
+            android:textAlignment="textStart"
+            android:textColor="@color/z_color_text_hint"
+            android:textSize="12sp"
             android:visibility="gone"
-            tools:text="消息" />
+            app:layout_constraintEnd_toEndOf="parent"
+            app:layout_constraintHorizontal_bias="0.0"
+            app:layout_constraintStart_toEndOf="@+id/image_o2_im_con_avatar"
+            app:layout_constraintTop_toBottomOf="@+id/tv_o2_im_con_title"
+            tools:text="消息消息消息消息消息消息消息消息消息消息消息消息消息消息消息消息消息消息消息消息消息" />
 
         <ImageView
             android:id="@+id/tv_o2_im_con_last_message_emoji"

+ 11 - 6
o2android/app/src/main/res/menu/menu_chat.xml

@@ -1,13 +1,18 @@
 <menu 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"
-    tools:context=".app.main.activity.ChatActivity">
+    tools:context=".app.im.O2ChatActivity">
 
-    <item android:id="@+id/menu_chat_person_info"
-        app:showAsAction="ifRoom"
+<!--    <item android:id="@+id/menu_chat_person_info"-->
+<!--        app:showAsAction="ifRoom"-->
+<!--        android:orderInCategory="90"-->
+<!--        android:icon="@mipmap/icon_menu_account_circle"-->
+<!--        android:title="@string/person_info"/>-->
+    <item android:id="@+id/menu_chat_update_title"
         android:orderInCategory="90"
-        android:icon="@mipmap/icon_menu_account_circle"
-        android:title="@string/person_info"/>
-
+        android:title="@string/menu_im_tribe_name_update"/>
+    <item android:id="@+id/menu_chat_update_member"
+        android:orderInCategory="90"
+        android:title="@string/menu_im_tribe_member_update"/>
 
 </menu>

+ 2 - 0
o2android/app/src/main/res/values/strings.xml

@@ -218,6 +218,8 @@
     <string name="activity_im_audio_speak">按住说话</string>
     <string name="activity_im_audio_speak_cancel">上滑取消发送</string>
     <string name="activity_location_send">发送</string>
+    <string name="menu_im_tribe_name_update">修改群名</string>
+    <string name="menu_im_tribe_member_update">修改成员</string>
 
     <!-- myinfo activity -->
     <string name="title_activity_my_info">我的资料</string>

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

@@ -1,13 +1,7 @@
 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.IMMessageFileData
-import net.zoneland.x.bpm.mobile.v1.zoneXBPM.model.bo.api.im.IMMessageForm
+import net.zoneland.x.bpm.mobile.v1.zoneXBPM.model.bo.api.*
+import net.zoneland.x.bpm.mobile.v1.zoneXBPM.model.bo.api.im.*
 import okhttp3.MultipartBody
 import okhttp3.ResponseBody
 import retrofit2.Call
@@ -28,6 +22,12 @@ interface MessageCommunicateService {
     @POST("jaxrs/im/conversation")
     fun createConversation(@Body info: IMConversationInfo): Observable<ApiResponse<IMConversationInfo>>
 
+    /**
+     * 更新会话
+     */
+    @Headers("Content-Type:application/json;charset=UTF-8")
+    @PUT("jaxrs/im/conversation")
+    fun updateConversation(@Body form: IMConversationUpdateForm) : Observable<ApiResponse<IMConversationInfo>>
 
     /**
      * 获取会话信息

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

@@ -0,0 +1,10 @@
+package net.zoneland.x.bpm.mobile.v1.zoneXBPM.model.bo.api.im
+
+
+data class IMConversationUpdateForm (
+        var id: String? = null,
+        var personList: ArrayList<String> = ArrayList(),
+        var title: String = "",
+        var adminPerson: String? = null,
+        var note: String? = null
+)