2018-06-28 14:53:13 +02:00
|
|
|
package net.osmand.telegram.helpers
|
|
|
|
|
|
|
|
import android.graphics.Bitmap
|
|
|
|
import android.graphics.drawable.Drawable
|
|
|
|
import android.widget.ImageView
|
2018-07-06 17:44:23 +02:00
|
|
|
import net.osmand.data.LatLon
|
2018-06-28 14:53:13 +02:00
|
|
|
import net.osmand.telegram.R
|
|
|
|
import net.osmand.telegram.TelegramApplication
|
2018-07-05 19:42:29 +02:00
|
|
|
import net.osmand.telegram.helpers.TelegramHelper.MessageOsmAndBotLocation
|
|
|
|
import org.drinkless.td.libcore.telegram.TdApi
|
2018-06-28 14:53:13 +02:00
|
|
|
|
|
|
|
object TelegramUiHelper {
|
|
|
|
|
2018-07-05 19:42:29 +02:00
|
|
|
fun setupPhoto(
|
|
|
|
app: TelegramApplication,
|
|
|
|
iv: ImageView?,
|
|
|
|
photoPath: String?,
|
2018-07-13 17:56:26 +02:00
|
|
|
placeholderId: Int,
|
|
|
|
useThemedIcon: Boolean
|
2018-07-05 19:42:29 +02:00
|
|
|
) {
|
2018-06-28 14:53:13 +02:00
|
|
|
if (iv == null) {
|
|
|
|
return
|
|
|
|
}
|
|
|
|
var drawable: Drawable? = null
|
|
|
|
var bitmap: Bitmap? = null
|
|
|
|
if (photoPath != null && photoPath.isNotEmpty()) {
|
|
|
|
bitmap = app.uiUtils.getCircleBitmap(photoPath)
|
|
|
|
}
|
|
|
|
if (bitmap == null) {
|
2018-07-13 17:45:24 +02:00
|
|
|
drawable = if (useThemedIcon) {
|
|
|
|
app.uiUtils.getThemedIcon(placeholderId)
|
|
|
|
} else {
|
|
|
|
app.uiUtils.getIcon(placeholderId)
|
|
|
|
}
|
2018-06-28 14:53:13 +02:00
|
|
|
}
|
|
|
|
if (bitmap != null) {
|
|
|
|
iv.setImageBitmap(bitmap)
|
|
|
|
} else {
|
|
|
|
iv.setImageDrawable(drawable)
|
|
|
|
}
|
|
|
|
}
|
2018-07-05 19:42:29 +02:00
|
|
|
|
2018-07-06 15:02:52 +02:00
|
|
|
fun chatToChatItem(
|
|
|
|
helper: TelegramHelper,
|
|
|
|
chat: TdApi.Chat,
|
|
|
|
messages: List<TdApi.Message>
|
|
|
|
): ChatItem {
|
|
|
|
val res = ChatItem().apply {
|
2018-07-13 13:02:59 +02:00
|
|
|
chatId = chat.id
|
2018-07-10 11:52:44 +02:00
|
|
|
chatTitle = chat.title
|
2018-07-06 15:02:52 +02:00
|
|
|
photoPath = chat.photo?.small?.local?.path
|
2018-07-13 17:56:26 +02:00
|
|
|
placeholderId = R.drawable.img_user_picture
|
2018-07-06 15:02:52 +02:00
|
|
|
}
|
2018-07-10 14:08:25 +02:00
|
|
|
val type = chat.type
|
2018-08-03 17:53:21 +02:00
|
|
|
val message = messages.firstOrNull()
|
|
|
|
if (message != null) {
|
2018-08-16 10:31:28 +02:00
|
|
|
val lastUpdated = message.editDate
|
|
|
|
res.lastUpdated = if (lastUpdated != 0) {
|
|
|
|
lastUpdated
|
|
|
|
} else {
|
|
|
|
message.date
|
|
|
|
}
|
2018-08-15 16:00:58 +02:00
|
|
|
res.created = message.date
|
2018-08-03 17:53:21 +02:00
|
|
|
}
|
2018-07-10 14:08:25 +02:00
|
|
|
if (type is TdApi.ChatTypePrivate || type is TdApi.ChatTypeSecret) {
|
|
|
|
val userId = getUserIdFromChatType(type)
|
|
|
|
val chatWithBot = helper.isBot(userId)
|
|
|
|
res.privateChat = true
|
|
|
|
res.chatWithBot = chatWithBot
|
|
|
|
if (!chatWithBot) {
|
|
|
|
res.userId = userId
|
2018-08-03 17:53:21 +02:00
|
|
|
val content = message?.content
|
2018-07-10 14:08:25 +02:00
|
|
|
if (content is TdApi.MessageLocation) {
|
|
|
|
res.latLon = LatLon(content.location.latitude, content.location.longitude)
|
|
|
|
}
|
2018-07-06 15:02:52 +02:00
|
|
|
}
|
2018-07-10 14:08:25 +02:00
|
|
|
} else if (type is TdApi.ChatTypeBasicGroup) {
|
2018-07-13 17:05:47 +02:00
|
|
|
res.placeholderId = R.drawable.img_group_picture
|
2018-07-10 14:08:25 +02:00
|
|
|
res.membersCount = helper.getBasicGroupFullInfo(type.basicGroupId)?.members?.size ?: 0
|
|
|
|
} else if (type is TdApi.ChatTypeSupergroup) {
|
2018-07-13 17:05:47 +02:00
|
|
|
res.placeholderId = R.drawable.img_group_picture
|
2018-07-10 14:08:25 +02:00
|
|
|
res.membersCount = helper.getSupergroupFullInfo(type.supergroupId)?.memberCount ?: 0
|
2018-07-06 15:02:52 +02:00
|
|
|
}
|
2018-07-10 14:08:25 +02:00
|
|
|
if (!res.privateChat) {
|
|
|
|
res.liveMembersCount = messages.size
|
|
|
|
}
|
|
|
|
|
2018-07-06 15:02:52 +02:00
|
|
|
return res
|
|
|
|
}
|
|
|
|
|
2018-07-10 14:08:25 +02:00
|
|
|
private fun getUserIdFromChatType(type: TdApi.ChatType) = when (type) {
|
|
|
|
is TdApi.ChatTypePrivate -> type.userId
|
|
|
|
is TdApi.ChatTypeSecret -> type.userId
|
|
|
|
else -> 0
|
|
|
|
}
|
|
|
|
|
2018-08-09 21:00:18 +02:00
|
|
|
fun getUserName(user: TdApi.User): String {
|
|
|
|
var name = "${user.firstName} ${user.lastName}".trim()
|
|
|
|
if (name.isEmpty()) {
|
|
|
|
name = user.username
|
|
|
|
}
|
|
|
|
if (name.isEmpty()) {
|
|
|
|
name = user.phoneNumber
|
|
|
|
}
|
|
|
|
return name
|
|
|
|
}
|
|
|
|
|
2018-07-09 17:51:04 +02:00
|
|
|
fun messageToLocationItem(
|
|
|
|
helper: TelegramHelper,
|
|
|
|
chat: TdApi.Chat,
|
|
|
|
message: TdApi.Message
|
|
|
|
): LocationItem? {
|
2018-07-05 19:42:29 +02:00
|
|
|
val content = message.content
|
|
|
|
return when (content) {
|
2018-07-09 17:51:04 +02:00
|
|
|
is MessageOsmAndBotLocation -> botMessageToLocationItem(chat, content)
|
|
|
|
is TdApi.MessageLocation -> locationMessageToLocationItem(helper, chat, message)
|
2018-07-05 19:42:29 +02:00
|
|
|
else -> null
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2018-07-09 17:51:04 +02:00
|
|
|
private fun botMessageToLocationItem(
|
|
|
|
chat: TdApi.Chat,
|
|
|
|
content: MessageOsmAndBotLocation
|
|
|
|
): LocationItem? {
|
2018-07-05 19:42:29 +02:00
|
|
|
return if (content.isValid()) {
|
|
|
|
LocationItem().apply {
|
2018-07-13 13:02:59 +02:00
|
|
|
chatId = chat.id
|
2018-07-09 17:51:04 +02:00
|
|
|
chatTitle = chat.title
|
2018-07-05 19:42:29 +02:00
|
|
|
name = content.name
|
2018-07-06 17:44:23 +02:00
|
|
|
latLon = LatLon(content.lat, content.lon)
|
2018-07-12 15:38:20 +02:00
|
|
|
placeholderId = R.drawable.img_user_picture
|
2018-08-06 15:44:13 +02:00
|
|
|
lastUpdated = content.lastUpdated
|
2018-08-15 16:00:58 +02:00
|
|
|
created = content.created
|
2018-07-05 19:42:29 +02:00
|
|
|
}
|
|
|
|
} else {
|
|
|
|
null
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
private fun locationMessageToLocationItem(
|
|
|
|
helper: TelegramHelper,
|
2018-07-09 17:51:04 +02:00
|
|
|
chat: TdApi.Chat,
|
2018-07-05 19:42:29 +02:00
|
|
|
message: TdApi.Message
|
|
|
|
): LocationItem? {
|
|
|
|
val user = helper.getUser(message.senderUserId) ?: return null
|
|
|
|
val content = message.content as TdApi.MessageLocation
|
|
|
|
return LocationItem().apply {
|
2018-07-13 13:02:59 +02:00
|
|
|
chatId = chat.id
|
2018-07-09 17:51:04 +02:00
|
|
|
chatTitle = chat.title
|
2018-08-09 21:00:18 +02:00
|
|
|
name = TelegramUiHelper.getUserName(user)
|
2018-07-06 17:44:23 +02:00
|
|
|
latLon = LatLon(content.location.latitude, content.location.longitude)
|
2018-07-05 19:42:29 +02:00
|
|
|
photoPath = helper.getUserPhotoPath(user)
|
2018-07-12 15:38:20 +02:00
|
|
|
placeholderId = R.drawable.img_user_picture
|
2018-07-10 11:52:44 +02:00
|
|
|
userId = message.senderUserId
|
2018-08-16 10:31:28 +02:00
|
|
|
val editDate = message.editDate
|
|
|
|
lastUpdated = if (editDate != 0) {
|
|
|
|
editDate
|
|
|
|
} else {
|
|
|
|
message.date
|
|
|
|
}
|
2018-08-15 16:00:58 +02:00
|
|
|
created = message.date
|
2018-07-05 19:42:29 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2018-07-10 11:52:44 +02:00
|
|
|
abstract class ListItem {
|
|
|
|
|
2018-07-13 13:02:59 +02:00
|
|
|
var chatId: Long = 0
|
|
|
|
internal set
|
2018-07-10 11:52:44 +02:00
|
|
|
var chatTitle: String = ""
|
2018-07-06 15:02:52 +02:00
|
|
|
internal set
|
2018-07-06 17:44:23 +02:00
|
|
|
var latLon: LatLon? = null
|
2018-07-06 15:02:52 +02:00
|
|
|
internal set
|
|
|
|
var photoPath: String? = null
|
|
|
|
internal set
|
|
|
|
var placeholderId: Int = 0
|
|
|
|
internal set
|
2018-07-09 17:51:04 +02:00
|
|
|
var userId: Int = 0
|
|
|
|
internal set
|
2018-08-06 13:20:18 +02:00
|
|
|
var lastUpdated: Int = 0
|
2018-08-03 17:53:21 +02:00
|
|
|
internal set
|
2018-08-15 16:00:58 +02:00
|
|
|
var created: Int = 0
|
|
|
|
internal set
|
2018-07-09 17:51:04 +02:00
|
|
|
|
2018-07-10 11:52:44 +02:00
|
|
|
abstract fun canBeOpenedOnMap(): Boolean
|
|
|
|
|
|
|
|
abstract fun getMapPointId(): String
|
2018-07-11 13:32:02 +02:00
|
|
|
|
|
|
|
abstract fun getVisibleName(): String
|
2018-07-06 15:02:52 +02:00
|
|
|
}
|
|
|
|
|
2018-07-10 11:52:44 +02:00
|
|
|
class ChatItem : ListItem() {
|
|
|
|
|
2018-07-10 14:08:25 +02:00
|
|
|
var privateChat: Boolean = false
|
|
|
|
internal set
|
|
|
|
var chatWithBot: Boolean = false
|
|
|
|
internal set
|
|
|
|
var membersCount: Int = 0
|
|
|
|
internal set
|
|
|
|
var liveMembersCount: Int = 0
|
|
|
|
internal set
|
|
|
|
|
|
|
|
override fun canBeOpenedOnMap() = latLon != null && !chatWithBot
|
2018-07-10 11:52:44 +02:00
|
|
|
|
2018-07-13 13:02:59 +02:00
|
|
|
override fun getMapPointId() = "${chatId}_$userId"
|
2018-07-11 13:32:02 +02:00
|
|
|
|
|
|
|
override fun getVisibleName() = chatTitle
|
2018-07-10 11:52:44 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
class LocationItem : ListItem() {
|
|
|
|
|
2018-07-05 19:42:29 +02:00
|
|
|
var name: String = ""
|
|
|
|
internal set
|
2018-07-09 17:51:04 +02:00
|
|
|
|
2018-07-10 11:52:44 +02:00
|
|
|
override fun canBeOpenedOnMap() = latLon != null
|
|
|
|
|
|
|
|
override fun getMapPointId(): String {
|
|
|
|
val id = if (userId != 0) userId.toString() else name
|
2018-07-13 13:02:59 +02:00
|
|
|
return "${chatId}_$id"
|
2018-07-10 11:52:44 +02:00
|
|
|
}
|
2018-07-11 13:32:02 +02:00
|
|
|
|
|
|
|
override fun getVisibleName() = name
|
2018-07-05 19:42:29 +02:00
|
|
|
}
|
2018-06-28 14:53:13 +02:00
|
|
|
}
|