Advertisement
Guest User

Untitled

a guest
Nov 15th, 2019
131
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 10.81 KB | None | 0 0
  1. package com.example.kalam_android.view.adapter
  2.  
  3. import android.annotation.SuppressLint
  4. import android.content.Context
  5. import android.media.AudioAttributes
  6. import android.media.AudioManager
  7. import android.media.MediaPlayer
  8. import android.os.Handler
  9. import android.view.Gravity
  10. import android.view.LayoutInflater
  11. import android.view.View
  12. import android.view.ViewGroup
  13. import android.widget.SeekBar
  14. import androidx.core.content.ContextCompat
  15. import androidx.databinding.DataBindingUtil
  16. import androidx.recyclerview.widget.RecyclerView
  17. import com.example.kalam_android.R
  18. import com.example.kalam_android.databinding.ItemChatRightBinding
  19. import com.example.kalam_android.repository.model.ChatData
  20. import com.example.kalam_android.util.AppConstants
  21. import com.example.kalam_android.util.Debugger
  22. import com.example.kalam_android.util.showAlertDialoge
  23. import com.example.kalam_android.wrapper.GlideDownloder
  24. import kotlinx.android.synthetic.main.audio_player_item.view.*
  25.  
  26.  
  27. class ChatMessagesAdapter(val context: Context, private val userId: String) :
  28. RecyclerView.Adapter<RecyclerView.ViewHolder>() {
  29.  
  30. private var handler: Handler = Handler()
  31. private lateinit var runnable: Runnable
  32. private var currentPos = -1
  33. private var prePos = -1
  34. private lateinit var mediaPlayer: MediaPlayer
  35. private var chatList: ArrayList<ChatData>? = ArrayList()
  36. private val TAG = this.javaClass.simpleName
  37. private var isRelease = false
  38.  
  39. fun updateList(list: ArrayList<ChatData>) {
  40. chatList?.addAll(list)
  41. notifyDataSetChanged()
  42. }
  43.  
  44. fun updateIdentifier(identifier: String) {
  45. chatList?.let {
  46. for (x in it) {
  47. if (x.identifier == identifier) {
  48. x.identifier = ""
  49. notifyDataSetChanged()
  50. }
  51. }
  52. }
  53. }
  54.  
  55. fun addMessage(message: ChatData) {
  56. chatList?.add(0, message)
  57. notifyItemInserted(0)
  58. }
  59.  
  60. override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder {
  61. return MyHolder(
  62. DataBindingUtil.inflate(
  63. LayoutInflater.from(parent.context),
  64. R.layout.item_chat_right,
  65. parent,
  66. false
  67. )
  68. )
  69. }
  70.  
  71. override fun getItemCount(): Int {
  72. return chatList?.size ?: 0
  73. }
  74.  
  75. @SuppressLint("ResourceAsColor")
  76. override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) {
  77. val itemHolder = holder as MyHolder
  78. val item = chatList?.get(position)
  79. when (item?.type) {
  80. AppConstants.TEXT_MESSAGE -> {
  81. itemHolder.binding.audioPlayer.cvPlayer.visibility = View.GONE
  82. itemHolder.binding.itemChat.rlMessage.visibility = View.VISIBLE
  83. itemHolder.binding.imageHolder.rlImageItem.visibility = View.GONE
  84. itemHolder.binding.itemChat.tvMessage.text = item.message
  85. itemHolder.binding.itemChat.llOriginal.setOnClickListener {
  86. showAlertDialoge(context, "Original Message", item.original_message.toString())
  87. }
  88. if (item.sender_id == userId.toInt()) {
  89. itemHolder.binding.itemChat.rlMessage.gravity = Gravity.END
  90. itemHolder.binding.itemChat.tvMessage.setTextColor(
  91. ContextCompat.getColor(
  92. context,
  93. R.color.white
  94. )
  95. )
  96. itemHolder.binding.itemChat.tvTime.setTextColor(
  97. ContextCompat.getColor(
  98. context,
  99. R.color.white
  100. )
  101. )
  102. itemHolder.binding.itemChat.ivMessage.setBackgroundResource(R.drawable.icon_send_message)
  103. itemHolder.binding.itemChat.view.setBackgroundResource(R.color.white)
  104. itemHolder.binding.itemChat.tvOriginal.setTextColor(
  105. ContextCompat.getColor(
  106. context,
  107. R.color.white
  108. )
  109. )
  110. } else {
  111. itemHolder.binding.itemChat.rlMessage.gravity = Gravity.START
  112. itemHolder.binding.itemChat.tvMessage.setTextColor(
  113. ContextCompat.getColor(
  114. context,
  115. R.color.black
  116. )
  117. )
  118. itemHolder.binding.itemChat.ivMessage.setBackgroundResource(R.drawable.icon_receive_message)
  119. itemHolder.binding.itemChat.tvTime.setTextColor(
  120. ContextCompat.getColor(
  121. context,
  122. R.color.black
  123. )
  124. )
  125. itemHolder.binding.itemChat.view.setBackgroundResource(R.color.black)
  126. itemHolder.binding.itemChat.tvOriginal.setTextColor(
  127. ContextCompat.getColor(
  128. context,
  129. R.color.black
  130. )
  131. )
  132. }
  133. }
  134. AppConstants.AUDIO_MESSAGE -> {
  135. logE("Identifier: ${item.identifier}")
  136. if (item.identifier.isNullOrEmpty()) {
  137. itemHolder.binding.audioPlayer.tvTime.text = "3:15 pm"
  138. } else {
  139. itemHolder.binding.audioPlayer.tvTime.text = "Uploading Audio..."
  140. }
  141. itemHolder.binding.audioPlayer.cvPlayer.visibility = View.VISIBLE
  142. itemHolder.binding.itemChat.rlMessage.visibility = View.GONE
  143. itemHolder.binding.imageHolder.rlImageItem.visibility = View.GONE
  144. itemHolder.binding.audioPlayer.rlPlay.setOnClickListener {
  145. currentPos = position
  146. playVoiceMsg(itemHolder.binding, item.audio_url.toString())
  147. }
  148. if (item.sender_id == userId.toInt()) {
  149. itemHolder.binding.audioPlayer.rlAudioItem.gravity = Gravity.END
  150. itemHolder.binding.audioPlayer.cvPlayer.setBackgroundResource(R.drawable.audio_bubble_right)
  151. } else {
  152. itemHolder.binding.audioPlayer.rlAudioItem.gravity = Gravity.START
  153. itemHolder.binding.audioPlayer.cvPlayer.setBackgroundResource(R.drawable.audio_bubble_left)
  154. }
  155. }
  156. AppConstants.IMAGE_MESSAGE -> {
  157. logE("Identifier: ${item.identifier}")
  158. if (item.identifier.isNullOrEmpty()) {
  159. itemHolder.binding.imageHolder.tvTime.text = "3:15 pm"
  160. } else {
  161. itemHolder.binding.imageHolder.tvTime.text = "Uploading Image..."
  162. }
  163. itemHolder.binding.audioPlayer.cvPlayer.visibility = View.GONE
  164. itemHolder.binding.itemChat.rlMessage.visibility = View.GONE
  165. itemHolder.binding.imageHolder.rlImageItem.visibility = View.VISIBLE
  166. GlideDownloder.load(
  167. context,
  168. itemHolder.binding.imageHolder.ivImage,
  169. item.file.toString(),
  170. R.drawable.dummy_placeholder,
  171. R.drawable.dummy_placeholder
  172. )
  173. if (item.sender_id == userId.toInt()) {
  174. itemHolder.binding.imageHolder.rlImageItem.gravity = Gravity.END
  175. } else {
  176. itemHolder.binding.imageHolder.rlImageItem.gravity = Gravity.END
  177. }
  178. }
  179. }
  180. }
  181.  
  182. inner class MyHolder(val binding: ItemChatRightBinding) :
  183. RecyclerView.ViewHolder(binding.root)
  184.  
  185. private fun playVoiceMsg(binding: ItemChatRightBinding, voiceMessage: String) {
  186. try {
  187. if (isRelease || currentPos != prePos) {
  188. binding.audioPlayer.ivPlayPause.visibility = View.GONE
  189. binding.audioPlayer.ivPlayProgress.visibility = View.VISIBLE
  190. prePos = currentPos
  191. mediaPlayer = MediaPlayer()
  192. mediaPlayer.setAudioAttributes(
  193. AudioAttributes
  194. .Builder()
  195. .setContentType(AudioAttributes.CONTENT_TYPE_MUSIC)
  196. .setLegacyStreamType(AudioManager.STREAM_MUSIC)
  197. .build()
  198. )
  199. isRelease = false
  200. mediaPlayer.setDataSource(voiceMessage)
  201. mediaPlayer.prepareAsync()
  202. mediaPlayer.setOnPreparedListener {
  203. binding.audioPlayer.ivPlayPause.visibility = View.VISIBLE
  204. binding.audioPlayer.ivPlayPause.setBackgroundResource(R.drawable.ic_pause_audio)
  205. binding.audioPlayer.ivPlayProgress.visibility = View.GONE
  206. mediaPlayer.start()
  207. initializeSeekBar(binding)
  208. }
  209. } else {
  210. if (!mediaPlayer.isPlaying) {
  211. binding.audioPlayer.ivPlayPause.setBackgroundResource(R.drawable.ic_pause_audio)
  212. mediaPlayer.start()
  213. } else {
  214. binding.audioPlayer.ivPlayPause.setBackgroundResource(R.drawable.ic_play_audio)
  215. mediaPlayer.pause()
  216. }
  217. }
  218.  
  219. } catch (e: IllegalStateException) {
  220. logE("exception:${e.message}")
  221. }
  222.  
  223. mediaPlayer.setOnCompletionListener { mp ->
  224. binding.audioPlayer.ivPlayPause.setBackgroundResource(R.drawable.ic_play_audio)
  225. mp.stop()
  226. mp.release()
  227. isRelease = true
  228. binding.audioPlayer.seekBar.max = 0
  229. }
  230.  
  231. binding.audioPlayer.seekBar.setOnSeekBarChangeListener(object :
  232. SeekBar.OnSeekBarChangeListener {
  233. override fun onProgressChanged(seekBar: SeekBar?, progress: Int, fromUser: Boolean) {
  234. if (fromUser) {
  235. mediaPlayer.seekTo(progress * 1000)
  236. }
  237. }
  238.  
  239. override fun onStartTrackingTouch(seekBar: SeekBar?) {
  240. }
  241.  
  242. override fun onStopTrackingTouch(seekBar: SeekBar?) {
  243. }
  244. })
  245.  
  246. }
  247.  
  248. private fun initializeSeekBar(binding: ItemChatRightBinding) {
  249. binding.audioPlayer.seekBar.max = mediaPlayer.duration
  250. runnable = Runnable {
  251.  
  252. try {
  253. val currentSeconds = mediaPlayer.currentPosition
  254. currentSeconds.let {
  255. binding.audioPlayer.seekBar.progress = it
  256. }
  257. handler.postDelayed(runnable, 1)
  258. } catch (e: IllegalStateException) {
  259.  
  260. }
  261. }
  262. handler.postDelayed(runnable, 1)
  263. }
  264.  
  265.  
  266. private fun logE(msg: String) {
  267. Debugger.e(TAG, msg)
  268. }
  269. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement