Created
July 27, 2019 21:06
-
-
Save AlexPrestonSB/3c3405c83f0a8d28fae808fafacbee60 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
class GroupChannelChatAdapter(context: Context, listener: OnItemClickListener) : | |
RecyclerView.Adapter<RecyclerView.ViewHolder>() { | |
private var messages: MutableList<BaseMessage> | |
private var context: Context | |
private var listener: OnItemClickListener | |
init { | |
messages = ArrayList() | |
this.context = context | |
this.listener = listener | |
} | |
fun insert(messageList: MutableList<BaseMessage>) { | |
for (message in messageList) { | |
val index = SyncManagerUtil.findIndexOfMessage(messages, message) | |
this.messages.add(index, message) | |
notifyItemInserted(index) | |
} | |
} | |
fun update(messageList: MutableList<BaseMessage>) { | |
for (message in messageList) { | |
val index = SyncManagerUtil.findIndexOfMessage(messages, message) | |
if (index != -1) { | |
this.messages.add(index, message) | |
notifyItemChanged(index) | |
} | |
} | |
} | |
fun remove(messageList: MutableList<BaseMessage>) { | |
for (message in messageList) { | |
val index = SyncManagerUtil.findIndexOfMessage(messages, message) | |
if (index != -1) { | |
this.messages.removeAt(index) | |
notifyItemRemoved(index) | |
} | |
} | |
} | |
fun clear() { | |
messages.clear() | |
notifyDataSetChanged() | |
} | |
override fun onCreateViewHolder( | |
parent: ViewGroup, | |
viewType: Int | |
): RecyclerView.ViewHolder { | |
val layoutInflater = LayoutInflater.from(parent.context) | |
when (viewType) { | |
AppConstants.VIEW_TYPE_LOCATION_ME -> { | |
return MyLocationHolder(layoutInflater.inflate(R.layout.item_gchat_map_me, parent, false)) | |
} | |
AppConstants.VIEW_TYPE_LOCATION_OTHER -> { | |
return OtherLocationHolder(layoutInflater.inflate(R.layout.item_gchat_map_other, parent, false)) | |
} | |
} | |
} | |
override fun getItemViewType(position: Int): Int { | |
val message = messages.get(position) | |
when (message) { | |
is UserMessage -> { | |
return if (message.sender.userId == SendBird.getCurrentUser().userId) { | |
if (message.customType == "location") { | |
AppConstants.VIEW_TYPE_LOCATION_ME | |
} | |
} else { | |
if (message.customType == "location") { | |
AppConstants.VIEW_TYPE_LOCATION_OTHER | |
} | |
} | |
} | |
else -> return -1 | |
} | |
} | |
override fun getItemCount() = messages.size | |
override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) { | |
val message = messages.get(position) | |
var isNewDay = false | |
when { | |
(position < messages.size - 1) -> { | |
val previousMessage = messages.get(position + 1) | |
isNewDay = !DateUtil.isSameDay(message.createdAt, previousMessage.createdAt) | |
} | |
(position == messages.size - 1) -> { | |
isNewDay = true | |
} | |
} | |
when (holder.itemViewType) { | |
AppConstants.VIEW_TYPE_LOCATION_ME -> { | |
holder as MyLocationHolder | |
holder.bindView(context, messages.get(position) as UserMessage, isNewDay) | |
} | |
AppConstants.VIEW_TYPE_LOCATION_OTHER -> { | |
holder as OtherLocationHolder | |
holder.bindView(context, messages.get(position) as UserMessage, isNewDay) | |
} | |
} | |
} | |
} | |
itemView.setOnClickListener { | |
listener.onFileMessageClicked(message) | |
} | |
} | |
} | |
class MyLocationHolder(view: View) : RecyclerView.ViewHolder(view), OnMapReadyCallback { | |
private lateinit var map: GoogleMap | |
private lateinit var context: Context | |
private lateinit var latLng: LatLng | |
private var longitude = 0.0 | |
private var latitude = 0.0 | |
private val mapView = view.map_gchat_me | |
private val date = view.text_gchat_map_date_me | |
private val timestamp = view.text_gchat_map_timestamp_me | |
/** Initialises the MapView by calling its lifecycle methods */ | |
init { | |
with(mapView) { | |
// Initialise the MapView | |
onCreate(null) | |
// Set the map ready callback to receive the GoogleMap object | |
getMapAsync(this@MyLocationHolder) | |
} | |
} | |
fun bindView(context: Context, message: UserMessage, isNewDay: Boolean) { | |
this.context = context | |
timestamp.text = DateUtil.formatTime(message.createdAt) | |
val cords = message.message.split(",") | |
longitude = cords[0].toDouble() | |
latitude = cords[1].toDouble() | |
latLng = LatLng(latitude, longitude) | |
if (isNewDay) { | |
date.visibility = View.VISIBLE | |
date.text = DateUtil.formatDate(message.createdAt) | |
} else { | |
date.visibility = View.GONE | |
} | |
setLocation() | |
} | |
override fun onMapReady(googleMap: GoogleMap?) { | |
MapsInitializer.initialize(context.applicationContext) | |
map = googleMap ?: return | |
setLocation() | |
} | |
private fun setLocation() { | |
if (!::map.isInitialized) return | |
with(map) { | |
moveCamera(CameraUpdateFactory.newLatLngZoom(latLng, 11f)) | |
addMarker(MarkerOptions().position(latLng)) | |
mapType = GoogleMap.MAP_TYPE_NORMAL | |
} | |
mapView.onResume() | |
} | |
} | |
class OtherLocationHolder(view: View) : RecyclerView.ViewHolder(view), OnMapReadyCallback { | |
private lateinit var map: GoogleMap | |
private lateinit var context: Context | |
private lateinit var latLng: LatLng | |
private var longitude = 0.0 | |
private var latitude = 0.0 | |
private val mapView = view.map_gchat_other | |
private val date = view.text_gchat_map_date_other | |
private val timestamp = view.text_gchat_map_timestamp_other | |
private val profileImage = view.image_gchat_map_profile_other | |
private val username = view.text_gchat_map_user_other | |
/** Initialises the MapView by calling its lifecycle methods */ | |
init { | |
with(mapView) { | |
// Initialise the MapView | |
onCreate(null) | |
// Set the map ready callback to receive the GoogleMap object | |
getMapAsync(this@OtherLocationHolder) | |
} | |
} | |
fun bindView(context: Context, message: UserMessage, isNewDay: Boolean) { | |
this.context = context | |
val cords = message.message.split(",") | |
longitude = cords[0].toDouble() | |
latitude = cords[1].toDouble() | |
latLng = LatLng(latitude, longitude) | |
username.text = message.sender.nickname | |
timestamp.text = DateUtil.formatTime(message.createdAt) | |
Glide.with(context).load(message.sender.profileUrl).apply(RequestOptions().override(75, 75)) | |
.into(profileImage) | |
if (isNewDay) { | |
date.visibility = View.VISIBLE | |
date.text = DateUtil.formatDate(message.createdAt) | |
} else { | |
date.visibility = View.GONE | |
} | |
setLocation() | |
} | |
override fun onMapReady(googleMap: GoogleMap?) { | |
MapsInitializer.initialize(context.applicationContext) | |
map = googleMap ?: return | |
setLocation() | |
} | |
private fun setLocation() { | |
if (!::map.isInitialized) return | |
with(map) { | |
moveCamera(com.google.android.gms.maps.CameraUpdateFactory.newLatLngZoom(latLng, 11f)) | |
addMarker(com.google.android.gms.maps.model.MarkerOptions().position(latLng)) | |
mapType = com.google.android.gms.maps.GoogleMap.MAP_TYPE_NORMAL | |
} | |
mapView.onResume() | |
} | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment