LocationMessages fixes. Added todos.

This commit is contained in:
crimean 2019-01-27 21:59:07 +03:00
parent f652e2f256
commit 430ceb10ae
9 changed files with 133 additions and 106 deletions

View file

@ -13,7 +13,7 @@ import android.os.*
import android.util.Log import android.util.Log
import android.widget.Toast import android.widget.Toast
import net.osmand.PlatformUtil import net.osmand.PlatformUtil
import net.osmand.telegram.helpers.LocationMessages import net.osmand.telegram.helpers.LocationMessages.LocationMessage
import net.osmand.telegram.helpers.TelegramHelper.TelegramIncomingMessagesListener import net.osmand.telegram.helpers.TelegramHelper.TelegramIncomingMessagesListener
import net.osmand.telegram.helpers.TelegramHelper.TelegramOutgoingMessagesListener import net.osmand.telegram.helpers.TelegramHelper.TelegramOutgoingMessagesListener
import net.osmand.telegram.notifications.TelegramNotification.NotificationType import net.osmand.telegram.notifications.TelegramNotification.NotificationType
@ -277,9 +277,9 @@ class TelegramService : Service(), LocationListener, TelegramIncomingMessagesLis
override fun onReceiveChatLocationMessages(chatId: Long, vararg messages: TdApi.Message) { override fun onReceiveChatLocationMessages(chatId: Long, vararg messages: TdApi.Message) {
app().showLocationHelper.startShowMessagesTask(chatId, *messages) app().showLocationHelper.startShowMessagesTask(chatId, *messages)
messages.forEach { messages.forEach {
val locationMessage = OsmandLocationUtils.parseMessage(it, app().telegramHelper, LocationMessages.LocationMessage.STATUS_INCOMING) val locationMessage = OsmandLocationUtils.parseMessage(it, app().telegramHelper, LocationMessage.STATUS_PREPARED)
if (locationMessage != null) { if (locationMessage != null) {
app().locationMessages.addLocationMessage(locationMessage) app().locationMessages.addIngoingMessage(locationMessage)
} }
} }
} }

View file

@ -5,105 +5,116 @@ import android.database.Cursor
import android.database.sqlite.SQLiteDatabase import android.database.sqlite.SQLiteDatabase
import android.database.sqlite.SQLiteOpenHelper import android.database.sqlite.SQLiteOpenHelper
import net.osmand.telegram.TelegramApplication import net.osmand.telegram.TelegramApplication
import java.util.*
import kotlin.collections.ArrayList import kotlin.collections.ArrayList
class LocationMessages(val app: TelegramApplication) { class LocationMessages(val app: TelegramApplication) {
private val locationMessages = ArrayList<LocationMessage>() // todo - bufferedMessages is for prepared/pending messages only. On app start we read prepared/pending messages to bufferedMessages. After status changed to sent/error - remove message from buffered.
private var bufferedMessages = emptyList<LocationMessage>()
private val sqliteHelper: SQLiteHelper private val dbHelper: SQLiteHelper
init { init {
sqliteHelper = SQLiteHelper(app) dbHelper = SQLiteHelper(app)
readMessages() readBufferedMessages()
} }
fun getLocationMessages(): List<LocationMessage> { fun getPreparedMessages(): List<LocationMessage> {
return this.locationMessages
}
fun getPreparedToShareMessages(): List<LocationMessage> {
val currentUserId = app.telegramHelper.getCurrentUserId() val currentUserId = app.telegramHelper.getCurrentUserId()
return locationMessages.filter { it.userId == currentUserId && it.status == LocationMessage.STATUS_PREPARED }.sortedBy { it.date } return bufferedMessages.filter { it.userId == currentUserId && it.status == LocationMessage.STATUS_PREPARED }.sortedBy { it.date }
} }
fun getOutgoingMessagesToChat(chatId: Long): List<LocationMessage> { // todo - drop method. add collected / sent messages count to ShareChatInfo
fun getOutgoingMessages(chatId: Long): List<LocationMessage> {
val currentUserId = app.telegramHelper.getCurrentUserId() val currentUserId = app.telegramHelper.getCurrentUserId()
return locationMessages.filter { it.userId == currentUserId && it.chatId == chatId }.sortedBy { it.date } return bufferedMessages.filter { it.userId == currentUserId && it.chatId == chatId }.sortedBy { it.date }
} }
fun getOutgoingMessagesToChatFromDate(chatId: Long, date:Long): List<LocationMessage> { // todo - drop it or read from db
fun getSentMessages(chatId: Long, date:Long): List<LocationMessage> {
val currentUserId = app.telegramHelper.getCurrentUserId() val currentUserId = app.telegramHelper.getCurrentUserId()
return locationMessages.filter { it.userId == currentUserId && it.chatId == chatId && it.date > date }.sortedBy { it.date } return bufferedMessages.filter { it.userId == currentUserId && it.chatId == chatId && it.date > date }.sortedBy { it.date }
} }
fun getSentOutgoingMessagesToChat(chatId: Long): List<LocationMessage> { // todo - drop it or read from db
fun getSentMessages(chatId: Long): List<LocationMessage> {
val currentUserId = app.telegramHelper.getCurrentUserId() val currentUserId = app.telegramHelper.getCurrentUserId()
return locationMessages.filter { it.userId == currentUserId && it.chatId == chatId && it.status == LocationMessages.LocationMessage.STATUS_SENT }.sortedBy { it.date } return bufferedMessages.filter { it.userId == currentUserId && it.chatId == chatId && it.status == LocationMessage.STATUS_SENT }.sortedBy { it.date }
} }
fun getIncomingMessages(): List<LocationMessage> { // todo - read from db by date (Victor's suggestion - filter by one day only. Need to be changed in UI also.
return locationMessages.filter { it.status != LocationMessage.STATUS_INCOMING }.sortedBy { it.date } fun getIngoingMessages(userId: Int, date: Date): List<LocationMessage> {
return emptyList()
} }
fun addLocationMessage(locationMessage: LocationMessage) { fun addOutgoingMessage(message: LocationMessage) {
locationMessages.add(locationMessage) val messages = mutableListOf(*this.bufferedMessages.toTypedArray())
sqliteHelper.addLocationMessage(locationMessage) messages.add(message)
this.bufferedMessages = messages
dbHelper.addOutgoingMessage(message)
} }
fun clearMessages() { fun addIngoingMessage(message: LocationMessage) {
sqliteHelper.clearLocationMessages() dbHelper.addIngoingMessage(message)
} }
fun collectRecordedDataForUser(userId: Int, chatId: Long, start: Long, end: Long): List<LocationMessages.LocationMessage> { fun clearOutgoingMessages() {
dbHelper.clearOutgoingMessages()
bufferedMessages = emptyList()
}
// todo - both methods should be refactored since we have two tables now for outgoing/ingoing messages. Data should be read from db.
fun collectRecordedDataForUser(userId: Int, chatId: Long, start: Long, end: Long): List<LocationMessage> {
return if (chatId == 0L) { return if (chatId == 0L) {
locationMessages.sortedWith(compareBy({ it.userId }, { it.chatId })).filter { it.userId == userId&&it.date in (start + 1)..(end - 1) } bufferedMessages.sortedWith(compareBy({ it.userId }, { it.chatId })).filter { it.userId == userId && it.date in (start + 1)..(end - 1) }
} else { } else {
locationMessages.sortedWith(compareBy({ it.userId }, { it.chatId })).filter { bufferedMessages.sortedWith(compareBy({ it.userId }, { it.chatId })).filter {
it.chatId == chatId && it.userId == userId && it.status == LocationMessage.STATUS_SENT && it.date in (start + 1)..(end - 1) } it.chatId == chatId && it.userId == userId && it.status == LocationMessage.STATUS_SENT && it.date in (start + 1)..(end - 1) }
} }
} }
fun collectRecordedDataForUsers(start: Long, end: Long, ignoredUsersIds: ArrayList<Int>): List<LocationMessages.LocationMessage> { fun collectRecordedDataForUsers(start: Long, end: Long, ignoredUsersIds: ArrayList<Int>): List<LocationMessage> {
return locationMessages.sortedWith(compareBy({ it.userId }, { it.chatId })).filter { return bufferedMessages.sortedWith(compareBy({ it.userId }, { it.chatId })).filter {
it.date in (start + 1)..(end - 1) && !ignoredUsersIds.contains(it.userId) it.date in (start + 1)..(end - 1) && !ignoredUsersIds.contains(it.userId)
} }
} }
private fun readMessages() { private fun readBufferedMessages() {
val messages = sqliteHelper.getLocationMessages() this.bufferedMessages = dbHelper.getOutgoingMessages();
locationMessages.addAll(messages)
} }
private class SQLiteHelper(context: Context) : private class SQLiteHelper(context: Context) :
SQLiteOpenHelper(context, DATABASE_NAME, null, DATABASE_VERSION) { SQLiteOpenHelper(context, DATABASE_NAME, null, DATABASE_VERSION) {
override fun onCreate(db: SQLiteDatabase) { override fun onCreate(db: SQLiteDatabase) {
db.execSQL(TRACKS_TABLE_CREATE) db.execSQL(OUTGOING_TABLE_CREATE)
db.execSQL("CREATE INDEX $TRACK_DATE_INDEX ON $TRACK_TABLE_NAME (\"$TRACK_COL_DATE\" DESC);") db.execSQL("CREATE INDEX $DATE_INDEX ON $OUTGOING_TABLE_NAME (\"$COL_DATE\" DESC);")
db.execSQL(INGOING_TABLE_CREATE)
db.execSQL("CREATE INDEX $DATE_INDEX ON $INGOING_TABLE_NAME (\"$COL_DATE\" DESC);")
} }
override fun onUpgrade(db: SQLiteDatabase, oldVersion: Int, newVersion: Int) { override fun onUpgrade(db: SQLiteDatabase, oldVersion: Int, newVersion: Int) {
db.execSQL(TRACKS_TABLE_DELETE) db.execSQL(OUTGOING_TABLE_DELETE)
db.execSQL(INGOING_TABLE_DELETE)
onCreate(db) onCreate(db)
} }
internal fun addLocationMessages(locationMessages: List<LocationMessage>) { internal fun addOutgoingMessage(message: LocationMessage) {
locationMessages.forEach { writableDatabase?.execSQL(OUTGOING_TABLE_INSERT,
writableDatabase?.execSQL(TRACKS_TABLE_INSERT, arrayOf(message.userId, message.chatId, message.lat, message.lon, message.altitude, message.speed,
arrayOf(it.userId, it.chatId, it.lat, it.lon, it.altitude, it.speed, it.hdop, it.bearing, it.date, it.type, it.status, it.messageId)) message.hdop, message.bearing, message.date, message.type, message.status, message.messageId))
}
} }
internal fun addLocationMessage(locationMessage: LocationMessage) { internal fun addIngoingMessage(message: LocationMessage) {
writableDatabase?.execSQL(TRACKS_TABLE_INSERT, writableDatabase?.execSQL(INGOING_TABLE_INSERT,
arrayOf(locationMessage.userId, locationMessage.chatId, locationMessage.lat, locationMessage.lon, locationMessage.altitude, locationMessage.speed, arrayOf(message.userId, message.chatId, message.lat, message.lon, message.altitude, message.speed,
locationMessage.hdop, locationMessage.bearing, locationMessage.date, locationMessage.type, locationMessage.status, locationMessage.messageId)) message.hdop, message.bearing, message.date, message.type, message.status, message.messageId))
} }
internal fun getLocationMessages(): List<LocationMessage> { internal fun getOutgoingMessages(): List<LocationMessage> {
val res = ArrayList<LocationMessage>() val res = arrayListOf<LocationMessage>()
readableDatabase?.rawQuery(TRACKS_TABLE_SELECT, null)?.apply { readableDatabase?.rawQuery(OUTGOING_TABLE_SELECT, null)?.apply {
if (moveToFirst()) { if (moveToFirst()) {
do { do {
res.add(readLocationMessage(this@apply)) res.add(readLocationMessage(this@apply))
@ -122,52 +133,69 @@ class LocationMessages(val app: TelegramApplication) {
val altitude = cursor.getDouble(4) val altitude = cursor.getDouble(4)
val speed = cursor.getDouble(5) val speed = cursor.getDouble(5)
val hdop = cursor.getDouble(6) val hdop = cursor.getDouble(6)
val date = cursor.getLong(7) val bearing = cursor.getDouble(7)
val bearing = cursor.getDouble(8) val date = cursor.getLong(8)
val textInfo = cursor.getInt(9) val type = cursor.getInt(9)
val status = cursor.getInt(10) val status = cursor.getInt(10)
val messageId = cursor.getLong(11) val messageId = cursor.getLong(11)
return LocationMessage(userId, chatId, lat, lon, altitude, speed, hdop, bearing, date, textInfo, status, messageId) return LocationMessage(userId, chatId, lat, lon, altitude, speed, hdop, bearing, date, type, status, messageId)
} }
internal fun clearLocationMessages() { internal fun clearOutgoingMessages() {
writableDatabase?.execSQL(TRACKS_TABLE_CLEAR) writableDatabase?.execSQL(OUTGOING_TABLE_CLEAR)
} }
companion object { companion object {
private const val DATABASE_NAME = "location_messages" private const val DATABASE_NAME = "location_messages"
private const val DATABASE_VERSION = 2 private const val DATABASE_VERSION = 3
private const val TRACK_TABLE_NAME = "track" private const val OUTGOING_TABLE_NAME = "outgoing"
private const val TRACK_COL_USER_ID = "user_id" private const val INGOING_TABLE_NAME = "ingoing"
private const val TRACK_COL_CHAT_ID = "chat_id"
private const val TRACK_COL_DATE = "date"
private const val TRACK_COL_LAT = "lat"
private const val TRACK_COL_LON = "lon"
private const val TRACK_COL_ALTITUDE = "altitude"
private const val TRACK_COL_SPEED = "speed"
private const val TRACK_COL_HDOP = "hdop"
private const val TRACK_COL_BEARING = "bearing"
private const val TRACK_COL_TYPE = "type" // 0 = user map message, 1 = user text message, 2 = bot map message, 3 = bot text message
private const val TRACK_COL_MESSAGE_STATUS = "status" // 0 = preparing , 1 = pending, 2 = sent, 3 = error
private const val TRACK_COL_MESSAGE_ID = "message_id"
private const val TRACK_DATE_INDEX = "date_index" private const val COL_USER_ID = "user_id"
private const val COL_CHAT_ID = "chat_id"
private const val COL_DATE = "date"
private const val COL_LAT = "lat"
private const val COL_LON = "lon"
private const val COL_ALTITUDE = "altitude"
private const val COL_SPEED = "speed"
private const val COL_HDOP = "hdop"
private const val COL_BEARING = "bearing"
private const val COL_TYPE = "type" // 0 = user map message, 1 = user text message, 2 = bot map message, 3 = bot text message
private const val COL_MESSAGE_STATUS = "status" // 0 = preparing , 1 = pending, 2 = sent, 3 = error
private const val COL_MESSAGE_ID = "message_id"
private const val TRACKS_TABLE_INSERT = private const val DATE_INDEX = "date_index"
("INSERT INTO $TRACK_TABLE_NAME ($TRACK_COL_USER_ID, $TRACK_COL_CHAT_ID, $TRACK_COL_LAT, $TRACK_COL_LON, $TRACK_COL_ALTITUDE, $TRACK_COL_SPEED, $TRACK_COL_HDOP, $TRACK_COL_BEARING, $TRACK_COL_DATE, $TRACK_COL_TYPE, $TRACK_COL_MESSAGE_STATUS, $TRACK_COL_MESSAGE_ID) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)")
private const val TRACKS_TABLE_CREATE = // Outgoing messages table
("CREATE TABLE IF NOT EXISTS $TRACK_TABLE_NAME ($TRACK_COL_USER_ID long, $TRACK_COL_CHAT_ID long,$TRACK_COL_LAT double, $TRACK_COL_LON double, $TRACK_COL_ALTITUDE double, $TRACK_COL_SPEED float, $TRACK_COL_HDOP double, $TRACK_COL_BEARING double, $TRACK_COL_DATE long, $TRACK_COL_TYPE int, $TRACK_COL_MESSAGE_STATUS int, $TRACK_COL_MESSAGE_ID long )") private const val OUTGOING_TABLE_INSERT =
("INSERT INTO $OUTGOING_TABLE_NAME ($COL_USER_ID, $COL_CHAT_ID, $COL_LAT, $COL_LON, $COL_ALTITUDE, $COL_SPEED, $COL_HDOP, $COL_BEARING, $COL_DATE, $COL_TYPE, $COL_MESSAGE_STATUS, $COL_MESSAGE_ID) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)")
private const val TRACKS_TABLE_SELECT = private const val OUTGOING_TABLE_CREATE =
"SELECT $TRACK_COL_USER_ID, $TRACK_COL_CHAT_ID, $TRACK_COL_LAT, $TRACK_COL_LON, $TRACK_COL_ALTITUDE, $TRACK_COL_SPEED, $TRACK_COL_HDOP, $TRACK_COL_BEARING, $TRACK_COL_DATE, $TRACK_COL_TYPE, $TRACK_COL_MESSAGE_STATUS, $TRACK_COL_MESSAGE_ID FROM $TRACK_TABLE_NAME" ("CREATE TABLE IF NOT EXISTS $OUTGOING_TABLE_NAME ($COL_USER_ID long, $COL_CHAT_ID long,$COL_LAT double, $COL_LON double, $COL_ALTITUDE double, $COL_SPEED float, $COL_HDOP double, $COL_BEARING double, $COL_DATE long, $COL_TYPE int, $COL_MESSAGE_STATUS int, $COL_MESSAGE_ID long )")
private const val TRACKS_TABLE_CLEAR = "DELETE FROM $TRACK_TABLE_NAME" private const val OUTGOING_TABLE_SELECT =
"SELECT $COL_USER_ID, $COL_CHAT_ID, $COL_LAT, $COL_LON, $COL_ALTITUDE, $COL_SPEED, $COL_HDOP, $COL_BEARING, $COL_DATE, $COL_TYPE, $COL_MESSAGE_STATUS, $COL_MESSAGE_ID FROM $OUTGOING_TABLE_NAME"
private const val TRACKS_TABLE_DELETE = "DROP TABLE IF EXISTS $TRACK_TABLE_NAME" private const val OUTGOING_TABLE_CLEAR = "DELETE FROM $OUTGOING_TABLE_NAME"
private const val OUTGOING_TABLE_DELETE = "DROP TABLE IF EXISTS $OUTGOING_TABLE_NAME"
// Ingoing messages table
private const val INGOING_TABLE_INSERT =
("INSERT INTO $INGOING_TABLE_NAME ($COL_USER_ID, $COL_CHAT_ID, $COL_LAT, $COL_LON, $COL_ALTITUDE, $COL_SPEED, $COL_HDOP, $COL_BEARING, $COL_DATE, $COL_TYPE, $COL_MESSAGE_STATUS, $COL_MESSAGE_ID) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)")
private const val INGOING_TABLE_CREATE =
("CREATE TABLE IF NOT EXISTS $INGOING_TABLE_NAME ($COL_USER_ID long, $COL_CHAT_ID long,$COL_LAT double, $COL_LON double, $COL_ALTITUDE double, $COL_SPEED float, $COL_HDOP double, $COL_BEARING double, $COL_DATE long, $COL_TYPE int, $COL_MESSAGE_STATUS int, $COL_MESSAGE_ID long )")
private const val INGOING_TABLE_SELECT =
"SELECT $COL_USER_ID, $COL_CHAT_ID, $COL_LAT, $COL_LON, $COL_ALTITUDE, $COL_SPEED, $COL_HDOP, $COL_BEARING, $COL_DATE, $COL_TYPE, $COL_MESSAGE_STATUS, $COL_MESSAGE_ID FROM $INGOING_TABLE_NAME"
private const val INGOING_TABLE_CLEAR = "DELETE FROM $INGOING_TABLE_NAME"
private const val INGOING_TABLE_DELETE = "DROP TABLE IF EXISTS $INGOING_TABLE_NAME"
} }
} }
@ -182,9 +210,9 @@ class LocationMessages(val app: TelegramApplication) {
val bearing: Double, val bearing: Double,
val date: Long, val date: Long,
val type: Int, val type: Int,
// todo - status and messageId should be updated in db right away. Make them val instead of var.
var status: Int, var status: Int,
var messageId: Long var messageId: Long) {
) {
companion object { companion object {
@ -192,7 +220,6 @@ class LocationMessages(val app: TelegramApplication) {
const val STATUS_PENDING = 1 const val STATUS_PENDING = 1
const val STATUS_SENT = 2 const val STATUS_SENT = 2
const val STATUS_ERROR = 3 const val STATUS_ERROR = 3
const val STATUS_INCOMING = 4
const val TYPE_USER_MAP = 0 const val TYPE_USER_MAP = 0
const val TYPE_USER_TEXT = 1 const val TYPE_USER_TEXT = 1

View file

@ -154,15 +154,15 @@ class ShareLocationHelper(private val app: TelegramApplication) {
chatsShareInfo.values.forEach { shareInfo -> chatsShareInfo.values.forEach { shareInfo ->
types.forEach { types.forEach {
val message = LocationMessage(userId, shareInfo.chatId, latitude, longitude, location.altitude, location.speed.toDouble(), val message = LocationMessage(userId, shareInfo.chatId, latitude, longitude, location.altitude, location.speed.toDouble(),
location.accuracy.toDouble(), location.bearing.toDouble(), location.time, it, LocationMessage.STATUS_PREPARED, shareInfo.currentMapMessageId) location.accuracy.toDouble(), location.bearing.toDouble(), location.time, it, LocationMessage.STATUS_PREPARED, shareInfo.currentMapMessageId)
app.locationMessages.addLocationMessage(message) app.locationMessages.addOutgoingMessage(message)
} }
} }
} }
private fun shareMessages() { private fun shareMessages() {
var bufferedMessagesFull = false var bufferedMessagesFull = false
app.locationMessages.getPreparedToShareMessages().forEach { app.locationMessages.getPreparedMessages().forEach {
val shareChatInfo = app.settings.getChatsShareInfo()[it.chatId] val shareChatInfo = app.settings.getChatsShareInfo()[it.chatId]
if (shareChatInfo != null) { if (shareChatInfo != null) {
bufferedMessagesFull = shareChatInfo.bufferedMessages < 10 bufferedMessagesFull = shareChatInfo.bufferedMessages < 10

View file

@ -1,11 +1,9 @@
package net.osmand.telegram.helpers package net.osmand.telegram.helpers
import android.text.TextUtils import android.text.TextUtils
import net.osmand.Location
import net.osmand.PlatformUtil import net.osmand.PlatformUtil
import net.osmand.telegram.* import net.osmand.telegram.*
import net.osmand.telegram.helpers.TelegramHelper.TelegramAuthenticationParameterType.* import net.osmand.telegram.helpers.TelegramHelper.TelegramAuthenticationParameterType.*
import net.osmand.telegram.utils.BASE_SHARING_URL
import net.osmand.telegram.utils.GRAYSCALE_PHOTOS_DIR import net.osmand.telegram.utils.GRAYSCALE_PHOTOS_DIR
import net.osmand.telegram.utils.GRAYSCALE_PHOTOS_EXT import net.osmand.telegram.utils.GRAYSCALE_PHOTOS_EXT
import net.osmand.telegram.utils.OsmandLocationUtils import net.osmand.telegram.utils.OsmandLocationUtils
@ -22,7 +20,6 @@ import org.drinkless.td.libcore.telegram.Client.ResultHandler
import org.drinkless.td.libcore.telegram.TdApi import org.drinkless.td.libcore.telegram.TdApi
import org.drinkless.td.libcore.telegram.TdApi.AuthorizationState import org.drinkless.td.libcore.telegram.TdApi.AuthorizationState
import java.io.File import java.io.File
import java.text.SimpleDateFormat
import java.util.* import java.util.*
import java.util.concurrent.ConcurrentHashMap import java.util.concurrent.ConcurrentHashMap
import java.util.concurrent.Executors import java.util.concurrent.Executors

View file

@ -10,6 +10,7 @@ import net.osmand.telegram.utils.OsmandLocationUtils
import net.osmand.telegram.utils.OsmandLocationUtils.MessageUserTextLocation import net.osmand.telegram.utils.OsmandLocationUtils.MessageUserTextLocation
import net.osmand.telegram.utils.OsmandLocationUtils.MessageOsmAndBotLocation import net.osmand.telegram.utils.OsmandLocationUtils.MessageOsmAndBotLocation
import net.osmand.telegram.utils.GPXUtilities import net.osmand.telegram.utils.GPXUtilities
import net.osmand.telegram.utils.GPXUtilities.GPXFile
import org.drinkless.td.libcore.telegram.TdApi import org.drinkless.td.libcore.telegram.TdApi
object TelegramUiHelper { object TelegramUiHelper {
@ -131,7 +132,7 @@ object TelegramUiHelper {
} }
} }
fun gpxToChatItem(helper: TelegramHelper, gpx: GPXUtilities.GPXFile, simpleUserItem: Boolean): GpxChatItem? { fun gpxToChatItem(helper: TelegramHelper, gpx: GPXFile, simpleUserItem: Boolean): GpxChatItem? {
return if (simpleUserItem) gpxToUserGpxChatItem(helper, gpx) else gpxToGpxChatItem(helper, gpx) return if (simpleUserItem) gpxToUserGpxChatItem(helper, gpx) else gpxToGpxChatItem(helper, gpx)
} }
@ -232,7 +233,7 @@ object TelegramUiHelper {
private fun gpxToGpxChatItem( private fun gpxToGpxChatItem(
helper: TelegramHelper, helper: TelegramHelper,
gpx: GPXUtilities.GPXFile gpx: GPXFile
): GpxChatItem? { ): GpxChatItem? {
val user = helper.getUser(gpx.userId) ?: return null val user = helper.getUser(gpx.userId) ?: return null
val chat = helper.getChat(gpx.chatId) ?: return null val chat = helper.getChat(gpx.chatId) ?: return null
@ -258,7 +259,7 @@ object TelegramUiHelper {
private fun gpxToUserGpxChatItem( private fun gpxToUserGpxChatItem(
helper: TelegramHelper, helper: TelegramHelper,
gpx: GPXUtilities.GPXFile gpx: GPXFile
): GpxChatItem? { ): GpxChatItem? {
val user = helper.getUser(gpx.userId) ?: return null val user = helper.getUser(gpx.userId) ?: return null
return GpxChatItem().apply { return GpxChatItem().apply {
@ -323,7 +324,7 @@ object TelegramUiHelper {
class GpxChatItem : ListItem() { class GpxChatItem : ListItem() {
var gpxFile: GPXUtilities.GPXFile? = null var gpxFile: GPXFile? = null
internal set internal set
var groupPhotoPath: String? = null var groupPhotoPath: String? = null
internal set internal set

View file

@ -19,7 +19,7 @@ import android.widget.*
import net.osmand.PlatformUtil import net.osmand.PlatformUtil
import net.osmand.telegram.R import net.osmand.telegram.R
import net.osmand.telegram.TelegramApplication import net.osmand.telegram.TelegramApplication
import net.osmand.telegram.helpers.LocationMessages import net.osmand.telegram.helpers.LocationMessages.LocationMessage
import net.osmand.telegram.helpers.OsmandAidlHelper import net.osmand.telegram.helpers.OsmandAidlHelper
import net.osmand.telegram.helpers.TelegramHelper import net.osmand.telegram.helpers.TelegramHelper
import net.osmand.telegram.helpers.TelegramHelper.* import net.osmand.telegram.helpers.TelegramHelper.*
@ -293,9 +293,9 @@ class MainActivity : AppCompatActivity(), TelegramListener, ActionButtonsListene
} }
if (app.telegramService == null) { if (app.telegramService == null) {
messages.forEach { messages.forEach {
val locationMessage = OsmandLocationUtils.parseMessage(it, telegramHelper, LocationMessages.LocationMessage.STATUS_INCOMING) val locationMessage = OsmandLocationUtils.parseMessage(it, telegramHelper, LocationMessage.STATUS_PREPARED)
if (locationMessage != null) { if (locationMessage != null) {
app.locationMessages.addLocationMessage(locationMessage) app.locationMessages.addIngoingMessage(locationMessage)
} }
} }
} }
@ -349,7 +349,8 @@ class MainActivity : AppCompatActivity(), TelegramListener, ActionButtonsListene
fun logoutTelegram(silent: Boolean = false) { fun logoutTelegram(silent: Boolean = false) {
if (telegramHelper.getTelegramAuthorizationState() == TelegramHelper.TelegramAuthorizationState.READY) { if (telegramHelper.getTelegramAuthorizationState() == TelegramHelper.TelegramAuthorizationState.READY) {
if (app.isInternetConnectionAvailable) { if (app.isInternetConnectionAvailable) {
app.locationMessages.clearMessages() // todo - why delete messages on logout?
app.locationMessages.clearOutgoingMessages()
settings.clear() settings.clear()
telegramHelper.logout() telegramHelper.logout()
} else { } else {

View file

@ -716,13 +716,13 @@ class MyLocationTabFragment : Fragment(), TelegramListener {
} }
holder.gpsPointsCollected?.apply { holder.gpsPointsCollected?.apply {
if (shareInfo != null) { if (shareInfo != null) {
val all = app.locationMessages.getOutgoingMessagesToChat(shareInfo.chatId) val all = app.locationMessages.getOutgoingMessages(shareInfo.chatId)
text = "${all.size}" text = "${all.size}"
} }
} }
holder.gpsPointsSent?.apply { holder.gpsPointsSent?.apply {
if (shareInfo != null) { if (shareInfo != null) {
val sent = app.locationMessages.getOutgoingMessagesToChatFromDate(shareInfo.chatId, shareInfo.start * 1000) val sent = app.locationMessages.getSentMessages(shareInfo.chatId, shareInfo.start * 1000)
text = "${sent.size}" text = "${sent.size}"
} }
} }

View file

@ -192,6 +192,7 @@ class TimelineTabFragment : Fragment() {
val currentUserId = telegramHelper.getCurrentUser()?.id val currentUserId = telegramHelper.getCurrentUser()?.id
if (currentUserId != null) { if (currentUserId != null) {
val locationMessages = app.locationMessages.collectRecordedDataForUser(currentUserId, 0, start, end) val locationMessages = app.locationMessages.collectRecordedDataForUser(currentUserId, 0, start, end)
// todo - why do we need convert to gpx on update? Is locationMessages not enough to display info?
OsmandLocationUtils.convertLocationMessagesToGpxFiles(locationMessages, false).forEach { OsmandLocationUtils.convertLocationMessagesToGpxFiles(locationMessages, false).forEach {
TelegramUiHelper.gpxToChatItem(telegramHelper, it, true)?.also { chatItem -> TelegramUiHelper.gpxToChatItem(telegramHelper, it, true)?.also { chatItem ->
res.add(chatItem) res.add(chatItem)

View file

@ -3,7 +3,7 @@ package net.osmand.telegram.utils
import android.os.AsyncTask import android.os.AsyncTask
import net.osmand.Location import net.osmand.Location
import net.osmand.telegram.TelegramApplication import net.osmand.telegram.TelegramApplication
import net.osmand.telegram.helpers.LocationMessages import net.osmand.telegram.helpers.LocationMessages.LocationMessage
import net.osmand.telegram.helpers.TelegramHelper import net.osmand.telegram.helpers.TelegramHelper
import net.osmand.telegram.helpers.TelegramUiHelper import net.osmand.telegram.helpers.TelegramUiHelper
import net.osmand.util.GeoPointParserUtil import net.osmand.util.GeoPointParserUtil
@ -74,8 +74,8 @@ object OsmandLocationUtils {
} }
} }
fun parseMessage(message: TdApi.Message, helper: TelegramHelper, status: Int): LocationMessages.LocationMessage? { fun parseMessage(message: TdApi.Message, helper: TelegramHelper, status: Int): LocationMessage? {
var locationMessage: LocationMessages.LocationMessage? = null var locationMessage: LocationMessage? = null
val oldContent = message.content val oldContent = message.content
val fromBot = helper.isOsmAndBot(message.senderUserId) val fromBot = helper.isOsmAndBot(message.senderUserId)
@ -106,9 +106,9 @@ object OsmandLocationUtils {
} }
if (parsedMessageContent != null) { if (parsedMessageContent != null) {
locationMessage = LocationMessages.LocationMessage(helper.getSenderMessageId(message), message.chatId, parsedMessageContent.lat, locationMessage = LocationMessage(helper.getSenderMessageId(message), message.chatId, parsedMessageContent.lat,
parsedMessageContent.lon, parsedMessageContent.altitude, parsedMessageContent.speed, parsedMessageContent.hdop, parsedMessageContent.lon, parsedMessageContent.altitude, parsedMessageContent.speed, parsedMessageContent.hdop,
parsedMessageContent.bearing, parsedMessageContent.lastUpdated * 1000L, messageType, status, message.id) parsedMessageContent.bearing, parsedMessageContent.lastUpdated * 1000L, messageType, status, message.id)
} }
return locationMessage return locationMessage
} }
@ -117,7 +117,7 @@ object OsmandLocationUtils {
return String.format(Locale.US, "%.5f, %.5f", sig.latitude, sig.longitude) return String.format(Locale.US, "%.5f, %.5f", sig.latitude, sig.longitude)
} }
fun formatLocation(sig: LocationMessages.LocationMessage): String { fun formatLocation(sig: LocationMessage): String {
return String.format(Locale.US, "%.5f, %.5f", sig.lat, sig.lon) return String.format(Locale.US, "%.5f, %.5f", sig.lat, sig.lon)
} }
@ -274,7 +274,7 @@ object OsmandLocationUtils {
return 0 return 0
} }
fun getTextMessageContent(updateId: Int, location: LocationMessages.LocationMessage): TdApi.InputMessageText { fun getTextMessageContent(updateId: Int, location: LocationMessage): TdApi.InputMessageText {
val entities = mutableListOf<TdApi.TextEntity>() val entities = mutableListOf<TdApi.TextEntity>()
val builder = StringBuilder() val builder = StringBuilder()
val locationMessage = formatLocation(location) val locationMessage = formatLocation(location)
@ -313,7 +313,7 @@ object OsmandLocationUtils {
return TdApi.InputMessageText(TdApi.FormattedText(textMessage, entities.toTypedArray()), true, true) return TdApi.InputMessageText(TdApi.FormattedText(textMessage, entities.toTypedArray()), true, true)
} }
fun convertLocationMessagesToGpxFiles(items: List<LocationMessages.LocationMessage>, newGpxPerChat: Boolean = true): List<GPXUtilities.GPXFile> { fun convertLocationMessagesToGpxFiles(items: List<LocationMessage>, newGpxPerChat: Boolean = true): List<GPXUtilities.GPXFile> {
val dataTracks = ArrayList<GPXUtilities.GPXFile>() val dataTracks = ArrayList<GPXUtilities.GPXFile>()
var previousTime: Long = -1 var previousTime: Long = -1