From 430ceb10ae5a5a5ff8e9136211111f8f018040ca Mon Sep 17 00:00:00 2001 From: crimean Date: Sun, 27 Jan 2019 21:59:07 +0300 Subject: [PATCH] LocationMessages fixes. Added todos. --- .../net/osmand/telegram/TelegramService.kt | 6 +- .../telegram/helpers/LocationMessages.kt | 183 ++++++++++-------- .../telegram/helpers/ShareLocationHelper.kt | 6 +- .../osmand/telegram/helpers/TelegramHelper.kt | 3 - .../telegram/helpers/TelegramUiHelper.kt | 9 +- .../net/osmand/telegram/ui/MainActivity.kt | 9 +- .../telegram/ui/MyLocationTabFragment.kt | 4 +- .../osmand/telegram/ui/TimelineTabFragment.kt | 1 + .../telegram/utils/OsmandLocationUtils.kt | 18 +- 9 files changed, 133 insertions(+), 106 deletions(-) diff --git a/OsmAnd-telegram/src/net/osmand/telegram/TelegramService.kt b/OsmAnd-telegram/src/net/osmand/telegram/TelegramService.kt index 187ad7ba81..654e514740 100644 --- a/OsmAnd-telegram/src/net/osmand/telegram/TelegramService.kt +++ b/OsmAnd-telegram/src/net/osmand/telegram/TelegramService.kt @@ -13,7 +13,7 @@ import android.os.* import android.util.Log import android.widget.Toast 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.TelegramOutgoingMessagesListener 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) { app().showLocationHelper.startShowMessagesTask(chatId, *messages) 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) { - app().locationMessages.addLocationMessage(locationMessage) + app().locationMessages.addIngoingMessage(locationMessage) } } } diff --git a/OsmAnd-telegram/src/net/osmand/telegram/helpers/LocationMessages.kt b/OsmAnd-telegram/src/net/osmand/telegram/helpers/LocationMessages.kt index 0e4fa5507a..cc5150d156 100644 --- a/OsmAnd-telegram/src/net/osmand/telegram/helpers/LocationMessages.kt +++ b/OsmAnd-telegram/src/net/osmand/telegram/helpers/LocationMessages.kt @@ -5,105 +5,116 @@ import android.database.Cursor import android.database.sqlite.SQLiteDatabase import android.database.sqlite.SQLiteOpenHelper import net.osmand.telegram.TelegramApplication +import java.util.* import kotlin.collections.ArrayList class LocationMessages(val app: TelegramApplication) { - private val locationMessages = ArrayList() + // 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() - private val sqliteHelper: SQLiteHelper + private val dbHelper: SQLiteHelper init { - sqliteHelper = SQLiteHelper(app) - readMessages() + dbHelper = SQLiteHelper(app) + readBufferedMessages() } - fun getLocationMessages(): List { - return this.locationMessages - } - - fun getPreparedToShareMessages(): List { + fun getPreparedMessages(): List { 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 { + // todo - drop method. add collected / sent messages count to ShareChatInfo + fun getOutgoingMessages(chatId: Long): List { 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 { + // todo - drop it or read from db + fun getSentMessages(chatId: Long, date:Long): List { 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 { + // todo - drop it or read from db + fun getSentMessages(chatId: Long): List { 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 { - return locationMessages.filter { it.status != LocationMessage.STATUS_INCOMING }.sortedBy { it.date } + // todo - read from db by date (Victor's suggestion - filter by one day only. Need to be changed in UI also. + fun getIngoingMessages(userId: Int, date: Date): List { + return emptyList() } - fun addLocationMessage(locationMessage: LocationMessage) { - locationMessages.add(locationMessage) - sqliteHelper.addLocationMessage(locationMessage) + fun addOutgoingMessage(message: LocationMessage) { + val messages = mutableListOf(*this.bufferedMessages.toTypedArray()) + messages.add(message) + this.bufferedMessages = messages + dbHelper.addOutgoingMessage(message) } - fun clearMessages() { - sqliteHelper.clearLocationMessages() + fun addIngoingMessage(message: LocationMessage) { + dbHelper.addIngoingMessage(message) } - fun collectRecordedDataForUser(userId: Int, chatId: Long, start: Long, end: Long): List { + 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 { 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 { - 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) } } } - fun collectRecordedDataForUsers(start: Long, end: Long, ignoredUsersIds: ArrayList): List { - return locationMessages.sortedWith(compareBy({ it.userId }, { it.chatId })).filter { + fun collectRecordedDataForUsers(start: Long, end: Long, ignoredUsersIds: ArrayList): List { + return bufferedMessages.sortedWith(compareBy({ it.userId }, { it.chatId })).filter { it.date in (start + 1)..(end - 1) && !ignoredUsersIds.contains(it.userId) } } - private fun readMessages() { - val messages = sqliteHelper.getLocationMessages() - locationMessages.addAll(messages) + private fun readBufferedMessages() { + this.bufferedMessages = dbHelper.getOutgoingMessages(); } private class SQLiteHelper(context: Context) : SQLiteOpenHelper(context, DATABASE_NAME, null, DATABASE_VERSION) { override fun onCreate(db: SQLiteDatabase) { - db.execSQL(TRACKS_TABLE_CREATE) - db.execSQL("CREATE INDEX $TRACK_DATE_INDEX ON $TRACK_TABLE_NAME (\"$TRACK_COL_DATE\" DESC);") + db.execSQL(OUTGOING_TABLE_CREATE) + 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) { - db.execSQL(TRACKS_TABLE_DELETE) + db.execSQL(OUTGOING_TABLE_DELETE) + db.execSQL(INGOING_TABLE_DELETE) onCreate(db) } - internal fun addLocationMessages(locationMessages: List) { - locationMessages.forEach { - writableDatabase?.execSQL(TRACKS_TABLE_INSERT, - 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)) - } + internal fun addOutgoingMessage(message: LocationMessage) { + writableDatabase?.execSQL(OUTGOING_TABLE_INSERT, + arrayOf(message.userId, message.chatId, message.lat, message.lon, message.altitude, message.speed, + message.hdop, message.bearing, message.date, message.type, message.status, message.messageId)) } - internal fun addLocationMessage(locationMessage: LocationMessage) { - writableDatabase?.execSQL(TRACKS_TABLE_INSERT, - arrayOf(locationMessage.userId, locationMessage.chatId, locationMessage.lat, locationMessage.lon, locationMessage.altitude, locationMessage.speed, - locationMessage.hdop, locationMessage.bearing, locationMessage.date, locationMessage.type, locationMessage.status, locationMessage.messageId)) + internal fun addIngoingMessage(message: LocationMessage) { + writableDatabase?.execSQL(INGOING_TABLE_INSERT, + arrayOf(message.userId, message.chatId, message.lat, message.lon, message.altitude, message.speed, + message.hdop, message.bearing, message.date, message.type, message.status, message.messageId)) } - internal fun getLocationMessages(): List { - val res = ArrayList() - readableDatabase?.rawQuery(TRACKS_TABLE_SELECT, null)?.apply { + internal fun getOutgoingMessages(): List { + val res = arrayListOf() + readableDatabase?.rawQuery(OUTGOING_TABLE_SELECT, null)?.apply { if (moveToFirst()) { do { res.add(readLocationMessage(this@apply)) @@ -122,52 +133,69 @@ class LocationMessages(val app: TelegramApplication) { val altitude = cursor.getDouble(4) val speed = cursor.getDouble(5) val hdop = cursor.getDouble(6) - val date = cursor.getLong(7) - val bearing = cursor.getDouble(8) - val textInfo = cursor.getInt(9) + val bearing = cursor.getDouble(7) + val date = cursor.getLong(8) + val type = cursor.getInt(9) val status = cursor.getInt(10) 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() { - writableDatabase?.execSQL(TRACKS_TABLE_CLEAR) + internal fun clearOutgoingMessages() { + writableDatabase?.execSQL(OUTGOING_TABLE_CLEAR) } companion object { 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 TRACK_COL_USER_ID = "user_id" - 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 OUTGOING_TABLE_NAME = "outgoing" + private const val INGOING_TABLE_NAME = "ingoing" - 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 = - ("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 DATE_INDEX = "date_index" - private const val TRACKS_TABLE_CREATE = - ("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 )") + // Outgoing messages table + 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 = - "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" + private const val OUTGOING_TABLE_CREATE = + ("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 date: Long, val type: Int, + // todo - status and messageId should be updated in db right away. Make them val instead of var. var status: Int, - var messageId: Long - ) { + var messageId: Long) { companion object { @@ -192,7 +220,6 @@ class LocationMessages(val app: TelegramApplication) { const val STATUS_PENDING = 1 const val STATUS_SENT = 2 const val STATUS_ERROR = 3 - const val STATUS_INCOMING = 4 const val TYPE_USER_MAP = 0 const val TYPE_USER_TEXT = 1 diff --git a/OsmAnd-telegram/src/net/osmand/telegram/helpers/ShareLocationHelper.kt b/OsmAnd-telegram/src/net/osmand/telegram/helpers/ShareLocationHelper.kt index f39f7aeae2..40a9914294 100644 --- a/OsmAnd-telegram/src/net/osmand/telegram/helpers/ShareLocationHelper.kt +++ b/OsmAnd-telegram/src/net/osmand/telegram/helpers/ShareLocationHelper.kt @@ -154,15 +154,15 @@ class ShareLocationHelper(private val app: TelegramApplication) { chatsShareInfo.values.forEach { shareInfo -> types.forEach { 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) - app.locationMessages.addLocationMessage(message) + location.accuracy.toDouble(), location.bearing.toDouble(), location.time, it, LocationMessage.STATUS_PREPARED, shareInfo.currentMapMessageId) + app.locationMessages.addOutgoingMessage(message) } } } private fun shareMessages() { var bufferedMessagesFull = false - app.locationMessages.getPreparedToShareMessages().forEach { + app.locationMessages.getPreparedMessages().forEach { val shareChatInfo = app.settings.getChatsShareInfo()[it.chatId] if (shareChatInfo != null) { bufferedMessagesFull = shareChatInfo.bufferedMessages < 10 diff --git a/OsmAnd-telegram/src/net/osmand/telegram/helpers/TelegramHelper.kt b/OsmAnd-telegram/src/net/osmand/telegram/helpers/TelegramHelper.kt index 81f67c8421..5803d4c4af 100644 --- a/OsmAnd-telegram/src/net/osmand/telegram/helpers/TelegramHelper.kt +++ b/OsmAnd-telegram/src/net/osmand/telegram/helpers/TelegramHelper.kt @@ -1,11 +1,9 @@ package net.osmand.telegram.helpers import android.text.TextUtils -import net.osmand.Location import net.osmand.PlatformUtil import net.osmand.telegram.* 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_EXT 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.AuthorizationState import java.io.File -import java.text.SimpleDateFormat import java.util.* import java.util.concurrent.ConcurrentHashMap import java.util.concurrent.Executors diff --git a/OsmAnd-telegram/src/net/osmand/telegram/helpers/TelegramUiHelper.kt b/OsmAnd-telegram/src/net/osmand/telegram/helpers/TelegramUiHelper.kt index 33153b5fa0..aab31f3ba2 100644 --- a/OsmAnd-telegram/src/net/osmand/telegram/helpers/TelegramUiHelper.kt +++ b/OsmAnd-telegram/src/net/osmand/telegram/helpers/TelegramUiHelper.kt @@ -10,6 +10,7 @@ import net.osmand.telegram.utils.OsmandLocationUtils import net.osmand.telegram.utils.OsmandLocationUtils.MessageUserTextLocation import net.osmand.telegram.utils.OsmandLocationUtils.MessageOsmAndBotLocation import net.osmand.telegram.utils.GPXUtilities +import net.osmand.telegram.utils.GPXUtilities.GPXFile import org.drinkless.td.libcore.telegram.TdApi 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) } @@ -232,7 +233,7 @@ object TelegramUiHelper { private fun gpxToGpxChatItem( helper: TelegramHelper, - gpx: GPXUtilities.GPXFile + gpx: GPXFile ): GpxChatItem? { val user = helper.getUser(gpx.userId) ?: return null val chat = helper.getChat(gpx.chatId) ?: return null @@ -258,7 +259,7 @@ object TelegramUiHelper { private fun gpxToUserGpxChatItem( helper: TelegramHelper, - gpx: GPXUtilities.GPXFile + gpx: GPXFile ): GpxChatItem? { val user = helper.getUser(gpx.userId) ?: return null return GpxChatItem().apply { @@ -323,7 +324,7 @@ object TelegramUiHelper { class GpxChatItem : ListItem() { - var gpxFile: GPXUtilities.GPXFile? = null + var gpxFile: GPXFile? = null internal set var groupPhotoPath: String? = null internal set diff --git a/OsmAnd-telegram/src/net/osmand/telegram/ui/MainActivity.kt b/OsmAnd-telegram/src/net/osmand/telegram/ui/MainActivity.kt index 674dca3eaf..4f5d291c1b 100644 --- a/OsmAnd-telegram/src/net/osmand/telegram/ui/MainActivity.kt +++ b/OsmAnd-telegram/src/net/osmand/telegram/ui/MainActivity.kt @@ -19,7 +19,7 @@ import android.widget.* import net.osmand.PlatformUtil import net.osmand.telegram.R 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.TelegramHelper import net.osmand.telegram.helpers.TelegramHelper.* @@ -293,9 +293,9 @@ class MainActivity : AppCompatActivity(), TelegramListener, ActionButtonsListene } if (app.telegramService == null) { messages.forEach { - val locationMessage = OsmandLocationUtils.parseMessage(it, telegramHelper, LocationMessages.LocationMessage.STATUS_INCOMING) + val locationMessage = OsmandLocationUtils.parseMessage(it, telegramHelper, LocationMessage.STATUS_PREPARED) 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) { if (telegramHelper.getTelegramAuthorizationState() == TelegramHelper.TelegramAuthorizationState.READY) { if (app.isInternetConnectionAvailable) { - app.locationMessages.clearMessages() + // todo - why delete messages on logout? + app.locationMessages.clearOutgoingMessages() settings.clear() telegramHelper.logout() } else { diff --git a/OsmAnd-telegram/src/net/osmand/telegram/ui/MyLocationTabFragment.kt b/OsmAnd-telegram/src/net/osmand/telegram/ui/MyLocationTabFragment.kt index a10603c9b8..aff4f496cf 100644 --- a/OsmAnd-telegram/src/net/osmand/telegram/ui/MyLocationTabFragment.kt +++ b/OsmAnd-telegram/src/net/osmand/telegram/ui/MyLocationTabFragment.kt @@ -716,13 +716,13 @@ class MyLocationTabFragment : Fragment(), TelegramListener { } holder.gpsPointsCollected?.apply { if (shareInfo != null) { - val all = app.locationMessages.getOutgoingMessagesToChat(shareInfo.chatId) + val all = app.locationMessages.getOutgoingMessages(shareInfo.chatId) text = "${all.size}" } } holder.gpsPointsSent?.apply { 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}" } } diff --git a/OsmAnd-telegram/src/net/osmand/telegram/ui/TimelineTabFragment.kt b/OsmAnd-telegram/src/net/osmand/telegram/ui/TimelineTabFragment.kt index 708b430ce6..c4f0bda12e 100644 --- a/OsmAnd-telegram/src/net/osmand/telegram/ui/TimelineTabFragment.kt +++ b/OsmAnd-telegram/src/net/osmand/telegram/ui/TimelineTabFragment.kt @@ -192,6 +192,7 @@ class TimelineTabFragment : Fragment() { val currentUserId = telegramHelper.getCurrentUser()?.id if (currentUserId != null) { 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 { TelegramUiHelper.gpxToChatItem(telegramHelper, it, true)?.also { chatItem -> res.add(chatItem) diff --git a/OsmAnd-telegram/src/net/osmand/telegram/utils/OsmandLocationUtils.kt b/OsmAnd-telegram/src/net/osmand/telegram/utils/OsmandLocationUtils.kt index 9a7fd57edd..c2e62b173d 100644 --- a/OsmAnd-telegram/src/net/osmand/telegram/utils/OsmandLocationUtils.kt +++ b/OsmAnd-telegram/src/net/osmand/telegram/utils/OsmandLocationUtils.kt @@ -3,7 +3,7 @@ package net.osmand.telegram.utils import android.os.AsyncTask import net.osmand.Location 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.TelegramUiHelper import net.osmand.util.GeoPointParserUtil @@ -74,8 +74,8 @@ object OsmandLocationUtils { } } - fun parseMessage(message: TdApi.Message, helper: TelegramHelper, status: Int): LocationMessages.LocationMessage? { - var locationMessage: LocationMessages.LocationMessage? = null + fun parseMessage(message: TdApi.Message, helper: TelegramHelper, status: Int): LocationMessage? { + var locationMessage: LocationMessage? = null val oldContent = message.content val fromBot = helper.isOsmAndBot(message.senderUserId) @@ -106,9 +106,9 @@ object OsmandLocationUtils { } if (parsedMessageContent != null) { - locationMessage = LocationMessages.LocationMessage(helper.getSenderMessageId(message), message.chatId, parsedMessageContent.lat, - parsedMessageContent.lon, parsedMessageContent.altitude, parsedMessageContent.speed, parsedMessageContent.hdop, - parsedMessageContent.bearing, parsedMessageContent.lastUpdated * 1000L, messageType, status, message.id) + locationMessage = LocationMessage(helper.getSenderMessageId(message), message.chatId, parsedMessageContent.lat, + parsedMessageContent.lon, parsedMessageContent.altitude, parsedMessageContent.speed, parsedMessageContent.hdop, + parsedMessageContent.bearing, parsedMessageContent.lastUpdated * 1000L, messageType, status, message.id) } return locationMessage } @@ -117,7 +117,7 @@ object OsmandLocationUtils { 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) } @@ -274,7 +274,7 @@ object OsmandLocationUtils { return 0 } - fun getTextMessageContent(updateId: Int, location: LocationMessages.LocationMessage): TdApi.InputMessageText { + fun getTextMessageContent(updateId: Int, location: LocationMessage): TdApi.InputMessageText { val entities = mutableListOf() val builder = StringBuilder() val locationMessage = formatLocation(location) @@ -313,7 +313,7 @@ object OsmandLocationUtils { return TdApi.InputMessageText(TdApi.FormattedText(textMessage, entities.toTypedArray()), true, true) } - fun convertLocationMessagesToGpxFiles(items: List, newGpxPerChat: Boolean = true): List { + fun convertLocationMessagesToGpxFiles(items: List, newGpxPerChat: Boolean = true): List { val dataTracks = ArrayList() var previousTime: Long = -1