Code owners
Assign users and groups as approvers for specific file changes. Learn more.
ConversationViewHolder.kt 10.71 KiB
/*
* Copyright (C) 2004-2023 Savoir-faire Linux Inc.
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package cx.ring.viewholders
import android.view.ViewGroup
import androidx.recyclerview.widget.RecyclerView
import android.widget.TextView
import androidx.core.widget.ContentLoadingProgressBar
import android.view.TextureView
import android.widget.LinearLayout
import android.animation.ValueAnimator
import android.media.MediaPlayer
import android.view.Surface
import android.view.View
import android.widget.FrameLayout
import android.widget.ImageButton
import android.widget.ImageView
import androidx.constraintlayout.widget.ConstraintLayout
import cx.ring.R
import cx.ring.views.CustomMessageBubble
import cx.ring.adapters.MessageType
import cx.ring.views.MessageStatusView
import io.reactivex.rxjava3.disposables.CompositeDisposable
class ConversationViewHolder(v: ViewGroup, val type: MessageType) : RecyclerView.ViewHolder(v) {
val mItem: View? = when (type) {
MessageType.OUTGOING_CALL_INFORMATION,
MessageType.INCOMING_CALL_INFORMATION -> v.findViewById(R.id.callLayout)
MessageType.ONGOING_GROUP_CALL -> v.findViewById(R.id.groupCallLayout)
MessageType.INCOMING_TEXT_MESSAGE,
MessageType.OUTGOING_TEXT_MESSAGE -> v.findViewById(R.id.txt_entry)
else -> null
}
var mMsgTxt: TextView? = null
var mMsgDetailTxt: TextView? = null
var mMsgDetailTxtPerm: TextView? = null
val mAvatar: ImageView? = when (type) {
MessageType.INCOMING_CALL_INFORMATION,
MessageType.INCOMING_TEXT_MESSAGE,
MessageType.ONGOING_GROUP_CALL,
MessageType.INCOMING_FILE,
MessageType.INCOMING_IMAGE,
MessageType.INCOMING_AUDIO,
MessageType.INCOMING_VIDEO -> v.findViewById(R.id.photo)
else -> null
}
val mImage: ImageView? = when (type) {
MessageType.INCOMING_IMAGE,
MessageType.OUTGOING_IMAGE -> v.findViewById(R.id.image)
MessageType.INCOMING_TEXT_MESSAGE,
MessageType.OUTGOING_TEXT_MESSAGE -> v.findViewById(R.id.link_preview_img)
MessageType.CONTACT_EVENT -> v.findViewById(R.id.imageView)
else -> null
}
val mStatusIcon: MessageStatusView? = when (type) {
MessageType.OUTGOING_CALL_INFORMATION,
MessageType.OUTGOING_TEXT_MESSAGE,
MessageType.OUTGOING_FILE,
MessageType.OUTGOING_IMAGE,
MessageType.OUTGOING_AUDIO,
MessageType.OUTGOING_VIDEO -> v.findViewById(R.id.status_icon)
else -> null
}
val mTypingIndicatorLayout: FrameLayout? = v.findViewById(R.id.typing_indicator_layout)
var mPeerDisplayName: TextView? = when (type){
MessageType.INCOMING_CALL_INFORMATION,
MessageType.ONGOING_GROUP_CALL -> v.findViewById(R.id.msg_display_name)
MessageType.INCOMING_FILE,
MessageType.INCOMING_TEXT_MESSAGE -> v.findViewById(R.id.peer_name)
else -> null
}
var mMessageBubble: ConstraintLayout? = null
var mMessageLayout: ConstraintLayout? = null
var mMessageBubbleBorder: FrameLayout? = null
var mMessageContent: CustomMessageBubble? = null
var mReplyBubble: LinearLayout? = null
var mReplyName: TextView? = null
var mReplyTxt: TextView? = null
val reactionChip: TextView? = v.findViewById(R.id.reaction_chip)
val mIcon: ImageView? = when (type) {
MessageType.INCOMING_CALL_INFORMATION,
MessageType.OUTGOING_CALL_INFORMATION -> v.findViewById(R.id.call_icon)
MessageType.INCOMING_FILE,
MessageType.OUTGOING_FILE -> v.findViewById(R.id.file_icon)
MessageType.COMPOSING_INDICATION -> v.findViewById(R.id.status_icon)
else -> null
}
var mHistTxt: TextView? = null
var mHistDetailTxt: TextView? = null
var mPreviewDomain: TextView? = null
var mLayout: View? = null
var mAnswerLayout: ViewGroup? = null
// Ongoing call
var mCallLayout: LinearLayout? = null
var mGroupCallLayout: LinearLayout? = null
var mCallInfoLayout: LinearLayout? = null
var mAcceptCallVideoButton: ImageButton? = null
var mAcceptCallAudioButton: ImageButton? = null
var btnAccept: View? = null
var btnRefuse: View? = null
var progress: ContentLoadingProgressBar? = null
val video: TextureView? = when (type) {
MessageType.INCOMING_VIDEO,
MessageType.OUTGOING_VIDEO -> v.findViewById(R.id.video)
else -> null
}
var mMsgLayout: ViewGroup? = null
var mCallInfoText: TextView? = null
var mCallAcceptLayout: LinearLayout? = null
var mFileInfoLayout: ConstraintLayout? = null
var mFileSize: TextView? = null
var mFileTime: TextView? = null
var mFileTitle: TextView? = null
var mFileDownloadButton: ImageButton? = null
var mAudioInfoLayout: LinearLayout? = null
val mLayoutStatusIconId: View? = when (type) {
MessageType.OUTGOING_CALL_INFORMATION,
MessageType.INCOMING_CALL_INFORMATION -> v.findViewById(R.id.callLayout)
MessageType.ONGOING_GROUP_CALL -> v.findViewById(R.id.msg_layout)
MessageType.INCOMING_TEXT_MESSAGE,
MessageType.OUTGOING_TEXT_MESSAGE -> v.findViewById(R.id.msg_txt)
MessageType.INCOMING_FILE,
MessageType.OUTGOING_FILE -> v.findViewById(R.id.file_layout)
MessageType.INCOMING_IMAGE,
MessageType.OUTGOING_IMAGE -> v.findViewById(R.id.image)
MessageType.INCOMING_AUDIO,
MessageType.OUTGOING_AUDIO -> v.findViewById(R.id.audioInfoLayout)
MessageType.INCOMING_VIDEO,
MessageType.OUTGOING_VIDEO -> v.findViewById(R.id.video_frame)
else -> null
}
var player: MediaPlayer? = null
var surface: Surface? = null
var animator: ValueAnimator? = null
val compositeDisposable = CompositeDisposable()
var primaryClickableView: View? = null
init {
when (type) {
MessageType.CONTACT_EVENT -> {
mMsgTxt = v.findViewById(R.id.contact_event_txt)
mMsgDetailTxt = v.findViewById(R.id.contact_event_details_txt)
primaryClickableView = v.findViewById(R.id.contactDetailsGroup)
}
MessageType.OUTGOING_CALL_INFORMATION,
MessageType.INCOMING_CALL_INFORMATION -> {
mHistTxt = v.findViewById(R.id.call_hist_txt)
mHistDetailTxt = v.findViewById(R.id.call_details_txt)
mCallInfoLayout = v.findViewById(R.id.callInfoLayout)
mCallLayout = v.findViewById(R.id.callLayout)
mMsgDetailTxtPerm = v.findViewById(R.id.msg_details_txt_perm)
primaryClickableView = mCallInfoLayout
}
MessageType.ONGOING_GROUP_CALL -> {
mMsgLayout = v.findViewById(R.id.msg_layout)
mGroupCallLayout = v.findViewById(R.id.groupCallLayout)
mCallInfoText = v.findViewById(R.id.call_info_text)
mCallAcceptLayout = v.findViewById(R.id.callAcceptLayout)
mAcceptCallAudioButton = v.findViewById(R.id.acceptCallAudioButton)
mAcceptCallVideoButton = v.findViewById(R.id.acceptCallVideoButton)
}
MessageType.INCOMING_TEXT_MESSAGE,
MessageType.OUTGOING_TEXT_MESSAGE -> {
mReplyName = v.findViewById(R.id.reply_name)
mReplyBubble = v.findViewById(R.id.reply_bubble)
mReplyTxt = v.findViewById(R.id.reply_text)
mMsgTxt = v.findViewById(R.id.msg_txt)
mMessageBubble = v.findViewById(R.id.message_bubble)
mMessageBubbleBorder = v.findViewById(R.id.message_bubble_border)
mMessageLayout = v.findViewById(R.id.message_layout)
mMessageContent = v.findViewById(R.id.message_content)
mMsgDetailTxt = v.findViewById(R.id.msg_details_txt)
mMsgDetailTxtPerm = v.findViewById(R.id.message_time_permanent)
mAnswerLayout = v.findViewById(R.id.link_preview)
mHistTxt = v.findViewById(R.id.link_preview_title)
mHistDetailTxt = v.findViewById(R.id.link_preview_description)
mPreviewDomain = v.findViewById(R.id.link_preview_domain)
primaryClickableView = mMsgTxt
}
MessageType.INCOMING_FILE,
MessageType.OUTGOING_FILE -> {
mFileTitle = v.findViewById(R.id.file_title)
mFileSize = v.findViewById(R.id.file_size)
mFileTime = v.findViewById(R.id.file_time)
mLayout = v.findViewById(R.id.file_layout)
mFileInfoLayout = v.findViewById(R.id.fileInfoLayout)
progress = v.findViewById(R.id.file_download_progress)
mFileDownloadButton = v.findViewById(R.id.file_download_button)
mMsgDetailTxtPerm = v.findViewById(R.id.message_time_permanent)
primaryClickableView = mFileInfoLayout
}
MessageType.INCOMING_IMAGE,
MessageType.OUTGOING_IMAGE -> {
mAnswerLayout = v.findViewById(R.id.imageLayout)
mMsgDetailTxtPerm = v.findViewById(R.id.msg_details_txt_perm)
mMsgDetailTxt = v.findViewById(R.id.msg_details_txt)
primaryClickableView = mImage
}
MessageType.INCOMING_AUDIO,
MessageType.OUTGOING_AUDIO -> {
btnAccept = v.findViewById(R.id.play)
btnRefuse = v.findViewById(R.id.replay)
mMsgTxt = v.findViewById(R.id.msg_txt)
mAudioInfoLayout = v.findViewById(R.id.audioInfoLayout)
mMsgDetailTxt = v.findViewById(R.id.file_details_txt)
mMsgDetailTxtPerm = v.findViewById(R.id.msg_details_txt_perm)
primaryClickableView = mAudioInfoLayout
}
MessageType.INCOMING_VIDEO,
MessageType.OUTGOING_VIDEO -> {
mLayout = v.findViewById(R.id.video_frame)
mAnswerLayout = v.findViewById(R.id.imageLayout)
mMsgDetailTxt = v.findViewById(R.id.msg_details_txt)
mMsgDetailTxtPerm = v.findViewById(R.id.msg_details_txt_perm)
primaryClickableView = video
}
else -> {}
}
}
}