Browse Source

新增加视频留言功能

weizhengliang 7 months ago
parent
commit
aed6625811
25 changed files with 741 additions and 276 deletions
  1. 245 6
      android_host/src/main/java/com/wdkl/ncs/android/component/nursehome/activity/CreateMessageActivity.kt
  2. 1 1
      android_host/src/main/java/com/wdkl/ncs/android/component/nursehome/adapter/CreatorAdapter.java
  3. 17 7
      android_host/src/main/java/com/wdkl/ncs/android/component/nursehome/adapter/MessageAdapter.kt
  4. 6 1
      android_host/src/main/java/com/wdkl/ncs/android/component/nursehome/fragment/MessageFragment.kt
  5. 42 3
      android_host/src/main/java/com/wdkl/ncs/android/component/nursehome/util/MessageDialogHelper.java
  6. 3 3
      android_host/src/main/res/layout/adapter_message_item.xml
  7. 2 2
      android_host/src/main/res/layout/creator_item.xml
  8. 47 55
      android_host/src/main/res/layout/fragment_message.xml
  9. 220 163
      android_host/src/main/res/layout/message_create_dialog_activity.xml
  10. 60 25
      android_host/src/main/res/layout/message_dialog.xml
  11. 7 0
      android_host/src/main/res/values-es/strings.xml
  12. 8 0
      android_host/src/main/res/values-pt/strings.xml
  13. 7 0
      android_host/src/main/res/values-ru/strings.xml
  14. 8 0
      android_host/src/main/res/values-zh/strings.xml
  15. 7 0
      android_host/src/main/res/values/strings.xml
  16. 12 8
      middleware/src/main/code/com/wdkl/ncs/android/middleware/helper/RecordHelper.java
  17. 4 0
      middleware/src/main/code/com/wdkl/ncs/android/middleware/logic/contract/nursehome/MessageContract.kt
  18. 25 0
      middleware/src/main/code/com/wdkl/ncs/android/middleware/logic/presenter/nursehome/MessagePresenter.kt
  19. 5 0
      resource/src/main/res/drawable/ic_movies.xml
  20. 5 0
      resource/src/main/res/drawable/ic_video_record.xml
  21. 6 0
      resource/src/main/res/drawable/ic_video_stop.xml
  22. 1 2
      resource/src/main/res/drawable/shape_advice_bg2.xml
  23. 1 0
      resource/src/main/res/values-es/strings.xml
  24. 1 0
      resource/src/main/res/values-ru/strings.xml
  25. 1 0
      resource/src/main/res/values/strings.xml

+ 245 - 6
android_host/src/main/java/com/wdkl/ncs/android/component/nursehome/activity/CreateMessageActivity.kt

@@ -2,11 +2,17 @@ package com.wdkl.ncs.android.component.nursehome.activity
 
 import android.annotation.SuppressLint
 import android.graphics.Color
+import android.hardware.Camera
+import android.media.CamcorderProfile
+import android.media.MediaRecorder
+import android.os.Build
 import android.os.Bundle
+import android.os.CountDownTimer
 import android.os.SystemClock
 import android.text.TextUtils
 import android.util.Log
 import android.view.MotionEvent
+import android.view.SurfaceHolder
 import android.view.View
 import android.view.WindowManager
 import android.widget.AdapterView
@@ -15,7 +21,6 @@ import com.wdkl.ncs.android.component.nursehome.R
 import com.wdkl.ncs.android.component.nursehome.adapter.CreatorAdapter
 import com.wdkl.ncs.android.component.nursehome.databinding.MessageCreateDialogActivityBinding
 import com.wdkl.ncs.android.component.nursehome.launch.NurseHomeLaunch
-import com.wdkl.ncs.android.component.nursehome.settingconfig.SettingConfig
 import com.wdkl.ncs.android.component.nursehome.util.MediaPlayHelper
 import com.wdkl.ncs.android.component.nursehome.util.RingPlayHelper
 import com.wdkl.ncs.android.component.nursehome.util.SpeechUtil
@@ -26,9 +31,11 @@ import com.wdkl.ncs.android.middleware.common.MessageEvent
 import com.wdkl.ncs.android.middleware.helper.RecordHelper
 import com.wdkl.ncs.android.middleware.logic.contract.nursehome.MessageContract
 import com.wdkl.ncs.android.middleware.logic.presenter.nursehome.MessagePresenter
+import com.wdkl.ncs.android.middleware.model.bean.SettingConfiguration
 import com.wdkl.ncs.android.middleware.model.dos.ClerkDO
 import com.wdkl.ncs.android.middleware.model.dos.RemarkDO
 import com.wdkl.ncs.android.middleware.model.vo.RemarksVO
+import com.wdkl.ncs.android.middleware.tcp.channel.DeviceChannel
 import com.wdkl.ncs.android.middleware.utils.CommonUtils
 import com.wdkl.ncs.android.middleware.utils.ScreenUtils
 import kotlinx.android.synthetic.main.message_create_dialog_activity.*
@@ -46,6 +53,7 @@ class CreateMessageActivity : BaseActivity<MessagePresenter, MessageCreateDialog
 
     private var messageType = 2  //1--用户备注,2--便签留言,3--语音留言
     private var voiceMsgPath = ""
+    private var videoMsgPath = ""
 
     var downTime : Long = 0
     var upTime : Long = 0
@@ -56,6 +64,14 @@ class CreateMessageActivity : BaseActivity<MessagePresenter, MessageCreateDialog
     var creatorAdapter: CreatorAdapter? = null
     var selectClerk: String? = ""
 
+    var mediaRecorder: MediaRecorder? = null
+    var camera: Camera? = null
+    var videoFileName: String? = null
+    var recording = false
+    var previewStart = false
+
+    lateinit var countDownTimer: CountDownTimer
+
     override fun getLayId(): Int {
         return R.layout.message_create_dialog_activity
     }
@@ -78,18 +94,66 @@ class CreateMessageActivity : BaseActivity<MessagePresenter, MessageCreateDialog
         setFinishOnTouchOutside(false)
         RecordHelper.getInstance().init()
 
+        if (!Constant.supportCamera) {
+            radio_video_msg.visibility = View.GONE
+        }
+        videoFileName = RecordHelper.getInstance().videoFilePath
+
         radio_text_msg.isChecked = true
-        if (group_message_type.checkedRadioButtonId == R.id.radio_voice_msg) {
+        if (group_message_type.checkedRadioButtonId == R.id.radio_video_msg) {
+            //视频
+            messageType = 4
+            edit_text_message.visibility = View.GONE
+            ll_voice_message.visibility = View.GONE
+            ll_video_record.visibility = View.VISIBLE
+        } else if (group_message_type.checkedRadioButtonId == R.id.radio_voice_msg) {
             //语音
             messageType = 3
             edit_text_message.visibility = View.GONE
             ll_voice_message.visibility = View.VISIBLE
+            ll_video_record.visibility = View.GONE
         } else {
             //文本
             messageType = 2
             edit_text_message.visibility = View.VISIBLE
             ll_voice_message.visibility = View.GONE
+            ll_video_record.visibility = View.GONE
+        }
+
+        countDownTimer = object: CountDownTimer(60000L, 1000) {
+            override fun onTick(millisUntilFinished: Long) {
+                runOnUiThread {
+                    val seconds = (millisUntilFinished / 1000) % 60
+                    tv_record_time.text = String.format("%02d", seconds)
+                }
+            }
+
+            override fun onFinish() {
+                //录制时间到
+                Log.d(TAG, "recording video time is up")
+                runOnUiThread {
+                    showMessage("Time is up!")
+                    tv_record_time.text = "00"
+                    if (recording) {
+                        radio_text_msg.isEnabled = true
+                        radio_voice_msg.isEnabled = true
+                        btn_video_upload.isEnabled = true
+
+                        mediaRecorder?.stop()
+                        releaseMediaRecorder()
+                        camera?.lock()
+                        btn_video_record.setText(R.string.str_video_record)
+                        recording = false
+                        if (camera != null) {
+                            camera?.stopPreview()
+                            camera?.release()
+                            camera = null
+                        }
+                    }
+                }
+            }
         }
+        btn_video_upload.isEnabled = false
 
         if (Constant.PART_ID != -1) {
             presenter.loadClerks(Constant.PART_ID)
@@ -127,6 +191,14 @@ class CreateMessageActivity : BaseActivity<MessagePresenter, MessageCreateDialog
                     remark.content = getString(R.string.voice_message)
                     remark.filePath = voiceMsgPath
                 }
+            } else if (messageType == 4) {
+                if (TextUtils.isEmpty(videoMsgPath)) {
+                    showMessage(R.string.str_video_message_invalid)
+                    return@setOnClickListener
+                } else {
+                    remark.content = getString(R.string.video_message)
+                    remark.filePath = videoMsgPath
+                }
             }
 
             presenter.addNewMessage(remark)
@@ -141,16 +213,29 @@ class CreateMessageActivity : BaseActivity<MessagePresenter, MessageCreateDialog
             //收起软键盘
             CommonUtils.hideInputKeyboard(activity.window.decorView.windowToken)
 
-            if (checkedId == R.id.radio_voice_msg) {
+            if (checkedId == R.id.radio_video_msg) {
+                //视频
+                messageType = 4
+                edit_text_message.visibility = View.GONE
+                ll_voice_message.visibility = View.GONE
+                ll_video_record.visibility = View.VISIBLE
+
+                //相机预览
+                if (!previewStart) {
+                    previewCamera()
+                }
+            } else if (checkedId == R.id.radio_voice_msg) {
                 //语音
                 messageType = 3
                 edit_text_message.visibility = View.GONE
                 ll_voice_message.visibility = View.VISIBLE
+                ll_video_record.visibility = View.GONE
             } else {
                 //文本
                 messageType = 2
                 edit_text_message.visibility = View.VISIBLE
                 ll_voice_message.visibility = View.GONE
+                ll_video_record.visibility = View.GONE
             }
         }
 
@@ -173,7 +258,7 @@ class CreateMessageActivity : BaseActivity<MessagePresenter, MessageCreateDialog
                     tv_voice_record.setText(R.string.str_voice_msg_btn_title)
                     voice_record_timer.base = SystemClock.elapsedRealtime()
                     voice_record_timer.start()
-                    voiceFile = RecordHelper.getInstance().audiofilePath
+                    voiceFile = RecordHelper.getInstance().audioFilePath
 
                     //按下时保持常亮
                     //wakeLock.acquire()
@@ -217,6 +302,147 @@ class CreateMessageActivity : BaseActivity<MessagePresenter, MessageCreateDialog
 
             return@setOnTouchListener false
         }
+
+        //视频留影
+        btn_video_record.setOnClickListener {
+            try {
+                if (!recording) {
+                    Log.d(TAG, "start recording video ")
+                    if (prepareVideoRecorder()) {
+                        mediaRecorder?.start()
+                        recording = true
+                        btn_video_record.setText(R.string.str_record_stop)
+                        btn_video_upload.setText(R.string.str_upload)
+
+                        //禁用另外2个选项
+                        radio_text_msg.isEnabled = false
+                        radio_voice_msg.isEnabled = false
+                        btn_video_upload.isEnabled = false
+
+                        //录制时间显示
+                        countDownTimer.start()
+                    }
+                } else {
+                    Log.d(TAG, "stop recording video ")
+                    radio_text_msg.isEnabled = true
+                    radio_voice_msg.isEnabled = true
+                    btn_video_upload.isEnabled = true
+                    countDownTimer.cancel()
+
+                    mediaRecorder?.stop()
+                    releaseMediaRecorder()
+                    camera?.lock()
+                    btn_video_record.setText(R.string.str_video_record)
+                    recording = false
+                    if (camera != null) {
+                        camera?.stopPreview()
+                        camera?.release()
+                        camera = null
+                    }
+                }
+            } catch (e: Exception) {
+                e.printStackTrace()
+            }
+        }
+
+        btn_video_upload.setOnClickListener {
+            //上传视频
+            showMessage(R.string.str_upload)
+            if (videoFileName != null) {
+                val part = MultipartBody.Part.createFormData("file",
+                    videoFileName,
+                    RequestBody.create(MediaType.parse("multipart/form-data"), File(videoFileName!!))
+                )
+                presenter.uploadVideoMsg(part)
+            }
+        }
+    }
+
+    private fun previewCamera() {
+        val surfaceHolder = surface_view.holder
+        surfaceHolder.addCallback(object : SurfaceHolder.Callback {
+            override fun surfaceCreated(holder: SurfaceHolder) {
+                try {
+                    if (camera == null) {
+                        camera = Camera.open(0)
+                    }
+                    camera?.setPreviewDisplay(surfaceHolder)
+                    camera?.startPreview()
+                    previewStart = true
+                } catch (e: Exception) {
+                    showMessage(R.string.str_open_camera_failed)
+                    e.printStackTrace()
+                }
+            }
+
+            override fun surfaceChanged(
+                holder: SurfaceHolder,
+                format: Int,
+                width: Int,
+                height: Int
+            ) {
+                //
+            }
+
+            override fun surfaceDestroyed(holder: SurfaceHolder) {
+                //
+            }
+        })
+    }
+
+    private fun prepareVideoRecorder(): Boolean {
+        try {
+            Log.d(TAG, "prepare video recorder ")
+            if (mediaRecorder == null) {
+                mediaRecorder = MediaRecorder()
+                mediaRecorder?.reset()
+            }
+
+            /*camera相关设置部分*/
+            if (camera == null) {
+                camera = Camera.open(0) //Camera.CameraInfo.CAMERA_FACING_BACK
+            }
+            if (camera != null) {
+                //camera?.setDisplayOrientation(90)
+                camera?.unlock()
+                mediaRecorder?.setCamera(camera)
+            }
+
+            /*recorder设置部分*/
+            mediaRecorder?.setAudioSource(MediaRecorder.AudioSource.CAMCORDER)
+            mediaRecorder?.setVideoSource(MediaRecorder.VideoSource.CAMERA)
+            var profile = CamcorderProfile.get(0, CamcorderProfile.QUALITY_LOW)
+            if (CamcorderProfile.hasProfile(0, CamcorderProfile.QUALITY_480P)) {
+                profile = CamcorderProfile.get(0, CamcorderProfile.QUALITY_480P)
+            } else if (CamcorderProfile.hasProfile(0, CamcorderProfile.QUALITY_720P)) {
+                profile = CamcorderProfile.get(0, CamcorderProfile.QUALITY_720P)
+            }
+
+            mediaRecorder?.setProfile(profile)
+            mediaRecorder?.setOutputFile(videoFileName)
+            mediaRecorder?.setPreviewDisplay(surface_view.holder.surface)
+            mediaRecorder?.prepare()
+            return true
+        } catch (e: Exception) {
+            Log.e(TAG, "prepare video recorder error!!")
+            e.printStackTrace()
+        }
+
+        return false
+    }
+
+    private fun releaseMediaRecorder() {
+        Log.d(TAG, "release video recorder ")
+        try {
+            if (mediaRecorder != null) {
+                mediaRecorder?.reset() // clear recorder configuration
+                mediaRecorder?.release() // release the recorder object
+                mediaRecorder = null
+                camera?.lock() // lock camera for later use
+            }
+        } catch (e: Exception) {
+            e.printStackTrace()
+        }
     }
 
     override fun destory() {
@@ -224,6 +450,12 @@ class CreateMessageActivity : BaseActivity<MessagePresenter, MessageCreateDialog
         if (!TextUtils.isEmpty(voiceFile)) {
             RecordHelper.getInstance().deleteAudioFile(voiceFile)
         }
+
+        if (!TextUtils.isEmpty(videoFileName)) {
+            RecordHelper.getInstance().deleteAudioFile(videoFileName)
+        }
+
+        countDownTimer.cancel()
     }
 
     override fun showMessages(data: ArrayList<RemarkDO>) {
@@ -254,6 +486,13 @@ class CreateMessageActivity : BaseActivity<MessagePresenter, MessageCreateDialog
         RecordHelper.getInstance().deleteAudioFile(voiceFile)
     }
 
+    override fun uploadVideoResponse(result: String) {
+        videoMsgPath = result
+        btn_video_upload.setText(R.string.str_upload_done)
+
+        RecordHelper.getInstance().deleteAudioFile(videoFileName)
+    }
+
     override fun showClerks(data: ArrayList<ClerkDO>) {
         if (data.size > 0) {
             creatorAdapter = CreatorAdapter(activity, data)
@@ -266,7 +505,7 @@ class CreateMessageActivity : BaseActivity<MessagePresenter, MessageCreateDialog
                     id: Long
                 ) {
                     selectClerk = data[position].clerkName
-                    Log.e(TAG, "select clerk name: " + selectClerk)
+                    Log.e(TAG, "select clerk name: $selectClerk")
                 }
 
                 override fun onNothingSelected(parent: AdapterView<*>?) {}
@@ -276,7 +515,7 @@ class CreateMessageActivity : BaseActivity<MessagePresenter, MessageCreateDialog
     }
 
     override fun onError(message: String, type: Int) {
-
+        showMessage(message)
     }
 
     override fun complete(message: String, type: Int) {

+ 1 - 1
android_host/src/main/java/com/wdkl/ncs/android/component/nursehome/adapter/CreatorAdapter.java

@@ -45,7 +45,7 @@ public class CreatorAdapter extends BaseAdapter {
             convertView = View.inflate(context, R.layout.creator_item, null);
 
             holder = new ViewHolder();
-            holder.tv = (TextView) convertView.findViewById(R.id.tv_frame_name);
+            holder.tv = convertView.findViewById(R.id.tv_frame_name);
 
             convertView.setTag(holder);
         } else {

+ 17 - 7
android_host/src/main/java/com/wdkl/ncs/android/component/nursehome/adapter/MessageAdapter.kt

@@ -72,7 +72,7 @@ class MessageAdapter (val data:ArrayList<RemarkDO>) : BaseDelegateAdapter<BaseRe
      * 绑定数据
      */
     override fun onBindViewHolder(holder: BaseRecyclerViewHolder<AdapterMessageItemBinding>, position: Int) {
-        holder?.bind { binding ->
+        holder.bind { binding ->
             val itemData = getItem(position)
             if (position%2 == 1) {
                 binding.llMessage.setBackgroundColor(Color.parseColor("#8ef6e4"))
@@ -82,6 +82,8 @@ class MessageAdapter (val data:ArrayList<RemarkDO>) : BaseDelegateAdapter<BaseRe
 
             if (itemData.type == 3) {
                 binding.ivMessagePlay.setImageResource(R.drawable.ic_bc_play)
+            } else if (itemData.type == 4) {
+                binding.ivMessagePlay.setImageResource(R.drawable.ic_movies)
             } else {
                 binding.ivMessagePlay.setImageResource(R.drawable.ic_message)
             }
@@ -90,13 +92,21 @@ class MessageAdapter (val data:ArrayList<RemarkDO>) : BaseDelegateAdapter<BaseRe
             binding.tvMessageCreator.text = itemData.createName
             binding.tvMessageTime.text = TimeTransition.stampToYearDateTime(itemData.createTime * 1000)
 
-            binding.ivMessagePlay.setOnClickListener {
-                if (!TextUtils.isEmpty(itemData.filePath)) {
-                    RingPlayHelper.stopRingTone()
-                    SpeechUtil.getInstance().stopSpeak(true)
-                    showMessage("start play")
-                    MediaPlayHelper.getInstance().playUrlMusic(UrlManager.build().buyer + "/" + itemData.filePath, 1.0f, false)
+            if (itemData.type == 3) {
+                binding.ivMessagePlay.setOnClickListener {
+                    if (itemData.type == 3 && !TextUtils.isEmpty(itemData.filePath)) {
+                        RingPlayHelper.stopRingTone()
+                        SpeechUtil.getInstance().stopSpeak(true)
+                        showMessage("start play")
+                        MediaPlayHelper.getInstance().playUrlMusic(
+                            UrlManager.build().buyer + "/" + itemData.filePath,
+                            1.0f,
+                            false
+                        )
+                    }
                 }
+            } else {
+                binding.ivMessagePlay.setOnClickListener(null)
             }
         }
     }

+ 6 - 1
android_host/src/main/java/com/wdkl/ncs/android/component/nursehome/fragment/MessageFragment.kt

@@ -178,7 +178,8 @@ class MessageFragment : BaseFragment<MessagePresenter, FragmentMessageBinding>()
     }
 
     override fun showPageMessages(data: RemarksVO) {
-
+        message_refresh.finishRefresh()
+        message_refresh.finishLoadMore()
 
         totalSize = data.dataTotal
         pageNo = data.pageNo
@@ -222,6 +223,10 @@ class MessageFragment : BaseFragment<MessagePresenter, FragmentMessageBinding>()
 
     }
 
+    override fun uploadVideoResponse(result: String) {
+
+    }
+
     override fun showClerks(data: ArrayList<ClerkDO>) {
 
     }

+ 42 - 3
android_host/src/main/java/com/wdkl/ncs/android/component/nursehome/util/MessageDialogHelper.java

@@ -14,6 +14,7 @@ import android.view.WindowManager;
 import android.widget.Button;
 import android.widget.ImageButton;
 import android.widget.TextView;
+import android.widget.VideoView;
 
 import com.wdkl.ncs.android.component.nursehome.R;
 import com.wdkl.ncs.android.middleware.api.UrlManager;
@@ -34,18 +35,40 @@ public class MessageDialogHelper {
         View contentView = LayoutInflater.from(activity).inflate(R.layout.message_dialog, null);
         AlertDialog.Builder builder = new AlertDialog.Builder(activity);
         builder.setView(contentView);
+        TextView titleView = contentView.findViewById(R.id.message_title);
         TextView textView = contentView.findViewById(R.id.message_text);
+        TextView msgInfo = contentView.findViewById(R.id.message_info);
         ImageButton play = contentView.findViewById(R.id.btn_message_play);
+        VideoView videoView = contentView.findViewById(R.id.video_msg_view);
         Button buttonCancel = contentView.findViewById(R.id.btn_cancel);
         textView.setMovementMethod(ScrollingMovementMethod.getInstance());
 
-        if (remarkDO.getType() == 3) {
+        String info = activity.getString(R.string.str_message_info, remarkDO.getCreateName(), TimeTransition.INSTANCE.stampToYearDateTime(remarkDO.getCreateTime() * 1000));
+        msgInfo.setText(info);
+        if (remarkDO.getType() == 4) {
+            //视频
             play.setVisibility(View.VISIBLE);
+            textView.setVisibility(View.GONE);
+            videoView.setVisibility(View.VISIBLE);
+
+            titleView.setText(remarkDO.getContent());
+        } else if (remarkDO.getType() == 3) {
+            //语音
+            play.setVisibility(View.VISIBLE);
+            textView.setVisibility(View.GONE);
+            videoView.setVisibility(View.GONE);
+
+            titleView.setText(remarkDO.getContent());
         } else {
+            //文本
             play.setVisibility(View.GONE);
+            textView.setVisibility(View.VISIBLE);
+            videoView.setVisibility(View.GONE);
+
+            titleView.setText(R.string.str_note_message);
+            textView.setText(remarkDO.getContent());
         }
 
-        textView.setText(remarkDO.getContent());
         buttonCancel.setOnClickListener(v -> {
             if (dialog != null) {
                 dialog.dismiss();
@@ -57,7 +80,23 @@ public class MessageDialogHelper {
                 RingPlayHelper.stopRingTone();
                 SpeechUtil.getInstance().stopSpeak(true);
                 showMessage("start play");
-                MediaPlayHelper.getInstance().playUrlMusic(UrlManager.Companion.build().getBuyer() + "/" + remarkDO.getFilePath(), 1.0f, false);
+
+                if (remarkDO.getType() == 3) {
+                    //播放音频
+                    MediaPlayHelper.getInstance().playUrlMusic(UrlManager.Companion.build().getBuyer() + "/" + remarkDO.getFilePath(), 1.0f, false);
+                } else if (remarkDO.getType() == 4) {
+                    //播放视频
+                    String videoUrl = UrlManager.Companion.build().getBuyer() + "/" + remarkDO.getFilePath();
+                    try {
+                        videoView.setVideoPath(videoUrl);
+                        videoView.start();
+
+                        play.setVisibility(View.GONE);
+                    } catch (Exception e) {
+                        e.printStackTrace();
+                        showMessage("play error == " + videoUrl);
+                    }
+                }
             }
         });
 

+ 3 - 3
android_host/src/main/res/layout/adapter_message_item.xml

@@ -3,10 +3,10 @@
     <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
         android:id="@+id/ll_message"
         android:layout_width="match_parent"
-        android:layout_height="100dp"
+        android:layout_height="92dp"
         android:layout_marginTop="10dp"
         android:gravity="center_vertical"
-        android:padding="20dp">
+        android:padding="10dp">
 
         <ImageView
             android:layout_width="wrap_content"
@@ -30,7 +30,7 @@
             android:ellipsize="end"
             android:text="----"
             android:textColor="@color/black"
-            android:textSize="32sp" />
+            android:textSize="28sp" />
 
         <ImageView
             android:id="@+id/iv_message_play"

+ 2 - 2
android_host/src/main/res/layout/creator_item.xml

@@ -2,8 +2,8 @@
 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
     android:layout_height="wrap_content"
     android:layout_width="wrap_content"
-    android:orientation="vertical"
-    android:background="#e7e7e7">
+    android:background="@color/white"
+    android:orientation="vertical">
 
     <TextView
         android:id="@+id/tv_frame_name"

+ 47 - 55
android_host/src/main/res/layout/fragment_message.xml

@@ -5,23 +5,16 @@
     <RelativeLayout
         android:layout_width="match_parent"
         android:layout_height="match_parent"
-        android:padding="8dp"
-        >
-
-    <RelativeLayout
-        android:layout_width="match_parent"
-        android:layout_height="match_parent"
-        android:padding="8dp"
         android:background="@drawable/shape_bed_bg"
-        >
+        android:padding="8dp">
 
         <ImageView
             android:id="@+id/message_title_img"
             android:layout_width="@dimen/d20"
             android:layout_height="@dimen/d20"
-            android:background="@mipmap/yisheng"
             android:layout_marginLeft="@dimen/d28"
-            android:layout_marginTop="@dimen/d20" />
+            android:layout_marginTop="@dimen/d20"
+            android:background="@mipmap/yisheng" />
 
         <TextView
             android:id="@+id/message_title_t"
@@ -39,105 +32,104 @@
             android:id="@+id/message_host_emptyImageView"
             android:layout_width="match_parent"
             android:layout_height="match_parent"
-            android:src="@mipmap/list"
-            android:layout_gravity="center"
             android:layout_below="@+id/message_title_t"
-            android:visibility="gone"
-            />
+            android:layout_gravity="center"
+            android:src="@mipmap/list"
+            android:visibility="gone" />
 
         <com.scwang.smartrefresh.layout.SmartRefreshLayout
             android:id="@+id/message_refresh"
             android:layout_width="match_parent"
             android:layout_height="match_parent"
             android:layout_below="@+id/message_title_img"
-            bind:srlEnableLoadMore="false"
             android:padding="@dimen/d10"
+            bind:srlEnableLoadMore="false"
             bind:srlEnableRefresh="true">
 
             <androidx.recyclerview.widget.RecyclerView
                 android:id="@+id/rv_messages"
                 android:layout_width="match_parent"
                 android:layout_height="match_parent"
-                android:padding="10dp"/>
+                android:padding="10dp" />
 
         </com.scwang.smartrefresh.layout.SmartRefreshLayout>
 
         <LinearLayout
             android:layout_width="match_parent"
             android:layout_height="@dimen/d80"
-            android:layout_marginTop="@dimen/d23"
-            android:layout_marginLeft="@dimen/d20"
             android:layout_alignParentBottom="true"
-            android:orientation="horizontal"
+            android:layout_marginLeft="@dimen/d20"
+            android:layout_marginTop="@dimen/d23"
             android:background="@drawable/shape_bed_bg"
-            android:gravity="center">
+            android:gravity="center"
+            android:orientation="horizontal">
+
             <Button
                 android:id="@+id/btn_first_page"
                 android:layout_width="@dimen/d92"
                 android:layout_height="@dimen/d35"
-                android:gravity="center"
+                android:layout_marginRight="@dimen/d20"
                 android:background="@drawable/shape_button_bg2"
+                android:gravity="center"
                 android:text="@string/str_page_up"
-                android:layout_marginRight="@dimen/d20"
+                android:textColor="@color/cc"
                 android:textSize="16sp"
-                android:visibility="gone"
-                android:textColor="@color/cc"/>
+                android:visibility="gone" />
 
             <Button
                 android:id="@+id/btn_pre_page"
-                android:layout_width="@dimen/d92"
-                android:layout_height="@dimen/d35"
-                android:gravity="center"
+                android:layout_width="@dimen/d100"
+                android:layout_height="@dimen/d40"
                 android:background="@drawable/shape_button_bg2"
+                android:gravity="center"
                 android:text="@string/str_page_up"
-                android:textSize="16sp"
-                android:textColor="@color/cc"/>
+                android:textColor="@color/cc"
+                android:textSize="20sp" />
+
             <TextView
                 android:id="@+id/tv_page_no"
-                android:layout_width="@dimen/d39"
-                android:layout_height="@dimen/d39"
+                android:layout_width="@dimen/d40"
+                android:layout_height="@dimen/d40"
+                android:layout_marginLeft="@dimen/d10"
+                android:background="@drawable/shape_papg_bg"
+                android:gravity="center"
                 android:text="1"
                 android:textColor="@color/white"
-                android:background="@drawable/shape_papg_bg"
-                android:textSize="@dimen/font_size_20"
-                android:layout_marginLeft="@dimen/d10"
-                android:gravity="center" />
+                android:textSize="@dimen/font_size_20" />
+
             <Button
                 android:id="@+id/btn_next_page"
-                android:layout_width="@dimen/d92"
-                android:layout_height="@dimen/d35"
-                android:gravity="center"
+                android:layout_width="@dimen/d100"
+                android:layout_height="@dimen/d40"
+                android:layout_marginLeft="@dimen/d10"
                 android:background="@drawable/shape_button_bg2"
+                android:gravity="center"
                 android:text="@string/str_page_down"
-                android:textSize="16sp"
-                android:layout_marginLeft="@dimen/d10"
-                android:textColor="@color/cc"/>
+                android:textColor="@color/cc"
+                android:textSize="20sp" />
 
             <TextView
                 android:id="@+id/yz_view_all_page"
                 android:layout_width="wrap_content"
                 android:layout_height="wrap_content"
+                android:layout_marginLeft="@dimen/d10"
+                android:gravity="center"
                 android:textColor="@color/cost_list_title"
                 android:textSize="@dimen/font_size_18"
-                android:layout_marginLeft="@dimen/d10"
-                android:visibility="gone"
-                android:gravity="center" />
+                android:visibility="gone" />
+
             <Button
                 android:id="@+id/btn_add_message"
-                android:layout_width="@dimen/d92"
-                android:layout_height="@dimen/d35"
-                android:layout_alignParentRight="true"
+                android:layout_width="wrap_content"
+                android:layout_height="@dimen/d40"
+                android:paddingLeft="6dp"
+                android:paddingRight="6dp"
+                android:layout_marginLeft="@dimen/d20"
                 android:background="@drawable/shape_main_hos_txt_bg"
-                android:textColor="@drawable/selector_bottom_btn_text_color"
                 android:text="@string/str_add_message"
-                android:layout_marginLeft="@dimen/d20"
-                android:textSize="@dimen/font_size_16" />
+                android:textColor="@drawable/selector_bottom_btn_text_color"
+                android:textSize="20sp" />
         </LinearLayout>
     </RelativeLayout>
 
-
-
-    </RelativeLayout>
-
-
 </layout>

+ 220 - 163
android_host/src/main/res/layout/message_create_dialog_activity.xml

@@ -1,202 +1,259 @@
 <?xml version="1.0" encoding="utf-8"?>
 <layout>
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
-    android:layout_width="match_parent"
-    android:layout_height="match_parent"
-     >
-
-
-    <LinearLayout
+    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
         android:id="@+id/ll_message_view"
         android:layout_width="match_parent"
-        android:layout_height="wrap_content"
-        android:background="@color/white"
+        android:layout_height="match_parent"
+        android:background="@drawable/shape_other_item_bg"
         android:gravity="center_horizontal"
-        android:padding="10dp"
         android:orientation="vertical"
-        >
-
+        android:padding="10dp">
 
-    <LinearLayout
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:layout_marginTop="10dp"
-        android:paddingLeft="20dp"
-        android:paddingRight="20dp"
-        android:orientation="horizontal">
-
-        <TextView
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            android:layout_gravity="center_vertical"
-            android:text="@string/str_message_type"
-            android:textColor="#000000"
-            android:textSize="24sp" />
-
-        <RadioGroup
-            android:id="@+id/group_message_type"
+        <LinearLayout
             android:layout_width="wrap_content"
             android:layout_height="wrap_content"
-            android:layout_marginStart="20dp"
-            android:orientation="horizontal">
+            android:orientation="horizontal"
+            android:layout_marginTop="6dp"
+            android:paddingLeft="20dp"
+            android:paddingRight="20dp">
 
-            <RadioButton
-                android:id="@+id/radio_text_msg"
+            <TextView
                 android:layout_width="wrap_content"
                 android:layout_height="wrap_content"
-                android:text="@string/str_text_message"
+                android:layout_gravity="center_vertical"
+                android:text="@string/str_message_type"
                 android:textColor="#000000"
-                android:textSize="24sp"
-                android:button="@null"
-                android:drawableLeft="@drawable/radio_button_selector_bg2"
-                android:drawablePadding="@dimen/d5"
-                android:checked="true"/>
-
-            <RadioButton
-                android:id="@+id/radio_voice_msg"
+                android:textSize="24sp" />
+
+            <RadioGroup
+                android:id="@+id/group_message_type"
                 android:layout_width="wrap_content"
                 android:layout_height="wrap_content"
                 android:layout_marginStart="20dp"
-                android:text="@string/str_voice_message"
-                android:textColor="#000000"
-                android:button="@null"
-                android:drawableLeft="@drawable/radio_button_selector_bg2"
-                android:drawablePadding="@dimen/d5"
-                android:textSize="24sp" />
-        </RadioGroup>
+                android:orientation="horizontal">
 
-    </LinearLayout>
+                <RadioButton
+                    android:id="@+id/radio_text_msg"
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:button="@null"
+                    android:checked="true"
+                    android:drawableLeft="@drawable/radio_button_selector_bg2"
+                    android:drawablePadding="@dimen/d5"
+                    android:text="@string/str_text_message"
+                    android:textColor="#000000"
+                    android:textSize="24sp" />
 
-    <LinearLayout
-        android:layout_width="wrap_content"
-        android:layout_height="60dp"
-        android:layout_marginTop="5dp"
-        android:paddingLeft="20dp"
-        android:paddingRight="20dp">
-        <TextView
-            android:layout_width="wrap_content"
-            android:layout_height="match_parent"
-            android:gravity="center_vertical"
-            android:text="@string/str_message_creator"
-            android:textColor="#000000"
-            android:textSize="24sp"/>
-        <Spinner
-            android:id="@+id/spinner_creator"
-            android:layout_width="wrap_content"
-            android:layout_height="match_parent"
-            android:layout_marginStart="10dp"
-            android:gravity="center_vertical"
-            android:spinnerMode="dropdown"/>
+                <RadioButton
+                    android:id="@+id/radio_voice_msg"
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:layout_marginStart="20dp"
+                    android:button="@null"
+                    android:drawableLeft="@drawable/radio_button_selector_bg2"
+                    android:drawablePadding="@dimen/d5"
+                    android:text="@string/str_voice_message"
+                    android:textColor="#000000"
+                    android:textSize="24sp" />
 
-    </LinearLayout>
+                <RadioButton
+                    android:id="@+id/radio_video_msg"
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:layout_marginStart="20dp"
+                    android:button="@null"
+                    android:drawableLeft="@drawable/radio_button_selector_bg2"
+                    android:drawablePadding="@dimen/d5"
+                    android:text="@string/str_video_message"
+                    android:textColor="#000000"
+                    android:textSize="24sp" />
+            </RadioGroup>
 
-    <FrameLayout
-        android:layout_width="match_parent"
-        android:layout_height="210dp"
-        android:paddingTop="10dp"
-        >
-
-        <EditText
-            android:id="@+id/edit_text_message"
-            android:layout_width="match_parent"
-            android:layout_height="match_parent"
-            android:textColor="#000000"
-            android:textSize="28sp"
-            android:gravity="left|top"
-            android:padding="@dimen/d10"
-            android:hint="@string/str_message_hint"
-            android:background="@drawable/shape_n_login_ed_bg2"
-            android:visibility="visible"/>
+        </LinearLayout>
 
         <LinearLayout
-            android:id="@+id/ll_voice_message"
-            android:layout_width="match_parent"
-            android:layout_height="wrap_content"
-            android:gravity="center"
-            android:orientation="vertical"
-            android:visibility="gone"
-            >
+            android:layout_width="wrap_content"
+            android:layout_height="60dp"
+            android:layout_marginTop="5dp"
+            android:paddingLeft="20dp"
+            android:paddingRight="20dp">
 
-            <Chronometer
-                android:id="@+id/voice_record_timer"
+            <TextView
                 android:layout_width="wrap_content"
-                android:layout_height="wrap_content"
-                android:layout_marginTop="10dp"
+                android:layout_height="match_parent"
+                android:gravity="center_vertical"
+                android:text="@string/str_message_creator"
                 android:textColor="#000000"
-                android:textSize="18sp"
-                android:text="00:00" />
-
-            <Button
-                android:id="@+id/btn_voice_record"
-                android:layout_width="80dp"
-                android:layout_height="80dp"
-                android:layout_marginTop="10dp"
-                android:layout_gravity="center"
-                android:background="@drawable/selector_record_btn" />
+                android:textSize="24sp" />
 
-            <TextView
-                android:id="@+id/tv_voice_record"
+            <Spinner
+                android:id="@+id/spinner_creator"
                 android:layout_width="wrap_content"
-                android:layout_height="wrap_content"
-                android:layout_marginTop="10dp"
-                android:gravity="center"
-                android:text="@string/str_voice_msg_btn_text"
+                android:layout_height="match_parent"
+                android:layout_marginStart="10dp"
+                android:gravity="center_vertical"
+                android:popupBackground="@color/white"
+                android:spinnerMode="dropdown" />
+
+        </LinearLayout>
+
+        <FrameLayout
+            android:layout_width="match_parent"
+            android:layout_height="240dp"
+            android:paddingTop="4dp">
+
+            <EditText
+                android:id="@+id/edit_text_message"
+                android:layout_width="match_parent"
+                android:layout_height="match_parent"
+                android:background="@drawable/shape_n_login_ed_bg2"
+                android:gravity="top"
+                android:hint="@string/str_message_hint"
+                android:padding="@dimen/d10"
                 android:textColor="#000000"
-                android:textSize="20sp"/>
+                android:textSize="28sp"
+                android:visibility="visible" />
 
-            <TextView
-                android:id="@+id/tv_voice_msg_state"
-                android:layout_width="wrap_content"
+            <LinearLayout
+                android:id="@+id/ll_voice_message"
+                android:layout_width="match_parent"
                 android:layout_height="wrap_content"
-                android:layout_marginTop="8dp"
                 android:gravity="center"
-                android:text="@string/str_empty_voice_msg"
-                android:textColor="#ff0000"
-                android:textSize="20sp"/>
-        </LinearLayout>
+                android:orientation="vertical"
+                android:visibility="gone">
 
-    </FrameLayout>
+                <Chronometer
+                    android:id="@+id/voice_record_timer"
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:layout_marginTop="10dp"
+                    android:text="00:00"
+                    android:textColor="#000000"
+                    android:textSize="18sp" />
 
-    <LinearLayout
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:layout_marginTop="10dp"
-        android:layout_marginBottom="20dp">
-        <Button
-            android:id="@+id/btn_add_save"
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            android:paddingLeft="40dp"
-            android:paddingRight="40dp"
-            android:paddingTop="10dp"
-            android:paddingBottom="10dp"
-            android:background="@drawable/shape_main_hos_txt_bg"
-            android:textColor="@drawable/selector_bottom_btn_text_color"
-            android:text="@string/str_save"
-            android:textSize="20sp"
-            style="?android:attr/buttonBarButtonStyle" />
-
-        <View
-            android:layout_width="60dp"
-            android:layout_height="60dp"/>
-
-        <Button
-            android:id="@+id/btn_add_cancel"
+                <Button
+                    android:id="@+id/btn_voice_record"
+                    android:layout_width="80dp"
+                    android:layout_height="80dp"
+                    android:layout_gravity="center"
+                    android:layout_marginTop="10dp"
+                    android:background="@drawable/selector_record_btn" />
+
+                <TextView
+                    android:id="@+id/tv_voice_record"
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:layout_marginTop="10dp"
+                    android:gravity="center"
+                    android:text="@string/str_voice_msg_btn_text"
+                    android:textColor="#000000"
+                    android:textSize="20sp" />
+
+                <TextView
+                    android:id="@+id/tv_voice_msg_state"
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:layout_marginTop="8dp"
+                    android:gravity="center"
+                    android:text="@string/str_empty_voice_msg"
+                    android:textColor="#ff0000"
+                    android:textSize="20sp" />
+            </LinearLayout>
+
+            <LinearLayout
+                android:id="@+id/ll_video_record"
+                android:layout_width="match_parent"
+                android:layout_height="match_parent"
+                android:gravity="center"
+                android:orientation="vertical"
+                android:visibility="gone">
+
+                <SurfaceView
+                    android:id="@+id/surface_view"
+                    android:layout_width="320dp"
+                    android:layout_height="180dp" />
+
+                <LinearLayout
+                    android:layout_width="match_parent"
+                    android:layout_height="wrap_content"
+                    android:layout_marginTop="6dp"
+                    android:gravity="center">
+                    <Button
+                        android:id="@+id/btn_video_record"
+                        style="?android:attr/buttonBarButtonStyle"
+                        android:layout_width="wrap_content"
+                        android:layout_height="wrap_content"
+                        android:padding="4dp"
+                        android:background="@drawable/shape_mom_txt_bg"
+                        android:text="@string/str_video_record"
+                        android:textColor="@drawable/selector_bottom_btn_text_color"
+                        android:textSize="16sp" />
+
+                    <TextView
+                        android:id="@+id/tv_record_time"
+                        android:layout_width="wrap_content"
+                        android:layout_height="wrap_content"
+                        android:layout_marginLeft="30dp"
+                        android:layout_marginRight="30dp"
+                        android:textColor="#000000"
+                        android:text="--"
+                        android:textSize="22sp" />
+
+                    <Button
+                        android:id="@+id/btn_video_upload"
+                        style="?android:attr/buttonBarButtonStyle"
+                        android:layout_width="wrap_content"
+                        android:layout_height="wrap_content"
+                        android:padding="4dp"
+                        android:background="@drawable/shape_mom_txt_bg"
+                        android:text="@string/str_upload"
+                        android:textColor="@drawable/selector_bottom_btn_text_color"
+                        android:textSize="16sp" />
+                </LinearLayout>
+
+            </LinearLayout>
+
+        </FrameLayout>
+
+        <LinearLayout
             android:layout_width="wrap_content"
             android:layout_height="wrap_content"
-            android:paddingLeft="40dp"
-            android:paddingRight="40dp"
-            android:paddingTop="10dp"
-            android:paddingBottom="10dp"
-            android:background="@drawable/shape_main_hos_txt_bg"
-            android:textColor="@drawable/selector_bottom_btn_text_color"
-            android:text="@string/str_cancel"
-            android:textSize="20sp"
-            style="?android:attr/buttonBarButtonStyle" />
-    </LinearLayout>
+            android:layout_marginTop="20dp"
+            android:layout_marginBottom="10dp">
 
-    </LinearLayout>
+            <Button
+                android:id="@+id/btn_add_save"
+                style="?android:attr/buttonBarButtonStyle"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:background="@drawable/shape_main_hos_txt_bg"
+                android:paddingLeft="40dp"
+                android:paddingTop="10dp"
+                android:paddingRight="40dp"
+                android:paddingBottom="10dp"
+                android:text="@string/str_save"
+                android:textColor="@drawable/selector_bottom_btn_text_color"
+                android:textSize="20sp" />
+
+            <View
+                android:layout_width="60dp"
+                android:layout_height="60dp" />
+
+            <Button
+                android:id="@+id/btn_add_cancel"
+                style="?android:attr/buttonBarButtonStyle"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:background="@drawable/shape_main_hos_txt_bg"
+                android:paddingLeft="40dp"
+                android:paddingTop="10dp"
+                android:paddingRight="40dp"
+                android:paddingBottom="10dp"
+                android:text="@string/str_cancel"
+                android:textColor="@drawable/selector_bottom_btn_text_color"
+                android:textSize="20sp" />
+        </LinearLayout>
 
+    </LinearLayout>
 
-</LinearLayout>
 </layout>

+ 60 - 25
android_host/src/main/res/layout/message_dialog.xml

@@ -1,46 +1,81 @@
 <?xml version="1.0" encoding="utf-8"?>
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
-    android:layout_width="wrap_content"
-    android:layout_height="wrap_content"
-    android:padding="20dp"
-    android:gravity="center"
+<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="760dp"
+    android:layout_height="540dp"
+    android:paddingTop="10dp"
+    android:paddingBottom="40dp"
+    android:paddingLeft="20dp"
+    android:paddingRight="20dp"
     android:orientation="vertical"
     android:background="@drawable/loading_bg_ripple_shape">
 
+    <Button
+        android:id="@+id/btn_cancel"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_centerHorizontal="true"
+        android:layout_alignParentBottom="true"
+        android:gravity="center"
+        android:background="@drawable/shape_password_bt_bg"
+        android:padding="10dp"
+        android:text="@string/str_confirm"
+        android:textSize="28sp"
+        android:textColor="@drawable/selector_bottom_btn_text_color"/>
+
+    <TextView
+        android:id="@+id/message_title"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:padding="8dp"
+        android:gravity="center"
+        android:text="@string/str_note_message"
+        android:textColor="@color/main_color"
+        android:textSize="28sp" />
+
+    <TextView
+        android:id="@+id/message_info"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:layout_below="@+id/message_title"
+        android:padding="8dp"
+        android:textColor="@color/main_color"
+        android:textSize="24sp" />
+
     <TextView
         android:id="@+id/message_text"
-        android:layout_width="720dp"
-        android:layout_height="340dp"
-        android:layout_marginTop="20dp"
+        android:layout_width="match_parent"
+        android:layout_height="320dp"
+        android:layout_marginTop="10dp"
+        android:layout_below="@+id/message_info"
+        android:background="@drawable/shape_hospital_ifo_tx_bg"
         android:padding="8dp"
         android:gravity="start"
         android:textColor="@color/black"
-        android:textSize="32sp"
+        android:textSize="30sp"
         android:letterSpacing="0.2"
         android:lineSpacingExtra="8dp"
         android:scrollbars="vertical"
-        android:fadeScrollbars="false"/>
+        android:fadeScrollbars="false"
+        android:visibility="gone"/>
+
+    <VideoView
+        android:id="@+id/video_msg_view"
+        android:layout_width="320dp"
+        android:layout_height="260dp"
+        android:layout_marginTop="10dp"
+        android:layout_centerHorizontal="true"
+        android:layout_below="@+id/message_info"
+        android:visibility="gone"/>
 
     <ImageButton
         android:id="@+id/btn_message_play"
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
-        android:layout_marginTop="20dp"
+        android:layout_above="@+id/btn_cancel"
+        android:layout_centerHorizontal="true"
+        android:layout_marginBottom="20dp"
         android:background="@android:color/transparent"
         android:src="@drawable/ic_bc_play"
         android:visibility="gone"/>
 
-    <Button
-        android:id="@+id/btn_cancel"
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:layout_marginTop="20dp"
-        android:layout_marginBottom="20dp"
-        android:gravity="center"
-        android:background="@drawable/shape_password_bt_bg"
-        android:padding="10dp"
-        android:text="@string/str_confirm"
-        android:textSize="28sp"
-        android:textColor="@drawable/selector_bottom_btn_text_color"/>
-
-</LinearLayout>
+</RelativeLayout>

+ 7 - 0
android_host/src/main/res/values-es/strings.xml

@@ -35,6 +35,7 @@
     <string name="event_done">Terminado</string>
     <string name="event_todo_tips">Llamada entrante, primera tarea</string>
     <string name="voice_message">Mensaje de voz</string>
+    <string name="video_message">Video msg</string>
 
     <string name="call_video">%s Videollamada</string>
     <string name="call_visiting">Solicitud de visita</string>
@@ -119,7 +120,9 @@
     <string name="str_message_type">Tipo de mensaje:</string>
     <string name="str_text_message">Texto</string>
     <string name="str_voice_message">Voz</string>
+    <string name="str_video_message">Video</string>
     <string name="str_message_creator">Creador:</string>
+    <string name="str_message_info">"Creador: %s        Time: %s"</string>
     <string name="str_nb_iot">IoT</string>
     <string name="str_offline_device">Dispositivo sin conexión</string>
     <string name="str_low_battery_device">Dispositivo con batería baja</string>
@@ -136,6 +139,10 @@
     <string name="str_settings">Configuración</string>
     <string name="str_delete">Eliminar</string>
     <string name="str_save">Guardar</string>
+    <string name="str_upload">Upload</string>
+    <string name="str_upload_done">Upload done</string>
+    <string name="str_video_record">Record</string>
+    <string name="str_record_stop">Stop</string>
     <string name="setting_day_night_time">Configuración de horario de día y noche</string>
     <string name="setting_call_type">Tipo de llamada:</string>
     <string name="setting_call_type_tts">TTS</string>

+ 8 - 0
android_host/src/main/res/values-pt/strings.xml

@@ -35,6 +35,7 @@
     <string name="event_done">Concluído</string>
     <string name="event_todo_tips">Por favor, primeiro resolva chamadas não atendidas</string>
     <string name="voice_message">Mensagem de voz</string>
+    <string name="video_message">Vídeo msg</string>
 
 
     <string name="call_video">%s solicitação de vídeo</string>
@@ -125,7 +126,9 @@
     <string name="str_message_type">Tipo de aviso:</string>
     <string name="str_text_message">Texto</string>
     <string name="str_voice_message">Voz</string>
+    <string name="str_video_message">Vídeo</string>
     <string name="str_message_creator">Criador:</string>
+    <string name="str_message_info">"Criador: %s        Time: %s"</string>
     <string name="str_nb_iot">IoT</string>
     <string name="str_offline_device">Dispositivo offline</string>
     <string name="str_low_battery_device">Dispositivo com pouca bateria</string>
@@ -141,6 +144,10 @@
     <string name="str_settings">Configurações</string>
     <string name="str_delete">Excluir</string>
     <string name="str_save">Salvar</string>
+    <string name="str_upload">Upload</string>
+    <string name="str_upload_done">Upload done</string>
+    <string name="str_video_record">Record</string>
+    <string name="str_record_stop">Stop</string>
     <string name="str_manager_host">Hospedeiro de gerenciamento</string>
     <string name="server_config">Configuração do servidor</string>
 
@@ -162,6 +169,7 @@
     <string name="str_delete_tip">Confirmar exclusão?</string>
     <string name="str_message_content_error">Conteúdo da mensagem vazio</string>
     <string name="str_voice_message_invalid">Arquivo de mensagem de voz inválido</string>
+    <string name="str_video_message_invalid">Invalid video file</string>
     <string name="str_message_save_success">Mensagem salva com sucesso!</string>
     <string name="str_record_message_success">Gravação de voz concluída!</string>
     <string name="str_invalid_creator_name">Por favor, selecione primeiro o criador</string>

+ 7 - 0
android_host/src/main/res/values-ru/strings.xml

@@ -36,6 +36,7 @@
     <string name="event_done">Готово</string>
     <string name="event_todo_tips">Сначала входящий вызов</string>
     <string name="voice_message">Голосовое сообщение</string>
+    <string name="video_message">Video msg</string>
 
     <string name="call_video">%s video call</string>
     <string name="call_visiting">Запрос на посещение</string>
@@ -120,7 +121,9 @@
     <string name="str_message_type">Тип сообщения:</string>
     <string name="str_text_message">Текст</string>
     <string name="str_voice_message">Голосовое</string>
+    <string name="str_video_message">Video</string>
     <string name="str_message_creator">Создатель:</string>
+    <string name="str_message_info">"Создатель: %s        Time: %s"</string>
     <string name="str_nb_iot">IoT</string>
     <string name="str_offline_device">Оффлайн-устройство</string>
     <string name="str_low_battery_device">Устройство с низким зарядом</string>
@@ -137,6 +140,10 @@
     <string name="str_settings">Настройки</string>
     <string name="str_delete">Удалить</string>
     <string name="str_save">Сохранить</string>
+    <string name="str_upload">Upload</string>
+    <string name="str_upload_done">Upload done</string>
+    <string name="str_video_record">Record</string>
+    <string name="str_record_stop">Stop</string>
     <string name="setting_day_night_time">Установка дневного и ночного времени</string>
     <string name="setting_call_type">Тип звонка:</string>
     <string name="setting_call_type_tts">ТТС</string>

+ 8 - 0
android_host/src/main/res/values-zh/strings.xml

@@ -34,6 +34,7 @@
     <string name="event_done">已处理</string>
     <string name="event_todo_tips">请先处理未接来电</string>
     <string name="voice_message">语音留言</string>
+    <string name="video_message">视频留言</string>
 
     <string name="call_video">%s请求视频</string>
     <string name="call_visiting">探视请求</string>
@@ -120,7 +121,9 @@
     <string name="str_message_type">留言类型:</string>
     <string name="str_text_message">文本</string>
     <string name="str_voice_message">语音</string>
+    <string name="str_video_message">视频</string>
     <string name="str_message_creator">创建人:</string>
+    <string name="str_message_info">"留言人: %s        时间: %s"</string>
     <string name="str_nb_iot">IoT设备</string>
     <string name="str_offline_device">离线设备</string>
     <string name="str_low_battery_device">低电设备</string>
@@ -136,6 +139,10 @@
     <string name="str_settings">设置</string>
     <string name="str_delete">删除</string>
     <string name="str_save">保存</string>
+    <string name="str_upload">上传</string>
+    <string name="str_upload_done">上传完成</string>
+    <string name="str_video_record">录制</string>
+    <string name="str_record_stop">停止</string>
     <string name="str_manager_host">总控主机</string>
     <string name="server_config">服务器配置</string>
 
@@ -159,6 +166,7 @@
     <string name="str_delete_tip">确认删除?</string>
     <string name="str_message_content_error">留言内容为空</string>
     <string name="str_voice_message_invalid">语音留言文件无效</string>
+    <string name="str_video_message_invalid">视频文件无效</string>
     <string name="str_message_save_success">留言成功!</string>
     <string name="str_record_message_success">语音录制成功!</string>
     <string name="str_invalid_creator_name">请先选择创建人</string>

+ 7 - 0
android_host/src/main/res/values/strings.xml

@@ -35,6 +35,7 @@
     <string name="event_done">Done</string>
     <string name="event_todo_tips">Incoming call todo first</string>
     <string name="voice_message">Voice msg</string>
+    <string name="video_message">Video msg</string>
 
     <string name="call_video">%s video call</string>
     <string name="call_visiting">Visiting</string>
@@ -121,7 +122,9 @@
     <string name="str_message_type">Message type:</string>
     <string name="str_text_message">Text</string>
     <string name="str_voice_message">Voice</string>
+    <string name="str_video_message">Video</string>
     <string name="str_message_creator">Creator:</string>
+    <string name="str_message_info">"Creator: %s        Time: %s"</string>
     <string name="str_nb_iot">IoT </string>
     <string name="str_offline_device">Offline device</string>
     <string name="str_low_battery_device">Low battery device</string>
@@ -137,6 +140,10 @@
     <string name="str_settings">Settings</string>
     <string name="str_delete">Delete</string>
     <string name="str_save">Save</string>
+    <string name="str_upload">Upload</string>
+    <string name="str_upload_done">Upload done</string>
+    <string name="str_video_record">Record</string>
+    <string name="str_record_stop">Stop</string>
     <string name="str_manager_host">Manager host</string>
     <string name="server_config">Server config</string>
 

+ 12 - 8
middleware/src/main/code/com/wdkl/ncs/android/middleware/helper/RecordHelper.java

@@ -11,7 +11,7 @@ import java.io.IOException;
 
 public class RecordHelper {
     private static final String VOICE_MSG_FILE_PATH = Environment.getExternalStorageDirectory().getPath() + "/VoiceMsg";
-    private String audiofilePath;
+    private String audioFilePath;
     private MediaRecorder mediaRecorder;
     private static RecordHelper sInstance = null;
     private boolean recording = false;
@@ -41,14 +41,14 @@ public class RecordHelper {
     }
 
     public void startRecord() {
-        audiofilePath = VOICE_MSG_FILE_PATH + "/" + TimeHandle.INSTANCE.getRecTimeFilename() + "_voice.mp3";
+        audioFilePath = VOICE_MSG_FILE_PATH + "/" + TimeHandle.INSTANCE.getRecTimeFilename() + "_voice.mp3";
         new Thread(new Runnable() {
             @Override
             public void run() {
                 synchronized (lock) {
                     try {
                         mediaRecorder = new MediaRecorder();
-                        mediaRecorder.setOutputFile(audiofilePath);
+                        mediaRecorder.setOutputFile(audioFilePath);
                         mediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);// 设置MediaRecorder的音频源为麦克风
                         mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);// 设置MediaRecorder录制的音频格式
                         mediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AAC);// 设置MediaRecorder录制音频的编码为amr
@@ -78,11 +78,11 @@ public class RecordHelper {
     }
 
     public void recordTestStart() {
-        audiofilePath = VOICE_MSG_FILE_PATH + "/" + System.currentTimeMillis() + "_voice.mp3";
+        audioFilePath = VOICE_MSG_FILE_PATH + "/" + System.currentTimeMillis() + "_voice.mp3";
         synchronized (lock) {
             try {
                 mediaRecorder = new MediaRecorder();
-                mediaRecorder.setOutputFile(audiofilePath);
+                mediaRecorder.setOutputFile(audioFilePath);
                 mediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);// 设置MediaRecorder的音频源为麦克风
                 mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);// 设置MediaRecorder录制的音频格式
                 mediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AAC);// 设置MediaRecorder录制音频的编码为amr
@@ -123,10 +123,14 @@ public class RecordHelper {
     }
 
     public void deleteAudioFile() {
-        deleteAudioFile(audiofilePath);
+        deleteAudioFile(audioFilePath);
     }
 
-    public String getAudiofilePath() {
-        return audiofilePath;
+    public String getAudioFilePath() {
+        return audioFilePath;
+    }
+
+    public String getVideoFilePath() {
+        return VOICE_MSG_FILE_PATH + "/" + TimeHandle.INSTANCE.getRecTimeFilename() + "_video.mp4";
     }
 }

+ 4 - 0
middleware/src/main/code/com/wdkl/ncs/android/middleware/logic/contract/nursehome/MessageContract.kt

@@ -20,6 +20,8 @@ interface MessageContract {
 
         fun uploadResponse(result: String)
 
+        fun uploadVideoResponse(result: String)
+
         fun showClerks(data: ArrayList<ClerkDO>)
 
     }
@@ -35,6 +37,8 @@ interface MessageContract {
 
         fun uploadVoiceMsg(multipart : MultipartBody.Part)
 
+        fun uploadVideoMsg(multipart : MultipartBody.Part)
+
         fun loadClerks(shopIp: Int)
 
     }

+ 25 - 0
middleware/src/main/code/com/wdkl/ncs/android/middleware/logic/presenter/nursehome/MessagePresenter.kt

@@ -144,6 +144,25 @@ class MessagePresenter@Inject constructor():RxPresenter<MessageContract.View>(),
         }
     }
 
+    private val observer3 = object : ConnectionObserver<ResponseBody>() {
+        override fun onStartWithConnection() {
+            providerView()
+        }
+
+        override fun onNextWithConnection(result: ResponseBody, connectionQuality: ConnectionQuality) {
+            providerView().complete("")
+            providerView().uploadVideoResponse(result.getJsonString())
+        }
+
+        override fun onErrorWithConnection(error: ExceptionHandle.ResponeThrowable, connectionQuality: ConnectionQuality) {
+            providerView().onError(error.customMessage)
+        }
+
+        override fun attachSubscribe(var1: Disposable) {
+            addDisposable(var1)
+        }
+    }
+
 
     override fun loadMessage(partId: Int) {
         deviceApi.getMessages(partId)
@@ -203,6 +222,12 @@ class MessagePresenter@Inject constructor():RxPresenter<MessageContract.View>(),
                 .subscribe(observer2)
     }
 
+    override fun uploadVideoMsg(multipart: MultipartBody.Part) {
+        deviceApi.uploadFile(multipart)
+            .compose(ThreadFromUtils.defaultSchedulers())
+            .subscribe(observer3)
+    }
+
     override fun loadClerks(shopIp: Int) {
         deviceApi.getClerks(shopIp)
                 .map {

+ 5 - 0
resource/src/main/res/drawable/ic_movies.xml

@@ -0,0 +1,5 @@
+<vector android:height="24dp" android:tint="#FFFFFF"
+    android:viewportHeight="24" android:viewportWidth="24"
+    android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
+    <path android:fillColor="@android:color/white" android:pathData="M18,3v2h-2L16,3L8,3v2L6,5L6,3L4,3v18h2v-2h2v2h8v-2h2v2h2L20,3h-2zM8,17L6,17v-2h2v2zM8,13L6,13v-2h2v2zM8,9L6,9L6,7h2v2zM18,17h-2v-2h2v2zM18,13h-2v-2h2v2zM18,9h-2L16,7h2v2z"/>
+</vector>

+ 5 - 0
resource/src/main/res/drawable/ic_video_record.xml

@@ -0,0 +1,5 @@
+<vector android:height="48dp" android:tint="#D70404"
+    android:viewportHeight="24" android:viewportWidth="24"
+    android:width="48dp" xmlns:android="http://schemas.android.com/apk/res/android">
+    <path android:fillColor="@android:color/white" android:pathData="M12,7c-2.76,0 -5,2.24 -5,5s2.24,5 5,5 5,-2.24 5,-5 -2.24,-5 -5,-5zM12,2C6.48,2 2,6.48 2,12s4.48,10 10,10 10,-4.48 10,-10S17.52,2 12,2zM12,20c-4.42,0 -8,-3.58 -8,-8s3.58,-8 8,-8 8,3.58 8,8 -3.58,8 -8,8z"/>
+</vector>

+ 6 - 0
resource/src/main/res/drawable/ic_video_stop.xml

@@ -0,0 +1,6 @@
+<vector android:height="48dp" android:tint="#D70404"
+    android:viewportHeight="24" android:viewportWidth="24"
+    android:width="48dp" xmlns:android="http://schemas.android.com/apk/res/android">
+    <path android:fillColor="@android:color/white"
+        android:fillType="evenOdd" android:pathData="M8,16h8V8H8V16zM12,2C6.48,2 2,6.48 2,12s4.48,10 10,10s10,-4.48 10,-10S17.52,2 12,2L12,2z"/>
+</vector>

+ 1 - 2
resource/src/main/res/drawable/shape_advice_bg2.xml

@@ -1,7 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
 <shape xmlns:android="http://schemas.android.com/apk/res/android">
-    <solid android:color="@android:color/transparent"
-        />
+    <solid android:color="@android:color/transparent" />
     <stroke android:width="1dp" android:color="#C5C5C5" />
     <corners android:radius="5dp" />
 </shape>

+ 1 - 0
resource/src/main/res/values-es/strings.xml

@@ -117,6 +117,7 @@
     <string name="str_delete_tip">¿Eliminar?</string>
     <string name="str_message_content_error">Mensaje inválido</string>
     <string name="str_voice_message_invalid">Mensaje de voz inválido</string>
+    <string name="str_video_message_invalid">Invalid video file</string>
     <string name="str_message_save_success">¡Éxito!</string>
     <string name="str_record_message_success">¡Grabación exitosa!</string>
     <string name="str_invalid_creator_name">Por favor, seleccione un creador</string>

+ 1 - 0
resource/src/main/res/values-ru/strings.xml

@@ -102,6 +102,7 @@
     <string name="str_delete_tip">Удалить?</string>
     <string name="str_message_content_error">Недействительное сообщение</string>
     <string name="str_voice_message_invalid">Недействительное голосовое сообщение</string>
+    <string name="str_video_message_invalid">Invalid video file</string>
     <string name="str_message_save_success">Успешно!</string>
     <string name="str_record_message_success">Запись успешно завершена!</string>
     <string name="str_invalid_creator_name">Пожалуйста, выберите создателя</string>

+ 1 - 0
resource/src/main/res/values/strings.xml

@@ -117,6 +117,7 @@
     <string name="str_delete_tip">Delete?</string>
     <string name="str_message_content_error">Invalid message</string>
     <string name="str_voice_message_invalid">Invalid voice message</string>
+    <string name="str_video_message_invalid">Invalid video file</string>
     <string name="str_message_save_success">Success!</string>
     <string name="str_record_message_success">Record success!</string>
     <string name="str_invalid_creator_name">Please select creator</string>